Быстрая загрузка текстур в OpenGL 2.0 - PullRequest
4 голосов
/ 13 декабря 2011

Я строю простые живые обои для Android.Я загружаю необходимую текстуру в OpenGL ES 2.0, используя приведенный ниже код.Я загрузил все мои изображения в один файл размером 2048x2048.Этот код ниже загружает текстуру от 900 до 1200 мсЭто нормальное время или я делаю что-то не так, чтобы сделать это медленно?

Я также пытаюсь очистить список текстур в Opengl каждый раз, когда onSurfaceCreated вызывается в моем рендерере.Правильно ли это сделать, или есть способ простой проверки, если ранее загруженная текстура уже находится в памяти и, если да, то избегать очистки и перезагрузки?Пожалуйста, дайте мне знать ваши комментарии по этому вопросу.Спасибо.

Также при изменении ориентации экрана вызывается OnSurfaceCreated.Таким образом, загрузка текстуры происходит снова.Это не очень хорошая идея.Что обходится?

public int addTexture(Bitmap texture) {

    int bitmapFormat = texture.getConfig() == Config.ARGB_8888 ? GLES20.GL_RGBA : GLES20.GL_RGB;

    int[] textures = new int[1];
    GLES20.glGenTextures(1, textures, 0);
    int textureId = textures[0];
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmapFormat, texture, 0);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
    return textureId;
}

1 Ответ

3 голосов
/ 13 декабря 2011

Несколько способов улучшить производительность.

  1. Не загружайте текстуру каждый раз, когда вызывается onSurfaceChanged.Инициализируйте ваш textureId до -1 (в конструкторе / surfaceCreated вашего средства визуализации) и проверьте в начале onSurfaceChanged, есть ли у вас другой идентификатор.Когда вы позвоните glGenTextures, вы получите положительный номер.
  2. Вам нужны Mipmaps?Это может быть ключевым моментом вашего метода здесь.Попробуй без строки GLES20.glGenerateMipMap(GLES20.GL_TEXTURE_2D);
  3. 2048x2048 огромно.Особенно для текстур.Вам действительно нужно так много деталей?Возможно, достаточно 1024x1024.
  4. Избегайте RGB_888, используйте вместо этого RGB_565: вы получите почти такое же визуальное качество за половину размера.
...