Советы относительно высокой производительности рисования в Android - PullRequest
17 голосов
/ 30 июля 2011

Фон

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

Я хочу, чтобы графики были масштабируемыми и панорамируемыми.

Проблема

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

* Решения 1011 * Использование View.onDraw(Canvas) Использовать высокое разрешение Bitmap Использование OpenGL View.onDraw (): Преимущества Что-то, что легко реализовать 1038 * Недостатки * плохая производительность? (разве это не использует OpenGL, не так ли?) Bitmap: Преимущества Реально просто реализовать Отличная производительность 1054 * Недостатки * Нужно использовать некрасивое масштабирование OpenGL: Преимущества Вероятно, хорошая производительность в зависимости от моей реализации 1068 * Недостатки * Больше работы для реализации Заключительные слова

OpenGL, вероятно, будет профессиональным решением и определенно предложит больше гибкости, но потребует больше работы (насколько неясно).

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

Я не боюсь испачкать руки, но я хочу знать, что я иду в правильном направлении, прежде чем начать копать.

Я пропустил какие-либо решения? Все ли мои решения в здравом уме?


Дополнительные примечания:

Могу добавить, что когда график меняется, я хочу анимировать изменения, это, возможно, будет самой сложной задачей из всех.

1 Ответ

16 голосов
/ 30 июля 2011

Проблема с использованием Views заключается в том, что вы унаследовали от издержек самого инструментария UI.Хотя инструментарий довольно хорошо оптимизирован, то, что он делает, это не обязательно то, что вы хотите.Самым большим недостатком, когда вы хотите управлять своим рисунком, является цикл аннулирования / отрисовки.

Вы можете обойти эту «проблему», используя SurfaceView.SurfaceView позволяет выполнять рендеринг в окно с использованием собственного потока рендеринга, что позволяет обойти накладные расходы UI toolkit.И вы все еще можете использовать Canvas 2D API рендеринга.

Однако Canvas использует программный конвейер рендеринга.Ваша производительность будет в основном зависеть от скорости процессора и доступной пропускной способности.На практике это редко так быстро, как OpenGL.Android 3.0 предлагает новый аппаратный конвейер для Canvas, но только при рендеринге через Views.В настоящее время вы не можете использовать аппаратный конвейер для рендеринга непосредственно в SurfaceView.

Я бы порекомендовал вам сначала попробовать SurfaceView.Если вы пишете свой код правильно (не рисуйте больше, чем нужно, перерисовывайте только то, что изменилось и т. Д.), Вы сможете достичь желаемой производительности.Если это не сработает, используйте OpenGL.

...