【问题标题】:Why excatly shouldn't I use LibGDX's createBox or createRect?为什么我不应该使用 LibGDX 的 createBox 或 createRect?
【发布时间】:2016-09-18 03:26:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: java 3d libgdx


    【解决方案1】:

    ModelBuilder#createBox 方法是一种方便的方法,用于创建带有单个 NodeModel,其中包含单个 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 对象,这是一个OpenGL 资源,它只包含(取决于属性)8 或24 个顶点和36 个索引。除非它是您要渲染的唯一内容,否则有这么小的Mesh 对性能非常不利。

    这是因为每个Mesh(或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();
    

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

    顺便说一句,将ModelBuilder 用于体素引擎是一种矫枉过正。你可能想看看this tutorial,我在这里展示了一种在运行时组合简单形状的简单方法。最新版本的 libGDX 甚至包含 ShapeCache,它几乎可以直接用作体素块。

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

    【讨论】:

    • 感谢您的回复,现在一切都变得更有意义了。我不太确定为什么在程序中创建模型与在代码中创建模型不同,这是我问的原因之一,我会看看是否可以在我阅读该建议的地方挖掘。此外,将多个形状组合成一个网格不应该影响您可以与每个单独进行交互的能力吗?就像它们呈现的方式一样。我一定会看看你的教程,看来我还有更多的东西要学!
    • 确实,游戏逻辑和渲染逻辑应该分开。尽管您应该只更新内容实际更改(并且可见)的块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2016-05-23
    相关资源
    最近更新 更多