Почему битовые карты с обновленным NDK отображаются черным, когда аппаратное ускорение включено в Honeycomb? - PullRequest
1 голос
/ 08 июня 2011

У меня есть приложение для обработки изображений Android, и я использую собственный код для рисования непосредственно в растровые изображения Java; все работало нормально. Я только что получил планшет Acer A500 и решил попробовать использовать новый атрибут Honeycomb android: hardwareAccelerated. Все растровые изображения отображаются черными, когда они включены. Я использую простой полноэкранный вид с рисованием на холсте. У кого-нибудь есть идеи, как заставить его обновлять текстуру OpenGL, когда я рисую в свои растровые изображения?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2012

Кажется, проблема в том, что Android не обновляет «номер поколения» текстуры, которую он использует за кулисами для растрового изображения, поэтому он не использует новые данные пикселей.У меня была похожая проблема (в моей библиотеке рисования карт, CartoType, которая работает как нативный код на Android), и я решил ее, записав значение 0 в верхний левый пиксель перед получением свежих данных.Вот мой Java-код с пояснительным комментарием:

private void getMap()
    {
    NativeInterface.getMap(iDemoFrameworkRef,iBitmapData);
    iBuffer.rewind();

    /*
    Hack: we have to change the bitmap because the Android hardware-accelerated canvas will not
    re-upload the bitmap unless it has a different generation number,
    and copyPixelsFromBuffer doesn't change the generation number.
    See http://osdir.com/ml/Android-Developers/2011-10/msg02215.html.
    */
    iBitmap.setPixel(0,0,0);

    iBitmap.copyPixelsFromBuffer(iBuffer);  
    }

Эта проблема возникла на Galaxy Nexus с использованием Android 4.0.Код отлично работал на симуляторе, но не на оборудовании, пока я не добавил хак.Тогда все было хорошо.

0 голосов
/ 22 августа 2011

Как сказано в этой статье , данные пикселей для растровых объектов хранятся в байтовых массивах на Android 3.0 (Honeycomb).Ранее он не хранился в куче Dalvik, но хранился во внешней куче, которая не управляется виртуальной машиной Dalvik.

Так что это большая разница между Android 2.x и 3.x.И это может быть небезопасно для рисования в растровое изображение из собственного кода, потому что NDK не предоставляет собственный API для уровней выше 9. В общем случае API должен быть обратно совместимым, но атрибут hardwareAccelerated изменяет поведение нескольких методов и может нарушать совместимость.

Например, следующие операции ведут себя по-разному, когда включено аппаратное ускорение:

  • Canvas
    • clipRect: режимы клипа XOR, Difference и ReverseDifference игнорируются;3D-преобразования не применяются к прямоугольнику клипа
    • drawBitmapMesh: массив цветов игнорируется
    • drawLines: сглаживание не поддерживается
    • setDrawFilter: может быть установлено, но игнорируется
  • Paint
    • setDither: игнорируется
    • setFilterBitmap: фильтрация всегда включена
    • setShadowLayer: работает только с текстом
  • ComposeShader
    • ComposeShader может содержать только шейдеры разных типов (например, BitmapShader и LinearGradientShader, но не два экземпляра BitmapShader)
    • ComposeShader не может содержатьComposeShader

Подробнее об аппаратном ускорении: http://android -developers.blogspot.com / 2011/03 / android-30-hardware-acceleration.html

...