当我使用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();
,但没有任何效果。
答案 0 :(得分:2)
BufferUtils.createFloatBuffer(16)都会在JVM堆之外创建新缓冲区。即Java垃圾收集器仅引用ByteBuffer对象,而不是像float[] data = new float[16];
那样引用其数据,因此GC将在需要清除JVM堆时清除本机内存。
lwjgl不推荐使用BufferUtils方法。
3之前的LWJGL版本仅通过以下方式依赖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
}