【问题标题】:How do I improve LibGDX 3D rendering performance?如何提高 LibGDX 3D 渲染性能?
【发布时间】:2015-07-11 20:47:14
【问题描述】:

我正在使用 LibGDX 渲染一个平铺的球体,旨在为桌面制作游戏。以下是我目前所获得的一些图片:http://imgur.com/GoYvEYZ,xf52D6I#0。我正在渲染 10,000 个左右的 ModelInstance,所有这些都是使用自己的 ModelBuilder 从代码生成的。它们每个都包含 3 或 4 个三角形部分,每个 ModelInstance 对应自己的 Model。这是我用来执行此操作的确切渲染代码:

    modelBatch.begin(cam);
    // Render all visible tiles
    visibleCount = 0;
    for (Tile t : tiles) {
        if (isVisible(cam, t)) {
            // t.rendered is a ModelInstance produced earlier by code.
            // the Model corresponding to the instance is unique to this tile.
            modelBatch.render(t.rendered, environment);
            visibleCount++;
        }
    }
    modelBatch.end();

ModelInstances 不是由每一帧的代码生成的,只是绘制的。我只在需要时更新它们。 “isVisible”检查只是一些非常简单的截锥体剔除,这是我从本教程https://xoppa.github.io/blog/3d-frustum-culling-with-libgdx/ 中遵循的。从我的诊断信息可以看出,我的 FPS 很糟糕。我的目标是至少 60 FPS 渲染我希望是一个相当简单的大量多边形场景。我只知道我这样做的效率很低。

我对人们通常如何解决此问题进行了一些研究,但我一直在尝试将这些解决方案应用于我的项目。例如,建议将场景分成块,但是当玩家能够旋转球体并查看所有侧面时,我不知道如何利用它。我阅读了关于遮挡剔除的信息,因此我可能只在面向相机的球体一侧渲染 ModelInstances,但不知道如何在 LibGDX 中实现它。

另外,每个 ModelInstance 都使用自己的 Model 有多糟糕?如果只使用一个共享模型对象,速度会提高吗?如果有人可以向我指出更多资源或就如何提高这里的性能给我任何好的建议,我将不胜感激。

【问题讨论】:

  • 我对 Libgdx 的 3d 并不完全熟悉,但我认为 10000 个模型实例意味着有 10000 个绘制调用。这不像 10000 次精灵批量刷新那么糟糕,因为模型数据没有改变,但仍然很糟糕。我认为如果您可以合并其中一些模型实例以减少它们的数量,您将看到很大的改进。此外,在中端或低端手机上,30000 多个顶点对于流畅的性能来说可能太多了。
  • 您可以使用相机的远平面来截断几乎一半的顶点,方法是将远平面设置为比球体中心稍微远离相机。但我认为您的第一个瓶颈可能是大量模型实例。

标签: java performance opengl libgdx rendering


【解决方案1】:

如果图块最终打算是实心的,您可以进行的一项改进是打开back-face culling。这将导致不渲染任何不面向相机的面(即每个面的一侧变得不可见)。对于一个球体,这意味着 GPU 只需要渲染大约一半的面。

将对象组合成一个模型也可能会产生很大的影响。这可能是 10,000 次绘制调用和 1 次之间的差异(这取决于 modelBatch 对象的智能程度,因为它可能会在幕后进行组合)。如果用户有时会被缩放得非常接近,那么分块方法可能会有所帮助,这样您就可以继续进行视锥体剔除。

【讨论】:

  • 感谢您的回复。我一直在根据我在其他线程中获得的建议做一些类似的技术,它使我的性能提高了大约 60 倍。一旦我按顺序获得了一些代码,我将在这里发布一篇文章。
  • 你最后写了你在这里提到的文章吗?
猜你喜欢
  • 2014-07-28
  • 2012-04-17
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多