我正在研究用LibGDX渲染一个平铺球体,旨在为桌面产生一个游戏。以下是目前为止我所得到的一些图像:http://imgur.com/GoYvEYZ,xf52D6I#0。我渲染了大约10,000个ModelInstances,所有这些都是使用自己的ModelBuilder从代码生成的。它们每个都包含3个或4个三角形部分,每个ModelInstance都对应于它自己的Model。下面是我使用的确切的渲染代码:如何提高LibGDX 3D渲染性能?
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使用自己的模型有多糟糕?如果只使用一个共享的模型对象,速度会得到改善吗?如果有人能够指点我更多的资源,或者就如何改善这里的表现给我任何好的建议,我会很感激。
我并不完全熟悉Libgdx的3d,但我认为10000个模型实例意味着有10000个绘制调用。由于模型数据没有变化,这还不及10000 sprite批处理刷新那么糟糕,但仍然不好。我认为如果你可以合并一些模型实例,那么你会看到一个很大的改进,因此你可以减少它们。此外,在中端或低端手机上,30000多个顶点可能太多,以确保顺畅的性能。 – Tenfour04
通过将远平面设置为距离相机稍微远离球体的中心,您可能可以使用相机的远平面去截取几乎一半的顶点。但我认为你的第一个瓶颈可能是大量的模型实例。 – Tenfour04