FloatBuffer занимает все больше оперативной памяти - PullRequest
0 голосов
/ 13 февраля 2019

Когда я использую FloatBuffers, они занимают все больше и больше памяти с течением времени.Я использую плавающий буфер, чтобы поместить в него матрицу преобразования, а затем загружаю ее в шейдер.Поэтому я вызываю метод, который создает буфер с плавающей запятой, каждый кадр.

private static FloatBuffer matrixBuffer;

public void uploadUniformMatrix4f(String name, Matrix4f matrix4f)
{
    // Create a float buffer and put the matrix in it
    matrixBuffer = BufferUtils.createFloatBuffer(16);
    matrix4f.get(matrixBuffer);


    // Upload the float buffer as a matrix
    GL20.glUniformMatrix4fv(getUniformLocation(name), false, matrixBuffer);
}

Я уже пробовал memFree(matrixBuffer); и matrixBuffer.clear();, но ничего не получалось.

The first four slots are getting higher and higher

1 Ответ

0 голосов
/ 13 февраля 2019

BufferUtils.createFloatBuffer (16) создает новый буфер каждый раз, когда вы его вызываете, вне кучи JVM.Т.е. сборщик мусора java имеет ссылку только на объект ByteBuffer, а не на данные в отличие от float[] data = new float[16];, поэтому GC будет очищать собственную память в тот момент, когда ему необходимо очистить кучу JVM.

Подход BufferUtils не рекомендуется lwjgl .

Версии LWJGL до 3 полагались исключительно на allocateDirect () через класс org.lwjgl.BufferUtils.Этот класс все еще существует в 3 для обратной совместимости, но его использование крайне не рекомендуется.Причина проста, allocateDirect () ужасен:

Вы можете использовать следующий подход для эффективной передачи матриц OpenGL.

import static org.lwjgl.opengl.GL20.glUniformMatrix4fv;
......
try (MemoryStack stack = MemoryStack.stackPush()) {

   final FloatBuffer matrixBuffer = stack.mallocFloat(16);
   // if you have more matrices like mvp, model, view, projection, normal
   // you don't have to create new memory stack for them
   // simply call stack.mallocFloat(16) as many times as you need  
   matrix4f.get(matrixBuffer);

   glUniformMatrix4fv(getUniformLocation(name), false, matrixBuffer);
   // call OpenGL shader program code here. 
   // When this try block ends - matrixBuffer native memory will be invalid. And OpenGL will crash when accessing the uniform memory already freed   
}
...