Android GameLoop с использованием SurfaceView; быстрое изменение результатов «снимков» с камеры на черные вспышки и т. д. - PullRequest
1 голос
/ 12 февраля 2011

Я создал простой игровой движок с использованием SurfaceView.

Я использую RectF в качестве окна «камеры», чтобы представить масштабированную ширину пикселя и высоту холста SurfaceView и выяснить, что на экране.

Я использую canvas.translate для перемещения туда, куда камера «указывает».Вот цикл рисования:

mCamera.UpdateCamera();
scaleWorld(c, mCamera);
c.translate(-mScreen.left, mScreen.top - miHeight
* (1 / mCamera.getScaleLevel()));
drawBehavior.drawGame(c);

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

Однако, если я сразу же изменю то, что видит камера, возможно, на расстоянии 3 или более «экранов», часто, но не всегда, вспыхивают черные цвета.Иногда мне везет, и переход происходит незаметно.

Эти вспышки обычно находятся в позициях моих растровых изображений, когда я рекурсивно рисую землю и фон, используя одну или две растровые изображения.

Мне показалось, что внезапное изменение было проблемой, поэтомуЯ попытался очистить поток gameLoop, чтобы остановить все, затем установить новые координаты Rect, затем перезапустить с другим потоком, но это не работает.

Полагаю, что при отражении я просто задерживал «шок»для системы, делая это, а не обрабатывая ее.

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

1 Ответ

1 голос
/ 06 мая 2011

Я предполагаю, что экран обновляется до завершения розыгрыша.Многопоточность все еще немного теряет меня, но есть кое-что попробовать: попробуйте заблокировать холст в начале игрового цикла и разблокировать его в конце: http://developer.android.com/reference/android/view/SurfaceHolder.html#lockCanvas()

...