【问题标题】:How to reduce Drawcalls for animated GameObjects?如何减少动画游戏对象的 Drawcall?
【发布时间】:2013-06-26 10:53:41
【问题描述】:

我有一个场景,比如我有一堵墙,每当玩家撞到墙时,它就会变成碎片。每一块都是那堵墙的子 GO。每一块都使用相同的材​​料。所以我尝试了动态批处理对此,但它并没有减少绘制调用。

然后我尝试了 CombineChildren.cs,它工作并合并了所有网格,从而减少了绘制调用,但每当我的播放器撞到墙上时,它就不会播放动画。

我无法通过此链接check this 的答案尝试此 wiki 中的 SkinnedMeshCombiner.cs

因为我的游戏对象具有 Mesh 渲染器,而不是 Skinned Mesh 渲染器

我可以为此做任何其他解决方案吗?

【问题讨论】:

    标签: animation optimization graphics rendering unity3d


    【解决方案1】:

    所以我尝试了动态批处理,但它并没有减少平局 来电。

    如果您想减少移动对象的绘制调用,动态批处理几乎是唯一的方法(除非您尝试自己实现类似的东西)。 但是它有一些限制,如doc 中所述。

    特别是:

    • 要批处理的对象的顶点数限制
    • 所有人都必须共享相同的材料(不能是相同材料的不同实例 - 请务必检查这一点)
    • 没有光照贴图对象
    • 没有多通道着色器

    确保满足文档中列出的所有限制,然后动态批处理应该可以工作。

    然后我尝试了 CombineChildren.cs 它工作并组合了所有网格 减少了drawcall,但每当我的玩家撞墙时它都没有 播放动画。

    那是因为在合并之后,所有的 GameObjects 都会合并为一个唯一的。你不能再单独移动它们了。

    【讨论】:

    • 将 GO(wall) 的网格渲染器更改为 SkinnedMeshRenderer 并应用 SkinnedMeshCombiner.cs 怎么样?
    • 蒙皮网格渲染器在导入和蒙皮(包含绑定)时会自动附加到网格。这样做你不会有任何收获。
    • 好的,我做了一些事情,比如通过修改 CombineChildren 和墙的所有其他动画子 GO 到每个单独的网格中,将墙的非动画部分合并到一个网格中,所有这些现在都与动态批处理。我现在唯一担心的是,它正在绘制像 150K 这样的顶点。这个数量可以还是我需要减少它?
    • 一堵墙的 150K 个顶点似乎很多。您能否编辑您的问题并准确说明您的模型是如何组成的? (层次结构、每个模型的顶点数等。)
    • 不是针对墙壁,而是针对由许多墙壁组成的整个场景。基本上,这是我的所有路径的顶点数,这些路径由相机渲染。我拥有的最大绘制调用是 32 次,最小 drawcall 是 14 次。这些统计数据是否适用于整个场景或有什么问题?
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多