GL_OUT_OF_MEMORY после вызова glDrawArrays.Зачем? - PullRequest
6 голосов
/ 09 июня 2011

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

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();

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

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 30 апреля 2013

Я только что узнал, что GL_OUT_OF_MEMORY можно установить, если сначала передать NULL-указатель в glVertexAttribPointer.

Нет ошибок перед drawArrays, GL_OUT_OF_MEMORY после. (протестировано на Galaxy S2 4.1.2, GLES2) Может быть, это то, что происходит по какой-то причине через некоторое время в вашей программе?

это заняло у меня целую вечность, чтобы найти ... TODO: больше юнит-тестов:)

2 голосов
/ 27 января 2014

Я обнаружил, что glDrawArrays() устанавливает GL_OUT_OF_MEMORY, когда glVertexAttribPointer() вызывается с ненулевым указателем. Это оказалось потому, что другой бит кода вызвал glBindBuffer() для использования объекта массива вершин, но затем не освободил буфер. Звонок на номер glBindBuffer(GL_ARRAY_BUFFER, 0) решил проблему.

2 голосов
/ 11 июля 2011

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

Действительно трудно сказать, но из того, что я узнал, эта ошибка возникает, когда у вас слишком много многоугольников в памяти, или, по крайней мере, одни и те же вершины определяются n раз. Так как вы сказали, что у вас сложная сцена; эта проблема вероятно проблема с памятью.

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

1 голос
/ 28 августа 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...