Unity 3D 静态对象 Batching 静态合批 动态合批

比如游戏各个模型是独立的,它们的材质以及贴图很有可能是完全一样的,但是由于一些模型数据不一样,放入Unity中会占很多DrawCall,所以Unity提供了一个属性来做静态合批,可以将它们合并在一个Mesh里。

//--设置静态合批

首先在Edit→Project Settings→Player中勾选Static Batching静态合批和Dynamic Batching动态合批复选框。

接着,比如两个Cube都选中Batching Static标记,然后运行游戏。

Mesh Filter会自动生成一个新的Mesh。

这样如果有相同材质 Shader 并且参数一致的话,就会合并DrawCall。

静态合批的最大顶点数是65535,如果定点数超过了它,Unity就会自动合并出多个Mesh。

//--脚本静态合批

自动的静态合批用起来很方便,但是也是有隐患。加入场景很大,合并出来的Mesh就会很大。游戏运行后只要有一小部分出现在摄像机内,那么整个大的Mesh都需要参与渲染。还有最大定点数的限制。

我们可以利用脚本来动态设置需要合并在一起的游戏对象,游戏对象不需要选中Static标记。

using UnityEngine;

public class StaticBatchingByScript : MonoBehaviour
{
    public GameObject[] cubes;

    private void Start()
    {
        StaticBatchingUtility.Combine(cubes, gameObject);
    }
}

 如图:

 

代码含义就是将数组中的游戏对象合并在同一个Root节点下,也就是第二个参数。

另外运行游戏后合并过的Mesh 对象是不可以发生位移的,但是可以移动他们指定的Root节点。

//--动态合批

动态合批是全自动的,我们不需要做任何事情。但是它是有要求的,Mesh的顶点数量要小于300。如果Shader中使用了顶点位置 法线 UV0 UV1 和切线,Mesh的定点数必须小于180。(在粒子特效中它发挥了很大的优势)。

//--静态合批的隐患

静态合批的原理就是自动生成Mesh,但是不同的Mesh保存的信息可能是不同的。例如Mesh中可能会保存color 和 tangent,但是大部分Mesh都是不需要这个信息的,如果静态合批中有一个Mesh包含了这个信息,那么合并后整个Mesh都会带上它,这样无疑会增加一些额外的开销。

很多时候是美术在导出FBX时,操作不当导致添加了没用的color 和 tangent信息,所以可以利用FBX官网提供的FBX接口,自己写一个Python脚本来删除它们。

没有脚本,我不会Python,哈哈。等会了加上。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值