2015-07-11 127 views
0

我正在研究用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使用自己的模型有多糟糕?如果只使用一个共享的模型对象,速度会得到改善吗?如果有人能够指点我更多的资源,或者就如何改善这里的表现给我任何好的建议,我会很感激。

+0

我并不完全熟悉Libgdx的3d,但我认为10000个模型实例意味着有10000个绘制调用。由于模型数据没有变化,这还不及10000 sprite批处理刷新那么糟糕,但仍然不好。我认为如果你可以合并一些模型实例,那么你会看到一个很大的改进,因此你可以减少它们。此外,在中端或低端手机上,30000多个顶点可能太多,以确保顺畅的性能。 – Tenfour04

+0

通过将远平面设置为距离相机稍微远离球体的中心,您可能可以使用相机的远平面去截取几乎一半的顶点。但我认为你的第一个瓶颈可能是大量的模型实例。 – Tenfour04

回答

0

如果瓷砖最终打算成为坚实的,您可以改进的一项改进是打开back-face culling。这将导致任何不面向相机的脸部不被渲染(即每个脸部的一侧变得不可见)。对于一个球体而言,这意味着GPU只需渲染大约一半的面部。

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

+0

感谢您的回复。我从其他线索得到的建议一直在做这些类似的技术,它将我的表现提高了60倍。一旦我得到了一些我的代码,我将在这里发表一篇文章。 –

+0

你是否最终在这里提到你写的文章? –