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

时间:2016-05-20 18:49:22

标签: java 3d libgdx

我目前正在创建一个体素引擎,以便熟悉所涉及的许多概念,这也恰好是我的优化练习。在搜索时,我发现多个网站上有多个来源,我猜测我不会使用ModelBuilder()。createBox()或createRect()来做任何事情,除了排除故障。

相反,他们建议在像blender这样的东西中创建自己的立方体模型,而不是使用那些代替createBox。我刚刚完成实施剔除优化,重写我的代码以转换到自定义模型需要一些时间。我想了解我在做什么以及为什么我在做这样的事情之前做了这件事。

为什么不建议使用createBox?在这种情况下创建个人模型真的是最好的主意吗?

1 个答案:

答案 0 :(得分:1)

ModelBuilder#createBox方法是一种方便的方法,可以创建一个Model,其中包含一个Node NodePart,其中包含一个包含单个框形状的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(); 。它完全和做:

Mesh

它创建一个Mesh对象,它是一个OpenGL资源,它包含(取决于属性)只有8或24个顶点和36个索引。除非它是你想要渲染的唯一东西,否则性能非常糟糕Mesh

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

这就是为什么,例如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(); 比使用单独纹理更好的性能的原因。

因此,如果您使用仅包含一个框的模型创建体素引擎,那么最终会有数千个渲染调用。这将是如此之慢,以至于它会使你的游戏几乎无法播放。

当然,对此的解决方案很简单,只需在零件中添加多个方框:

ModelBuilder#createBox

createXXX(以及其他创建方法)隐藏了这个逻辑,这使得查看幕后发生的事情以及如何轻松优化它变得不那么明显。因此,有一天我可能会删除这些方法。不幸的是,ModelBuilder方法对于学习3D API的新手非常有用(例如我在我的博客上的tutorials中使用它),他们希望快速入门。这还是我还没有删除它们的原因。

顺便说一句,使用<input class="subscriberequiredField subscribename" name="subscribename" id="subscribename" type="text" value="Ime"> <input class="subscriberequiredField subscribelastname" name="subscribelastname" id="subscribelastname" type="type" value="Prezime"> 作为体素引擎是一种矫枉过正。您可能希望看一下this tutorial,在那里我展示了一种在运行时组合简单形状的简单方法。最新版本的libGDX甚至包含ShapeCache,它实际上可以直接用作体素块。

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