Android: Canvas против OpenGL - PullRequest
14 голосов
/ 10 июня 2011

У меня есть приложение для рисования, в котором пользователь может рисовать линии пальцем, настраивать цвет, толщину и т. Д. Когда пользователь рисует, я преобразую массированные точки X / Y из MotionEvent в SVG.Paths , а также создание Android Path , а затем рисование Android Path на экран с помощью Canvas и фиксация SVG Path в базе данных приложения.

Я следую замодель, используемая в FingerPaint , в которой линии «в процессе» рисуются на лету повторными вызовами invalidate() (и, таким образом, onDraw()), а после завершения линии и новой строкипредыдущая строка (и) отрисовывается в onDraw() из базового Canvas Bitmap, причем текущие линии снова генерируют повторные перерисовки.

В этом приложении это прекрасно работает - доВы начинаете вращать базовый Bitmap, чтобы компенсировать вращение устройства, поддерживая возможность «увеличения» на поверхности рисования и, таким образом, масштабируя базовый Bitmap и т. д. Так, например, wКогда устройство поворачивается и чертеж масштабируется, когда пользователь рисует, нам нужно масштабировать И вращать растровое изображение в onDraw (), и это абсолютно сканируется.

Я смотрел на SurfaceView, но так как он все еще использует тот же механизм Canvas, я не уверен, что увижу заметное улучшение ... поэтому мои мысли переключаются на OpenGL.Я где-то читал, что OpenGL может выполнять ротацию и масштабирование по существу «бесплатно», и даже видел слухи (третий комментарий), что Canvas может исчезнуть в будущих версиях.

По существу,Я немного застрял между решениями Canvas и OpenGL ... У меня есть приложение для 2D-рисования, которое, кажется, идеально подходит для модели Canvas, когда находится в одном состоянии, так как нет постоянных повторных прорисовок, как в игре(например, когда пользователь не рисует, мне не нужно перерисовывать), но когда пользователь рисует, мне нужна максимальная производительность, необходимая для выполнения некоторых все более сложных вещей с поверхностью ...

Приветствуются любые мысли, указатели и предложения.

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

OpenGL сможет легко справляться с поворотами и масштабированием.

Честно говоря, вам, вероятно, нужно было бы изучить много OpenGL, чтобы сделать это, особенно связанные с темами:

  • Геометрия
  • Освещение (или просто отключение)
  • Комплектование (выбор геометрии для рисования на нем)
  • Пиксельные карты
  • Отображение текстур
  • Мипмаппинг

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

Вместо этого я бы рекомендовал использовать графические компоненты игровой библиотеки, построенной на основе openGL, такие как:

2 голосов
/ 19 июня 2017

Ну, этот вопрос был задан 6 лет назад.Может Android 4.0 не подошел?На самом деле, после Android 4.0 Canvas на android.view.View является аппаратно-ускоренным холстом, что означает, что он реализован OpenGL, поэтому вам не нужно использовать другой способ для повышения производительности.

Вы можете увидеть https://github.com/ChillingVan/android-openGL-canvas/blob/master/canvasglsample/src/main/java/com/chillingvan/canvasglsample/comparePerformance/ComparePerformanceActivity.java для сравнения производительности обычного холста в представлении с GLSurfaceView.

1 голос
/ 10 июня 2011

Вы правы, что SurfaceView использует Canvas под капотом. Основное отличие состоит в том, что SurfaceView использует другой поток для выполнения фактического рисования, что обычно повышает производительность. Похоже, это не очень поможет вам.

Вы правы в том, что OpenGL может выполнять ротацию очень быстро, поэтому, если вам нужно больше производительности, это путь. Вы, вероятно, должны использовать GLSurfaceView. Основным недостатком использования OpenGL является то, что делать текст очень сложно. В основном вы должны (хорошо, не обязательно, но, кажется, лучший вариант) визуализировать растровые изображения текста.

...