Подтвердить что ты не робот

Советы по высокопроизводительному графику в Android

Фон

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

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

Проблема

Я хочу, чтобы опыт был плавным, оставив небольшой след процессора.

Решение

View.onDraw():

Преимущества

  • Некоторые, что легко реализовать

Недостатки

  • Плохая производительность? (если он не использует OpenGL, не так ли?)

Bitmap:

Преимущества

  • Действительно легко реализовать
  • Отличная производительность

Недостатки

  • Нужно использовать масштабирование, которое является уродливым

OpenGL

Преимущества

  • Вероятно хорошая производительность в зависимости от моей реализации

Недостатки

  • Дополнительная работа по реализации

Заключительные слова

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

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

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

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


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

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

4b9b3361

Ответ 1

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

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

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

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