GL_OUT_OF_MEMORY после вызова glDrawArrays. Почему?

У меня ситуация довольно странная. Я постараюсь предоставить достаточно подробностей, чтобы кто-нибудь умнее меня мог это объяснить. В основном вот настройка:

OS: Android 2.2 Froyo
Device: SGS Vibrant
Application: OpenGL-ES 1.1

И вот проблема: я могу успешно визуализировать довольно сложную сцену, и она может работать бесконечно в течение нескольких часов без утечки памяти. Dalvikvm появляется в logcat каждые 3-5 минут, и не было бы никаких проблем, если бы я не попытался выйти из приложения и запустить его снова. Фактически я могу перезапустить свое приложение 2 раза, но в третий раз я получаю GL_OUT_OF_MEMORY .

Я отследил ошибку вплоть до вызова gl.glDrawArrays () . Я могу подтвердить, что gl.glGetError () возвращает 0 до рассматриваемого вызова DrawArrays, и он вернет 1285 (GL_OUT_OF_MEMORY) после вызова DrawArrays.

Естественно, я думал, что я не очищать ресурсы и не освобождать контекст OpenGL. Вот что я делаю, когда приложение закрывается.

for(int x=0; x<buffers.length; x++){
   if(gl.glIsBuffer(buffers[x])){
      gl.glDeleteBuffers(1, buffers, x);
      buffers[x]=0;
   }
}
for(int y=0; y<textures.length; y++){
   if(gl.glIsTexture(textures[y])){
      gl.glDeleteTextures(1, textures, y);
      textures[y]=0;
   }
}
System.out.println("ERROR: "+gl.glGetError());
finish();

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

Вот краткое описание того, что происходит во время третьего запуска:

  1. Объекты 1-56 проходят соответствующие вызовы gl.glDrawArrays () , как горячие ножи сквозь масло. Ошибок не генерируется.

  2. Объекты 57-64 генерируют ошибку GL_OUT_OF_MEMORY . Объекты визуализируются, но текстура черная.

Я более чем уверен, что удаляю все буферы и текстуры при завершении работы приложения. Я также уверен, что эта ошибка характерна не только для одной 3D-модели, поскольку я пытался пропустить модель № 57, но затем № 58 по-прежнему будет получать эту ошибку.

Пожалуйста, помогите, так как у меня заканчиваются идеи!

6
задан genpfault 9 June 2011 в 15:22
поделиться