Низкая производительность Android Canvas.drawBitmap - переключиться на OpenGL? - PullRequest
8 голосов
/ 15 июля 2011

Я портирую 2D-игру с Windows Phone 7 (разработанную в XNA 4.0) на Android.Я использую лот вызовов Canvas.drawBitmap () - около 200-300 на обновление кадра - с разными Paints для каждого вызова для обработки различной прозрачности и колоризации во время отрисовки,Это управление системами частиц и различными другими наложениями и внутриигровыми эффектами, а также плиточным фоном и внутриигровыми спрайтами.Я не делаю изменения размера или поворота по требованию, это простые прямоугольники src-> dest одинакового размера.

В WP7 это работает со скоростью 30 + fps, но я изо всех сил пытаюсь получить 12fps в моем тестеаппаратное обеспечение дроида (Samsung Galaxy S).Это делает игру неиграбельной.Профилировав код, я подтвердил, что все мое время теряется в Canvas.drawBitmap ()

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

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

Ответы [ 2 ]

7 голосов
/ 15 июля 2011

Это нормально.Canvas удивительно медленный при использовании прозрачности (например, ARGB_8888).

2 варианта:

  • Переключение на OpenGL ES
  • Использование наименьшей прозрачности на ваших растровых изображениях(т.е. используйте RGB_565 как можно больше).
1 голос
/ 29 ноября 2011

Возможно, это будет работать лучше на Android 3+, так как он использует аппаратное ускорение для операций с холстом.

...