【发布时间】: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