Вызвана ли искаженная графика AndEngine / GL Android Nougat или ошибкой в AVD?

#android-studio #opengl-es #andengine #avd

#android-studio #opengl-es #andengine #android-virtual-device

Вопрос:

Я получаю некоторое сбоящее графическое поведение при запуске моего приложения на базе AndEngine на AVDs с изображением Android 7.0 (Nougat) в Android Studio 2.2.2. Результат нормальный, когда я использую Android 6 (ссылка), но он переведен, увеличен и обернут в x-dimension с искаженными цветами, когда я использую Android 7 (ссылка).

Был ли у кого-нибудь опыт с этим типом искажения графики? Может ли это быть вызвано тем, что Android 7.0 не совместим с чем-либо в AndEngine / OpenGL, или проблемой с изображением Nougat в AVD Android Studio?

Минимальное приложение, которое я использовал для воссоздания поведения, использует AndEngine (GLES2-AnchorCenter) для отображения спрайта на главной сцене. Я тестировал его с несколькими AVD, и он постоянно глючит с Nougat, независимо от устройства.

 public class MainActivity extends SimpleLayoutGameActivity {
    private static int CAMERA_WIDTH = 480;
    private static int CAMERA_HEIGHT = 800;
    private Scene mScene;
    private ITextureRegion myTexture;

    @Override
    protected int getLayoutID() {
        return R.layout.activity_main;
    }

    @Override
    protected int getRenderSurfaceViewID() {
        return R.id.gameview;
    }

    @Override
    public void onCreate(Bundle pSavedInstanceState) {
        super.onCreate(pSavedInstanceState);
    }

    @Override
    public Engine onCreateEngine(EngineOptions pEngineOptions) {
        return new Engine(pEngineOptions);
    }

    @Override
    public EngineOptions onCreateEngineOptions() {
        ScreenOrientation orientation = ScreenOrientation.PORTRAIT_FIXED;
        EngineOptions en = new EngineOptions(true, orientation,
                new FillResolutionPolicy(), new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT));
        return en;
    }

    @Override
    public synchronized void onPauseGame() {
        super.onPauseGame();
    }

    @Override
    public synchronized void onResumeGame() {
        super.onResumeGame();
    }
    @Override
    protected void onCreateResources() {

        BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");

        final BuildableBitmapTextureAtlas gameTextureAtlasBIPMA2  = new BuildableBitmapTextureAtlas(this.getTextureManager(),
                136, 136, BitmapTextureFormat.RGBA_4444, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
        myTexture = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
                gameTextureAtlasBIPMA2, this.getAssets(), "redbomb.png");
        try {
            gameTextureAtlasBIPMA2.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(2, 0, 2));
            gameTextureAtlasBIPMA2.load();
        } catch (Exception e) {
            throw new RuntimeException("Error loading BIPMA2", e);
        }
    }

    @Override
    protected Scene onCreateScene() {
        this.mScene = new Scene();

        // Add a sprite
        float diameter = CAMERA_WIDTH/1.5f;
        this.mScene.attachChild(new Sprite(CAMERA_WIDTH/2f, CAMERA_HEIGHT/2f,
                diameter, myTexture.getHeight() * diameter / myTexture.getWidth(),
                myTexture, getVertexBufferObjectManager()));

        return this.mScene;
    }
}
  

ОБНОВЛЕНИЕ: я выделил причину использования RGBA_4444 в качестве формата текстурных пикселей; при изменении на RGBA_8888 графика становится нормальной. Тем не менее, если кто-нибудь знает, как это исправить, чтобы я мог использовать RGBA_4444…

Комментарии:

1. Я понятия не имею, что могло вызвать эту проблему с рендерингом. Это немного похоже на проблемы, когда у меня было разрешение с 16-битным цветом, но часть графического драйвера решила прочитать его как 32-битный буфер. Но есть огромная разница, так что это не совсем та проблема. Вы можете попробовать отладить проблему с помощью gltracer / debugger (например: developer.android.com/studio/profile/gltracer.html ). Если вы сравните GL trace, вы, возможно, сможете заметить, где ошибка. Также неплохо проверить, имеют ли разные устройства Android одинаковый драйвер GL. Многие устройства имеют одинаковый дизайн графического процессора. (возможна ошибка драйвера)

2. Спасибо, Паули. Похоже, что GL tracer от Studio работает не на виртуальных устройствах, а только на реальных. Однако я нашел проблему, и вы были действительно близки к ней, вопрос заключался в количестве битов для RGBA.

3. Виртуальные устройства пересылают команды GL в драйвер вашего рабочего стола. Вы могли бы попробовать использовать GL tracer для всего виртуального устройства. Очень жаль, что это будет включать незначительный дополнительный шум от surfaceflinger. Это должно обеспечить достаточную трассировку спуска, чтобы увидеть, какие настройки загрузки текстур Android выдает неправильно при перенаправлении вызовов GL на ваш рабочий стол. Это может быть формат текстуры или ошибка настройки GL_UNPACK.