Улучшить производительность пользовательского представления на основе SurfaceView? - PullRequest
7 голосов
/ 14 февраля 2011

Я написал простое приложение для Android, которое рисует лабиринт, используя пользовательский вид, полученный из SurfaceView.Он следует модели примера приложения LunarLander и выполняет все вычисления и рисование, используя фоновый поток непосредственно в объекте SurfaceHolder.

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

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

Тогда я хочу использовать SurfaceView, но будьте более разборчивы в том, что будет нарисовано.Это возможно?Если нет, каковы альтернативы?Как насчет сохранения закадрового растрового изображения и выборочного рисования в этом первом?

РЕДАКТИРОВАТЬ: я реализовал закадровую комбинацию Bitmap и Canvas, записанную моим конечным автоматом, управляемым таймером, рисуя только те затронутые областиво время резьбы / раствор.Затем я просто рисую весь закадровый рисунок на SurfaceView в методе run(), и это решило мою проблему;Я могу уменьшить размер ячейки до 5 пикселей, и производительность в порядке.

1 Ответ

5 голосов
/ 14 февраля 2011

О проблемах двойной буферизации:

Взгляните на этот урок.Видите ли вы разницу в том, как вы справляетесь с рисованием?https://web.archive.org/web/20121109162356/http://www.droidnova.com/playing-with-graphics-in-android-part-iii,176.html

Об оптимизации вашего чертежа:

Следующая ссылка объясняет некоторые подходы:

http://developer.android.com/guide/topics/graphics/opengl.html

http://developer.android.com/reference/android/opengl/GLSurfaceView.html

Непрерывный рендеринг в сравнении с рендерингом при загрязнении

Большинство 3D-приложений, таких как игры или симуляции, постоянно анимируются.Но некоторые 3D-приложения более реактивны: они пассивно ждут, пока пользователь что-то сделает, а затем реагируют на это.Для приложений такого типа стандартное поведение GLSurfaceView по непрерывному перерисовыванию экрана - пустая трата времени.Если вы разрабатываете реактивное приложение, вы можете вызвать GLSurfaceView.setRenderMode (RENDERMODE_WHEN_DIRTY), который отключает непрерывную анимацию.Затем вы вызываете GLSurfaceView.requestRender () всякий раз, когда хотите выполнить рендеринг.

Кроме того, в 2D-играх особенно легко вычислить то, что видит пользователь, поэтому воздержитесь от рисования объектов извидимая сцена.

Одна заключительная нота:

Вы сказали

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

Означает ли это, что вы вычисляете решение лабиринта?Если это так, вы не должны делать это в той же ветке, где вы рисуете.Вы должны решить это в другой ветке.(Возможно, я вас неправильно понял)

...