#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, скорее всего, замедлял поток достаточно долго, чтобы предотвратить прерывание чтения файла.