Как долго 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 было немного прозрачным, тем самым сохраняя текстуры в фоновом режиме для всех ваших действий (вероятно, это то, что я буду делать)