为什么我不应该使用 LibGDX 的 createBox 或 createRect?

Poi*_*ion 3 java 3d libgdx

我目前正在创建一个体素引擎,以便熟悉其中涉及的许多概念,这对我来说也恰好是一个优化练习。在搜索时,我在多个网站上看到多个来源表明我不使用 ModelBuilder().createBox() 或 createRect() 来执行除故障排除之外的任何操作。

相反,他们建议在搅拌机之类的东西中创建自己的立方体模型,而不是使用它们代替 createBox。我刚刚完成了实现优化剔除,重写代码以更改为自定义模型需要一些时间。在做出类似的事情之前,我想了解我在做什么以及为什么要这样做。

到底为什么不推荐createBox?在这种情况下,创建个人模型真的是最好的主意吗?

Xop*_*ppa 5

ModelBuilder#createBox方法是创建包含单个框形状的Model单个的便捷方法。这与执行以下操作完全相同:NodeNodePart

ModelBuilder builder = new ModelBuilder();
builder.begin();
builder.node();
MeshPartBuilder mpb = builder.part("box", primitiveType, attributes, material);
BoxShapeBuilder.build(mpb, width, height, depth);
model = builder.end();
Run Code Online (Sandbox Code Playgroud)

它创建一个Mesh对象,该对象是一个 OpenGL 资源,其中仅包含(取决于属性)8 个或 24 个顶点和 36 个索引。除非它是您想要渲染的唯一内容,否则如此小的Mesh.

这是因为每个Mesh(或 a 的(部分)Node)都意味着一次渲染调用。这意味着它必须等待先前的渲染调用完成并且CPU和GPU同步。Mesh将尽可能多的形状组合成一个并立即渲染它的性能会更高。毕竟,GPU 旨在同时在许多顶点上并行执行。

SpriteBatch这与例如在渲染之前组合尽可能多的精灵的原因相同。这也是为什么使用单个TextureAtlas纹理比使用单独的纹理性能更好的原因。

因此,如果您使用仅包含单个框的模型创建体素引擎,那么您最终将获得数千次渲染调用。那会非常慢,以至于你的游戏几乎无法玩。

当然,解决这个问题很简单,只需在零件中添加多个框即可:

ModelBuilder builder = new ModelBuilder();
builder.begin();
builder.node();
MeshPartBuilder mpb = builder.part("box", primitiveType, attributes, material);
BoxShapeBuilder.build(mpb, x1, y1, z1, width1, height1, depth1);
BoxShapeBuilder.build(mpb, x2, y2, z2, width2, height2, depth2);
//...
BoxShapeBuilder.build(mpb, xn, yn, zn, widthn, heightn, depthn);
model = builder.end();
Run Code Online (Sandbox Code Playgroud)

ModelBuilder#createBox和其他创建方法)隐藏了这个逻辑,这使得了解幕后发生的事情以及优化它的容易程度变得不那么明显。因此,有一天我可能会删除这些方法。不幸的是,这些createXXX方法对于想要快速入门的学习 3D API 的新手(例如,我在博客的教程中使用它)非常有帮助。这就是我仍然没有删除它们的原因。

顺便说一句,用于ModelBuilder体素引擎是一种矫枉过正的行为。您可能想看看本教程,其中我展示了一种在运行时组合简单形状的简单方法。最新版本的 libGDX 甚至包含ShapeCache,它实际上可以直接用作体素块。

我不确定为什么您会认为在建模应用程序中创建一个盒子与通过代码创建它有什么不同。也许您可以链接到您找到该内容的参考文献。