Java LWJGL 2.9.0 GL20.glUniformMatrix4会导致随机口吃

Java LWJGL 2.9.0 GL20.glUniformMatrix4会导致随机口吃,java,performance,lwjgl,opengl-3,Java,Performance,Lwjgl,Opengl 3,我在一个单独的线程中以60FPS(16ms)的速度运行渲染器 下面的代码产生随机的口吃 long testTime = System.nanoTime(); GL20.glUniformMatrix4( GL20.glGetUniformLocation(getProgram(), "projectionMatrix"), false, matrix4fBuffer // holds projection matrix ); testTime = System.nanoT

我在一个单独的线程中以60FPS(16ms)的速度运行渲染器

下面的代码产生随机的口吃

long testTime = System.nanoTime();
GL20.glUniformMatrix4(
    GL20.glGetUniformLocation(getProgram(), "projectionMatrix"),
    false,
    matrix4fBuffer // holds projection matrix
);
testTime = System.nanoTime() - testTime;
if (testTime > 1000000) {
    System.out.println("DELAY " + (testTime / 1000000) ); // 22-30ms
}
GL20.glUniformMatrix4随机调用大约需要22-30毫秒(每10秒、30秒、45秒…),这会导致随机减速(口吃)。通常需要0毫秒(几纳秒)

我正在测试只渲染一个对象(使用可编程管道着色器,OpenGL>=3.3)

此示例的其他部分:

getProgram() // simply returns integer

// This is called before GL20.GLUniformMatrix4
FloatBuffer matrix4fBuffer = BufferUtils.createFloatBuffer(16);
projectionMatrix.store(matrix4fBuffer);
matrix4fBuffer.flip();
知道这里发生了什么吗

编辑: 我忘了提到我在单独的线程中运行render和update。我想可能是吧 与线程调度相关

编辑: 好的,我也在单线程环境中测试了这个,问题仍然存在。。。我还发现,对glUnuformMatrix4的其他调用不会导致问题,例如:

long testTime = System.nanoTime();
state.model.store(buffer);
buffer.flip();
GL20.glUniformMatrix4(
    GL20.glGetUniformLocation(shader.getProgram(), "modelMatrix"),
    false,
    buffer
);
testTime = System.nanoTime() - testTime;
if (testTime > 16000000) {
    System.out.println("DELAY MODEL" + (testTime / 1000000) );
}
停止这样做: 链接程序后,统一位置不会改变,从OpenGL查询任何内容都是降低性能的好方法

这个特殊的
Get
函数特别昂贵,因为它使用字符串来标识您正在搜索的位置。字符串比较很慢,除非优化为trie、哈希表等内容。。。随着您向搜索字符串集添加更多潜在匹配项,费用也会增加。OpenGL和GLSL都没有定义如何实现这个函数,但是如果您关心性能的话,您应该假设您的实现和它们一样愚蠢


随身携带一件
GLint
以备经常使用的命名制服。我真诚地建议编写一个封装GLSL程序对象的类,然后为任何专门化将其子类化。专用类将存储它们所需的所有统一位置,您将永远不必查询GL以查找统一位置。

请使用
-verbose:GC
命令行参数验证是否没有发生完全停止GC暂停。我对其进行了测试,没有GC干扰的记录。。。如果我增加FPS,我甚至会得到更多的延迟(在120FPS时,我会得到260ms的延迟)。。。
GL20.glUniformMatrix4(
    GL20.glGetUniformLocation(getProgram(), "projectionMatrix"),
    [...]