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