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
}