Как нарисовать игру на Android Canvas с множеством примитивов - PullRequest
4 голосов
/ 27 ноября 2010

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

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

Согласно TraceView, большая часть времени уходит на методы drawLine и drawRectangle, потому что их просто слишком много. Я рисую каждый «пиксель» дисплея с точечной матрицей, и каждый сегмент 7-сегментного дисплея отображается в каждый кадр.

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

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

Увы, мой Canvas мерцал черным, и время от времени, когда менялось состояние моего экрана, на кадре мерцали только пиксели точечного матричного дисплея / сегменты. И я позаботился о том, чтобы не очистить холст.

Я рисую на Canvas внутри SurfaceView, обновляя Thread, как описано в примере Lunar Lander Android. В образце Lunar Lander они перекрашивают все в каждом кадре.

Может быть, я мог бы сделать все для растрового изображения в первом кадре, а затем обновить это растровое изображение для каждого второго кадра?

Какую технику использовать для метода paint ()?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2010

SurfaceHolder.unlockCanvasAndPost () фактически выполняет перелистывание страниц на поверхности, поэтому даже если предыдущий кадр не был очищен, вы получите второй самый старый кадр, а не тот, который вы только что нарисовали.и выполнение lock () на поверхности каждый раз создает новый холст, который, вероятно, выполняет очистку в его конструкторе.

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

, и, как кто-то другой предложил (очень неоднозначно), вы можете генерировать спрайты для отображения с точечной матрицей и рисовать их непосредственно из кэша растровых изображений, а не рисовать с помощьюпримитивные команды.т. е. для точечного матричного калькулятора вы можете сгенерировать все 0-9 в 10 растровых изображений и просто скопировать их на холст, а не вызывать набор операций drawLine / Rect.

, если приведенное выше все еще слишком медленно, все еще естьOpenGL, который использует аппаратное ускорение

0 голосов
/ 27 ноября 2010

Почему бы не пойти на Спрайты ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...