Android рисует текстуру с помощью OpenGL ES 2.0 медленно на некоторых устройствах

В моем приложении для Android 4.3 я хотел бы загрузить текстуру из локального png в TextureView. Я не знаю OpenGL, и я использую код из теста аппаратного ускорения GLTextureActivity. Я также вставляю здесь часть текстуры загрузки:

    private int loadTexture(int resource) {
        int[] textures = new int[1];

        glActiveTexture(GL_TEXTURE0);
        glGenTextures(1, textures, 0);
        checkGlError();

        int texture = textures[0];
        glBindTexture(GL_TEXTURE_2D, texture);
        checkGlError();

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

        Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource);

        GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
        checkGlError();

        bitmap.recycle();

        return texture;
    }

Я запускаю код на двух устройствах: Nexus 7 и Galaxy Nexus phone, и я замечаю огромную разницу в скорости между ними. Для Nexus 7 на рисование уходит около 170 мс, а для Galaxy Nexus - 459 мс. Наиболее трудоемкой операцией является загрузка текстуры и особенно texImage2D вызов. Я читал, что есть устройства с чипами, которые медленно texImage2D - texSubImage2D функции, но как кто-то может сказать, что это за устройства и как можно избежать использования этих функций для достижения того же результата?

Заранее спасибо.

// РЕДАКТИРОВАТЬ: glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) вызов, кажется, также значительно медленнее в устройстве телефона. Почему это происходит? Как я мог избежать этого?

1 ответ

Решение

Вы загружаете текстуры на каждом кадре перерисовки? Это просто не правильно - вы должны загружать текстуры только один раз перед основным циклом рендеринга. Вы не получите мгновенную загрузку текстур даже на самом быстром устройстве - вы загружаете ресурс, декодируете из него растровое изображение и затем загружаете его в графический процессор. Это займет некоторое время.

Другие вопросы по тегам