Android: Как долго OpenGL хранит текстуру?

Как долго openGL хранит текстуру?

Используется ли память текстуры, когда вы покидаете действие?

Например, если у меня есть следующий код:

mGL.glGenTextures(1, mTextures, 0);
        mGL.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); // A bound texture is
                                                            // an active texture

        //mGL.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmap.getWidth(),bitmap.getHeight(), 0, GL10.GL_RGBA, GL10.GL_FLOAT, textures);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,GL10.GL_RGBA, bitmap, 0);

        // create nearest filtered texture
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                GL10.GL_LINEAR); // This is where the scaling algorithms are
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                GL10.GL_LINEAR); // This is where the scaling algorithms are
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
                GL10.GL_CLAMP_TO_EDGE);
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
                GL10.GL_CLAMP_TO_EDGE);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

        //bitmap.recycle();
        Log.v("GLSurfaceView", "Loading Texture Finished");
        return mTextures[0];

Какие изменения сделают возвращаемое значение недействительным?

Я не хочу перезагружать все мои текстуры, когда я возвращаюсь в действие (скажем, у человека был телефонный звонок), потому что это действительно замедляет работу.

Обновление:

Обнаружил эту информацию в документации по Renderer, которая подтверждает ответ, данный ниже @svdree:

Потеря контекста EGL Бывают ситуации, когда контекст рендеринга EGL будет утерян. Обычно это происходит, когда устройство выходит из спящего режима. Когда контекст EGL теряется, все ресурсы OpenGL (например, текстуры), связанные с этим контекстом, будут автоматически удалены. Для правильного рендеринга средство рендеринга должно воссоздать все потерянные ресурсы, которые ему все еще нужны. Метод onSurfaceCreated (GL10, EGLConfig) - удобное место для этого.

Это означает, что текстуры связаны с EGL Context

С момента публикации этого вопроса я попытался решить проблему, унаследовав свои действия от базовое действие, имеющее ссылку на настраиваемый GLRenderer. В принципе, я могу передать представление OpenGLSurface View вперед (т.е. заставить его создать его экземпляр в одном действии и использовать его в следующем), но после завершения процедуры выключения он больше не запускается.

Я также обнаружил, что делая ваши действия прозрачными, сохраняет контекст openGL ниже прозрачного действия (что имеет смысл, но помогает только для меню и т.п.). Однако я полагаю, что можно было бы всегда, чтобы каждое действие после действия openGL было немного прозрачным, тем самым сохраняя текстуры в фоновом режиме для всех ваших действий (вероятно, это то, что я буду делать)

6
задан tjb 20 August 2011 в 17:10
поделиться