我在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-30ms(每10s,30s,45s,......),这会导致随机减速(口吃)。通常它需要0毫秒(几纳秒)。
我正在测试只有一个对象被渲染(使用可编程管道 - 着色器,OpenGL> = 3.3)。
此示例的其他部分:
getProgram() // simply returns integer
// This is called before GL20.GLUniformMatrix4
FloatBuffer matrix4fBuffer = BufferUtils.createFloatBuffer(16);
projectionMatrix.store(matrix4fBuffer);
matrix4fBuffer.flip();
知道这里发生了什么吗?
编辑: 我忘了提到我在不同的线程中运行渲染和更新。我猜它可能会 与线程调度有关吗?
编辑: 好吧我也在单线程环境中对此进行了测试,问题仍然存在......我还发现,对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) );
}
答案 0 :(得分:2)
GL20.glUniformMatrix4(
GL20.glGetUniformLocation(getProgram(), "projectionMatrix"),
[...]
链接程序后,统一位置不会改变,从OpenGL查询任何内容都是一种杀死性能的好方法。
此特定Get
函数特别昂贵,因为它使用字符串来标识您要搜索的位置。字符串比较很慢,除非优化为trie,哈希表等...并且随着您向搜索字符串集添加更多可能的匹配,费用会增加。 OpenGL和GLSL都没有定义如何实现这个功能,但是如果你担心性能,你应该假设你的实现是愚蠢的。
为常用的命名制服保留GLint
便利。老实说,我建议编写一个封装GLSL程序对象的类,然后将其子类化为任何特化。专门的类会存储他们需要的所有统一位置,你永远不会查询GL的统一位置。