Я настраиваю игровой цикл. Цикл настроен на обновление со скоростью 50 кадров в секунду. В настоящее время единственное действие, которое делает приложение, — это рисование координат экрана в ответ на сенсорные события. Первоначально я настроил функцию отрисовки только для отрисовки новых событий касания. Это заставило текст мигать. Несколько событий касания мигают в разное время, что наводит меня на мысль, что Canvas использует несколько страниц за кулисами. Чтобы обойти это, я составил список всех произошедших событий касания и при каждом вызове отрисовки перерисовывал весь список.
Пожалуйста, поправьте меня, если я ошибаюсь, вызовы lockCanvas()/unlockCanvasAndPost() по сути являются свопом обратного буфера. Чтение документации по блокировке и разблокировке звучит так, будто необходимо перерисовывать всю сцену между вызовами, если только вы не используете lockCanvas(Rect dirty). В этом случае область грязного прямоугольника необходимо перерисовать, а внешнюю область сохранить.
Содержимое поверхности никогда не сохраняется между unlockCanvas() и lockCanvas(), по этой причине каждый пиксель в области поверхности должен быть записан. Единственное исключение из этого правила — когда указан грязный прямоугольник, в этом случае не грязные пиксели будут сохранены.
Я знаю, это звучит так, как будто я ответил на свой вопрос, но, согласно документации, Surface никогда не сохраняется между вызовами. Однако это не объясняет поведение моей первой реализации, когда я нажимал на экран, и текст начинал мигать. Поскольку я нарисовал текст только один раз, это будет означать, что мерцание происходит из-за переключения на «бэкбуфер», который не получил вызов drawText(), и исходную поверхность, которая не была уничтожена, но, возможно, это следует учитывать ненадежный.
Итак, вопрос: нужно ли мне перерисовывать все объекты при каждом вызове отрисовки? И если да, нужно ли мне «очищать» холст или, по крайней мере, перерисовывать фоновое изображение?