Unity中的MergeMesh

(合併前)

這裏我做了N個小球 疊加在一起
在這裏插入圖片描述
可以看到這些小球的mesh很複雜。
在這裏插入圖片描述
運行起來看一下
在這裏插入圖片描述
batches達到了549,這是一個毀滅性的現象。會造成大量的draw call,導致性能降低。

接下來進行 mergemesh

Batching Static

其實可以設置爲Batching Static 來達到相似的目的,但是這樣有個侷限性,就是這樣設定了的物體不能移動,因爲相當於強制讓他執行靜態批處理。
在這裏插入圖片描述

(合併後)

在這裏插入圖片描述
可以發現batches降低爲9.

觀察合併後的Filter,和之前沒什麼兩樣,而且可以移動
在這裏插入圖片描述

using UnityEngine;
public class ChinarMergeMesh : MonoBehaviour
{
    void Start()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();   //獲取 所有子物體的網格
        CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length]; //新建一個合併組,長度與 meshfilters一致
        for (int i = 0; i < meshFilters.Length; i++)                                  //遍歷
        {
            combineInstances[i].mesh = meshFilters[i].sharedMesh;                   //將共享mesh,賦值
            combineInstances[i].transform = meshFilters[i].transform.localToWorldMatrix; //本地座標轉矩陣,賦值
        }
        Mesh newMesh = new Mesh();                                  //聲明一個新網格對象
        newMesh.CombineMeshes(combineInstances);                    //將combineInstances數組傳入函數
        gameObject.AddComponent<MeshFilter>().sharedMesh = newMesh; //給當前空物體,添加網格組件;將合併後的網格,給到自身網格
        //到這裏,新模型的網格就已經生成了。運行模式下,可以點擊物體的 MeshFilter 進行查看網格
        #region 以下是對新模型做的一些處理:添加材質,關閉所有子物體,添加自轉腳本和控制相機的腳本
        gameObject.AddComponent<MeshRenderer>().material = Resources.Load<Material>("Materials/Koala"); //給當前空物體添加渲染組件,給新模型網格上色;
        foreach (Transform t in transform) t.gameObject.SetActive(false);             //禁用掉所有子物體
        #endregion
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章