【问题标题】:LWJGL 2.9.0 GL20.glUniformMatrix4 causes random stutteringLWJGL 2.9.0 GL20.glUniformMatrix4 导致随机口吃
【发布时间】:2013-11-21 12:07:56
【问题描述】:

我正在一个单独的线程中以 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();

知道这里发生了什么吗?

编辑: 我忘了提到我在单独的线程中运行渲染和更新。我想可能是 跟线程调​​度有关吗?

编辑: 好的,我也在单线程环境中对此进行了测试,但问题仍然存在......我还发现对 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) );
}

【问题讨论】:

  • 请使用-verbose:gc命令行参数验证是否没有进行完全停止的GC暂停。
  • 我测试了它,没有 GC 干扰的记录......如果我增加 FPS,我什至会得到更多的延迟(在 120FPS 我得到 260ms 的延迟)......

标签: java performance lwjgl opengl-3


【解决方案1】:

停止这样做:

GL20.glUniformMatrix4(
    GL20.glGetUniformLocation(getProgram(), "projectionMatrix"),
    [...]

链接程序后,统一位置不会改变,从 OpenGL 查询任何内容是降低性能的好方法。

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

为您经常使用的命名制服保留GLint。老实说,我建议编写一个封装 GLSL 程序对象的类,然后将其子类化以进行任何专业化。专门的类将存储他们需要的所有统一位置,您将永远不必向 GL 查询统一位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-01-10
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多