Выгрузка буферов вершин в OpenGL - PullRequest
2 голосов
/ 17 апреля 2010

У меня есть живые обои на Android, которые, как я подозреваю, вызывают утечку памяти, возможно, это текстуры или массивы вершин. Я вызываю glDeleteTextures для моих текстурных идентификаторов, но не вижу какого-либо эквивалента для моих вершинных буферов. Я хотел бы быть в состоянии убедиться, что мои текстуры и буферы выгружаются OpenGL, я что-то упустил?

Документы, которые я обнаружил, говорят, что OpenGL просто работает самостоятельно, но это не дает мне большого комфорта.

Ответы [ 4 ]

3 голосов
/ 17 апреля 2010

Vertex Arrays и Vertex Buffers - это две разные вещи, и из вашего вопроса неясно, действительно ли вы используете механизм Vertex Buffer Object (VBO) для предоставления данных вершин в GL, или если вы используете на стороне клиента массивы.

С точки зрения GL, VBO принадлежит GL и требует явного выделения / освобождения. Вот о чем говорит бездомный кот. Вы выделяете память VBO с помощью glBufferData и освобождаете либо с помощью glBufferData, либо удаляя сам объект VBO.

Теперь, если вы не используете VBO, то GL копирует данные, по которым вы передаете его при каждом рисовании , и не считает исходную память своей собственной. В вашем случае это означает пару вещей:

  • исходные данные должны быть удалены клиентом. Поскольку вы используете java, а java - это язык для сбора мусора, шанс, что единственный способ избавиться от этой памяти - это сбор java
  • Реализация GL часто должна сохранять временную копию данных (поскольку во многих случаях GPU не будет работать сразу после рисования). Это полностью зависит от реализации GL, и вы, вероятно, не имеете никакого контроля над этим.
1 голос
/ 17 апреля 2010

Это не просто glDeleteBuffers()?

0 голосов
/ 12 февраля 2018

В OpenGL ES2 или новее сохраняйте расположение буфера как поле в классе:

    int buffers[] = new int[1];

Создание указателя буфера на графическом процессоре:

    glGenBuffers(buffers.length, buffers, 0);

Создать массив вершин и загрузить в память GPU:

    FloatBuffer vertexArray = ByteBuffer
            .allocateDirect ( 4 * vertexData.length ) // 4 bytes per float
            .order ( ByteOrder.nativeOrder ( ) )
            .asFloatBuffer ( ) 
            .put ( vertexData );

    glBufferData ( GL_ARRAY_BUFFER,
            4 * vertexArray.capacity ( ), // bytes per float again
            vertexArray, 
            GL_STATIC_DRAW );

Когда закончите, удалите буферы:

    glDeleteBuffers ( 1 , buffers , 0 );
0 голосов
/ 17 апреля 2010

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

ByteBuffer bufTCDirect;
bufTCDirect = ByteBuffer.allocateDirect( aNumElements * 2 * ( Float.SIZE >> 3 ) );
bufTCDirect.order( ByteOrder.nativeOrder() );

FloatBuffer bufTC;
bufTC = bufTCDirect.asFloatBuffer();

bufTC.clear();
bufTC.put(tcArrayFromFile); // a float[] array loaded from the model file
bufTC.position(0);

Позже все, что я делаю, когда мне говорят, чтобы выгрузить, это:

this.bufTC = null;
this.bufTCDirect = null;

Мне кажется, это правильно, как будто это на стороне клиента, сборщик мусора позаботится обо всем этом?

...