Буферизация Android OpenGL и glFlush

#android #opengl-es

#Android #opengl-es

Вопрос:

Итак, я создаю приложение для Android 2.2, которое использует GLSurfaceView. Мой вопрос в том, поскольку OpenGL имеет тенденцию буферизовать команды, означает ли это, что ему требуется связанная память (например, растровое изображение в вызове glTexSubImage2D () ), чтобы оставаться до тех пор, пока это не будет сделано? Или он сам создает копию любой памяти, необходимой для буферизованных команд?

Я спрашиваю, поскольку этот код имеет тенденцию вызывать длительную остановку и возможный сбой на оборудовании (HTC Desrire), но не на эмуляторе:

 //bm is a Bitmap stored in a vector from previous commands
//pt is a Point stored at the same time
GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, pt.x, pt.y, bm); 
bm.recycle();
  

Теперь, если я добавлю glFlush () вот так:

 //bm is a Bitmap stored in a vector from previous commands
//pt is a Point stored at the same time
GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, pt.x, pt.y, bm); 
**AGL.glFlush();** //or glFinish
bm.recycle();
  

Похоже, это отлично работает. Теперь это реальная функциональность для glFlush / glFinish, чтобы предотвратить удаление памяти из-под OpenGL?

Ответ №1:

Хороший вопрос. С текстурами и объектами Vertex Buffer между прочим, после того, как вы вызвали методы, которые фактически загружают данные изображения для текстуры, вам не нужно сохранять буфер / массив, который у вас есть в памяти клиента.

Не путайте буфер рендеринга с памятью, связанной с текстурами. Графические текстуры сохраняются в памяти для графического процессора, они не являются частью буфера, который сбрасывается для окончательной прорисовки.

Комментарии:

1. Я выяснил, в чем заключалась реальная проблема, и она связана с некоторыми функциями чтения файлов Java, которые не работают так, как я ожидал. Я непреднамеренно использовал функцию, которая считывала бы в n байтах, но может вернуться раньше, если ее прервать (чего я не ожидал). Когда я переключился на использование RandomAccessFile.read() вместо этого, это устранило проблему. Вызов glFlush, скорее всего, замедлял поток достаточно долго, чтобы предотвратить прерывание чтения файла.