Нечеткость в нарисованных кадрах (используя холст) - PullRequest
0 голосов
/ 16 июня 2011

Я увлекаюсь написанием 2D-игры и наткнулся на определенную проблему.Моя игра основана на плитке (около 12x9 плиток), в целом все хорошо, но время от времени, когда персонаж перемещается, рамка становится размытой и появляются черные сегменты.

Мой фон основан на плитке, и я думаю, что этовызвано их неправильным размещением.По моему мнению, это происходит потому, что у меня есть нить обновления и нить рисования, которые работают с одинаковыми переменными, например:

private int x, y;
public void update() {x++; y += 2;}
public void draw(Canvas canvas) {canvas.drawBitmap(someImage, x, y);}

(Примечание: я только что это придумал, так что это будет немноголегче понять, о чем я говорю.)

И в результате между некоторыми из плиток, которые обновляются во время рисования, есть (черные) промежутки.

Если я действительно прав,Я думаю, мне нужно решить проблему критического сечения.Поэтому я попытался просто взаимно закрепить данные, синхронизируя потоки и заставляя их работать последовательно.Результат был действительно печальным: он был ДЕЙСТВИТЕЛЬНО медленным на моей galaxy S, абсолютно неиграбельным!

Моя другая идея (которую я действительно не хочу делать) - добавить класс «drawAction» к каждому рисуемому объекту вигра, которая сохранит «снимок» своего объекта, и только эта коллекция «снимков» будет мьютексирована, поэтому я могу позволить потоку рисования выполнять свою работу без прерывания потоком обновления.

Пожалуйста, поделитесьсо мной твои идеи.Я надеюсь, что у вас есть лучшие решения или, если я ошибаюсь, возможно, вы поможете мне найти источник.

Редактировать: Моя игра в целом работает нормально, но на медленных устройствах (таких как эмулятор)помехи более заметны.Когда персонаж игрока не двигается, он тонет и почти всегда во время ходьбы.Я предпочитаю использовать только мой код, поэтому я хотел бы решить эту проблему, а не просто обойти, как с помощью какого-то движка или фреймворка.

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Это не дает прямого ответа на ваш вопрос, но все равно должно помочь.Рассмотрите возможность использования игрового движка AndEngine .Для 2D-игр на основе плитки это глупо гладко и действительно легко для изучения.

0 голосов
/ 09 июля 2011

Проблема: я получил поток «написание» и «чтение», который использовал источник / назначение дам.

Я решил свою проблему, создав «моментальный снимок» или «тень» (технически копию ...) моих общих данных прямо перед чтением и удерживая при этом три записи, поэтому некоторые из прочитанных данных были « старый "но право на ту же дату с остальными. Черными вещами, которые я видел, было различие в чертеже (x, y), вызванное обновлением данных при рисовании.

...