FloatBuffer占用越来越多的RAM

时间:2019-02-13 17:05:51

标签: java opengl lwjgl

当我使用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 :(得分: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   
}