Я рисую множество линий прямоугольников в каждом кадре моей игры - это воссоздание старой электронной портативной игры. Те, которые имели грубую матрицу отображения для основной игры и пользовательские изображения для текста или некоторых изображений.
У меня есть большие «пиксели» размером 20x20 пикселей на экране виртуальной точечной матрицы, я также рисую на экране несколько 7-сегментных дисплеев и некоторые другие вещи.
Согласно TraceView, большая часть времени уходит на методы drawLine и drawRectangle, потому что их просто слишком много. Я рисую каждый «пиксель» дисплея с точечной матрицей, и каждый сегмент 7-сегментного дисплея отображается в каждый кадр.
Мне пришла в голову оптимизация: я буду перекрашивать только те пиксели / сегменты, которые изменились, поэтому я сохранил предыдущее состояние пикселей / сегментов и попытался перерисовать только измененные. По сути, это грубая недействительность.
Поведение, которое я ожидал, состояло в том, что холст останется таким, каким он был после того, как последний кадр закончил рисовать, и я перекрашивал только необходимые вещи.
Увы, мой Canvas мерцал черным, и время от времени, когда менялось состояние моего экрана, на кадре мерцали только пиксели точечного матричного дисплея / сегменты. И я позаботился о том, чтобы не очистить холст.
Я рисую на Canvas внутри SurfaceView, обновляя Thread, как описано в примере Lunar Lander Android. В образце Lunar Lander они перекрашивают все в каждом кадре.
Может быть, я мог бы сделать все для растрового изображения в первом кадре, а затем обновить это растровое изображение для каждого второго кадра?
Какую технику использовать для метода paint ()?