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

Android: холст против OpenGL

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

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

Это прекрасно работает в этом приложении - пока вы не начнете вращать базовый Bitmap, чтобы компенсировать вращение устройства, поддерживая возможность "увеличивать" на поверхности чертежа и тем самым увеличивать базовый Bitmap и т.д. Например, при повороте устройства и масштабировании чертежа, когда пользователь рисует, нам нужно масштабировать и вращать наш битмап в onDraw(), и это абсолютно сканирование.

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

Ну, этот вопрос задавали 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.