Unity优化(1)——合并Mesh的两种方法

40 篇文章 1 订阅
13 篇文章 0 订阅

在某些移动端项目中,对于DrawCall的要求是很严格的,我们一般查看DrawCall可以通过Statistics里面的Batches进行查看,一般对于移动设备的Batches要控制在200左右比较合适,所以降低Batches是很重要的。

我们常常会遇到一个物体下挂载很多很多个子物体,子物体的模型又比较精细,且都是静态的Mesh,这样就会造成大量的DrawCall,我们多次渲染一个小Mesh和一次渲染一个大Mesh之间需要取得平衡,保持帧率稳定在目标数字,这时候我们可以考虑使用合并Mesh,就比如下图中

这里面有非常多的面,在我们不进行处理的时候,可以看到我们的帧率和Mesh

基本稳定在100左右,且Batch在800左右,消耗了很多的DrawCall,所以我们一次性处理一个大的Mesh,减少DrawCall,而不是一次处理一个小的mesh,为了合并Mesh,对于相同的一些物体,

我们可以通过代码直接进行合并,代码如下:

using UnityEngine;

public class MeshCombine : MonoBehaviour
{
    private void Start()
    {
        CombineMeshs();
    }
    void CombineMeshs()
    {
         MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combines = new CombineInstance[meshFilters.Length];
        for (int i = 0; i < meshFilters.Length; i++)
        {
            combines[i].mesh = meshFilters[i].sharedMesh;
            combines[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);//关闭原始对象
        }
        MeshFilter parentFilter = gameObject.AddComponent<MeshFilter>();
        parentFilter.mesh = new Mesh();
        parentFilter.mesh.CombineMeshes(combines);

        MeshRenderer parentRender = gameObject.AddComponent<MeshRenderer>();
        parentRender.material = meshFilters[0].GetComponent<MeshRenderer>().sharedMaterial;
        gameObject.SetActive(true);
    }
}

开箱即用,挂载到父物体身上,就可以了,这里我们就用到了Combine这个方法,我们就是通过两个数组,一个数组把子物体的MeshFilter组件存储起来,然后创建一个和子物体长度相同的CombineInstace数组,把组件的mesh传递给它,最后在父物体身上创建meshFilter组件,就可以了

但是其实现在有很多Mesh合并的工具,比如这个叫Simple LOD的,下载地址如下:

文件 (lanzout.com)

导入后选中父物体,选择Tools中的SimpleLod

选择Merge child meshes即可!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laker404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值