Java 为什么不';我使用LibGDX';是createBox还是createRect?

Java 为什么不';我使用LibGDX';是createBox还是createRect?,java,3d,libgdx,Java,3d,Libgdx,我目前正在创建一个体素引擎,以便熟悉其中涉及的许多概念,这对我来说也是一个优化练习。在四处搜索时,我在多个网站上看到了多个源代码,提示我除了故障排除之外,不使用ModelBuilder().createBox()或createRect()执行任何操作 相反,他们建议在blender之类的东西中创建自己的立方体模型,而不是使用这些模型来代替createBox。我刚刚完成了优化筛选的实现,重写代码以转换为自定义模型需要一些时间。我想在做出这样的承诺之前,先了解我在做什么,为什么要这么做 为什么不推荐

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

相反,他们建议在blender之类的东西中创建自己的立方体模型,而不是使用这些模型来代替createBox。我刚刚完成了优化筛选的实现,重写代码以转换为自定义模型需要一些时间。我想在做出这样的承诺之前,先了解我在做什么,为什么要这么做

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

ModelBuilder#createBox方法是一种方便的方法,可以创建一个带有单个
节点的
模型,该节点包含一个包含单个长方体形状的
节点。这与执行以下操作完全相同:

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();
它创建一个
网格
对象,这是一个OpenGL资源,它只包含(取决于属性)8或24个顶点和36个索引。除非它是唯一要渲染的对象,否则使用如此小的
网格对性能非常不利

这是因为每个
网格
(或
节点的(部分)
)都意味着一个渲染调用。这意味着它必须等待上一个渲染调用完成,CPU和GPU同步。将尽可能多的形状组合成一个
网格
并同时渲染,性能会更好。毕竟,GPU旨在同时在多个顶点上并行执行

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

因此,如果您使用仅包含一个长方体的模型创建体素引擎,那么最终将有数千个渲染调用。这将是如此缓慢,它将使您的游戏几乎无法进行

当然,解决方案很简单,只需向零件添加多个框:

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();
ModelBuilder#createBox
(和其他创建方法)隐藏了此逻辑,这使得不太容易看到幕后发生的事情以及优化它的容易程度。因此,有一天我可能会删除这些方法。不幸的是,
createXXX
方法对学习3D API的新手非常有用(例如,我在我的博客上的中使用它),他们希望快速入门。这就是为什么我还没有移除它们

顺便说一句,对体素引擎使用
ModelBuilder
是一种过度使用。您可能想看看,在这里我展示了一种在运行时组合简单形状的简单方法。libGDX的最新版本甚至包含,它实际上可以直接用作体素块


我不知道为什么您会认为在建模应用程序中创建一个长方体与通过代码创建它有什么不同。也许你可以链接到你找到的参考资料。

谢谢你的回复,现在一切都变得更有意义了。我不太清楚为什么在程序中创建一个模型会不同于在代码中创建一个模型,这也是我为什么要问的一个原因,我会看看我能从哪里读到这个建议。此外,将多个形状组合到单个网格中不应影响您可以单独与每个形状交互的能力。正确吗?只是他们被渲染的方式。我将大胆地看一看你的教程,看起来我有更多的东西要学!事实上,游戏逻辑和渲染逻辑应该分开。尽管您应该只更新内容实际更改(并且可见)的块。