Проблема производительности Canvas / Bitmap и альфа-смешивания в Honeycomb (TF101) - PullRequest
1 голос
/ 04 сентября 2011

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

canvas.drawBitmap(bmBackground, 0,0, null);                     
canvas.drawBitmap(bmForeground, 0, 0, p);

Приведенный выше код отображается с использованием хорошо известной пары SurfaceView / Thread. bmBackground - RGB_565, bmForeground - изменяемый ARGB_8888, краска p - для игры только с альфой. Обе растровые изображения являются полноэкранными.

Как на Nexus S, так и на Galaxy S (Gingerbread) рендеринг выполняется со скоростью 55 кадров в секунду независимо от значения альфа-канала, установленного для p, и любого формата пикселя для bmForeground (RGB_565 или ARGB_8888).

Но на моем сотовом планшете у меня странное поведение:

  • 60 кадров в секунду с отключенной альфа (= 0)
  • 10 кадров в секунду с 0 <альфа <255 </li>
  • 20 кадров в секунду с p = null
  • 60 кадров в секунду с bmForeground = RGB_565

Кажется, что драйвер имеет некоторые проблемы с производительностью при использовании альфа-смешения и / или преобразования из ARGB (Bitmap) в RGB (framebuffer)?

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

Было бы здорово, если бы двухъядерное устройство с тактовой частотой 1 ГГц не могло работать лучше, чем мой Galaxy S, рисующий 2 растровых изображения! Я что-то упустил?

1 Ответ

1 голос
/ 04 сентября 2011

Нет проблем с драйверами, рендеринг с Canvas на SurfaceView выполняется полностью программно. Наличие 2 ядер или даже 1 ГГц не обязательно помогает, для битовых карт большую часть времени имеет значение пропускная способность памяти, и Galaxy S действительно хорош в этом.

Вы также предполагаете, что ваш кадровый буфер является RGB, но вы не указываете, какой RGB (RGBX 8888 или RGB565?) Как вы создаете свой SurfaceView? Очень важно минимизировать конверсии (если ваш SurfaceView - RGBX 8888, не используйте растровые изображения RGB 565, если ваша поверхность - RGB 565, избегайте использования растровых изображений RGBA 8888 и т. Д.)

Вы также не упоминаете, насколько велики ваши растровые изображения? Если оба ваших растровых изображения являются полноэкранными растровыми изображениями, производительность, которую вы получаете, не является неожиданной, если ваш планшет имеет ту же архитектуру, что и Motorola Xoom (на базе Tegra2.)

...