如何提高LibGDX 3D渲染性能?

时间:2015-07-11 20:47:15

标签: java performance opengl libgdx rendering

我正致力于使用LibGDX渲染平铺球体,旨在制作桌面游戏。以下是我到目前为止所获得的一些图像:http://imgur.com/GoYvEYZ,xf52D6I#0。我渲染了大约10,000个ModelInstances,所有这些都是使用自己的ModelBuilders从代码生成的。它们每个包含3个或4个三角形部分,每个ModelInstance都对应于它自己的模型。以下是我使用的确切呈现代码:

    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" check只是一些非常简单的视锥体剔除,我在本教程https://xoppa.github.io/blog/3d-frustum-culling-with-libgdx/中遵循了这一点。从我的诊断信息可以看出,我的FPS非常糟糕。我瞄准至少60 FPS呈现我希望是一个相当简单的吨多边形场景。我只是知道我以非常低效的方式做这件事。

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

此外,每个ModelInstance使用自己的模型有多糟糕?如果只使用一个共享的Model对象,速度会提高吗?如果有人能指出我更多的资源或给我任何关于如何提高绩效的好建议,我会感激不尽。

1 个答案:

答案 0 :(得分:0)

如果瓷砖最终都是坚固的,那么您可以进行一项改进就是启用back-face culling。这将导致不面向相机的任何面部不被渲染(即每个面的一侧变得不可见)。对于一个球体,这意味着GPU只需要渲染大约一半的面孔。

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