gpt4 book ai didi

java - 我怎样才能阻止草地落后于我的比赛?

转载 作者:行者123 更新时间:2023-11-30 07:04:00 26 4
gpt4 key购买 nike

我正尝试在我的游戏中添加草。

enter image description here

然而不幸的是,它使 FPS 从 60+ 下降到只有 36。如果我的船直接撞到地形上,它甚至可以下降到 32。

我试过不把草渲染得更远。 enter image description here

然而,它仍然是游戏 FPS 的巨大打击。请记住,如果没有它,我的 FPS 将翻一番以上!

草地使用与树木相同的模型 - 一个始终面向相机的广告牌。 enter image description here显然,我使用片段着色器移除了透明位。

我听说过像“结 block ”这样的技术,但我不知道该怎么做,甚至不知道为什么它会有助于提高性能。

我使用这段代码进行渲染:

TexturedModel texturedModel = TerrainDemo.textModel;
RawModel model = texturedModel.getRawModel();
glDisable(GL_CULL_FACE);

FloatBuffer buf = BufferUtils.createFloatBuffer(16 * 4);
// Get your current model view matrix from OpenGL.
glTranslatef(location.x * TerrainDemo.scale, location.y, location.z * TerrainDemo.scale);
glRotatef(90, 1f, 0f, 0f);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, buf);
buf.rewind();

buf.put(0, 1.0f);
buf.put(1, 0.0f);
buf.put(2, 0.0f);

buf.put(4, 0.0f);
buf.put(5, 1.0f);
buf.put(6, 0.0f);

buf.put(8, 0.0f);
buf.put(9, 0.0f);
buf.put(10, 1.0f);

GL11.glLoadMatrix(buf);


GL30.glBindVertexArray(model.getVaoID());
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, TerrainDemo.texModel.getTexture().getID());
glScalef(15f, 15f, 15f);
glColor4f(0, 0, 0, 0.5f);
glRotatef(90, 0f, 1f, 0f);
glDrawElements(GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);

我怎样才能减少草造成的延迟?

(小提示:出于演示目的,我删除了地形纹理,以便您更容易看到草地)

更新:我刚刚尝试剔除草的背面,但似乎没有任何区别。即使我剔除两张脸也没有区别。

最佳答案

由于@DietrichEpp 已经涵盖了一些更高层次的方法,我将重点关注对您当前代码的一些直接建议。如果您还没有准备好跳跃,我认为您可以通过修复第一个项目获得实质性的改进。

  1. 在您的渲染代码中有一个 glGetFloat(GL11.GL_MODELVIEW_MATRIX, ...) 调用。您应该永远不要在执行非常频繁的代码的任何速度关键部分调用glGet*()。它们可能对性能非常有害。

    在这种情况下,您似乎试图从当前变换矩阵中提取和平移部分。由于您自己指定了所有转换,因此只需计算必要的转换并应用它应该相当容易。

  2. 您正在创建缓冲区。对象创建相当昂贵,我会尽量避免在渲染循环中使用它。而且我相信这可能会创建一个 native 缓冲区,这可能会产生更多的开销。如果您确实需要缓冲区,请创建一次缓冲区,然后在绘制每个对象时重复使用它。

  3. 有几个调用每次看起来都一样。如果您遍历此代码序列,请将它们拉出循环。例如:

    glDisable(GL_CULL_FACE);
    ...
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, TerrainDemo.texModel.getTexture().getID());
  4. 摆脱固定函数矩阵功能,自己构建矩阵,并调用一个 glUniformMatrix4fv() 来指定它们。

  5. 您没有有效地使用 VAO:

    GL30.glBindVertexArray(model.getVaoID());
    GL20.glEnableVertexAttribArray(0);
    GL20.glEnableVertexAttribArray(1);

    属性指针启用/禁用状态是 VAO 状态的一部分。因此,当您设置 VAO 时,您只需调用一次 glEnableVertexAttribArray()

关于java - 我怎样才能阻止草地落后于我的比赛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27945276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com