UE4中如何實現放置大量的使用同一模型資源的StaticMeshActor不卡


一、問題描述

        出於種種原因,有時候我們需要在UE4的場景中放置幾千幾萬甚至更多的模型,這些模型具有相同的LOD,並且基礎模型都使用同一模型資源。因為模型文件拖入UE4場景中會自動使用Static Mesh Actor來表示,當在程序中放置大量模型時,其實是在引擎中生成了大量Static Mesh Actor類的實例。每個SMActor都單獨計算模型、材質和坐標Transform等,每個SMActor都會單獨調用DrawCall來單獨渲染自己。所以當大量SMActor在場景中的時候,調用Draw Call次數急劇增加導致渲染延遲增長,如果每個SMActor還要單獨Tick去更新Transform坐標的話,程序邏輯延遲也會隨之增加,以上兩個主要延遲會導致場景變得巨卡。

二、使用Instanced Static Mesh Component來進行優化

        針對上述問題,在UE4中,我們可以使用Instanced Static Mesh Component來進行優化,簡稱ISMC。還有一種叫Hierarchical Instanced Static Mesh Component,簡稱HISMC。繼承關系如下:

        

        不管是ISM還是HISM,都會把所有該組件下生成的大量的Instance Mesh加載到一個模型數組中,然后使用統一的材質,進行一次性整體渲染,DrawCall只調用1次,從而降低了渲染延遲。但是如果要更新坐標,仍然需要遍歷整個模型數組,所以仍然會存在一定的程序邏輯延遲。

三、演示

1.創建並添加實例模型

2.為每個實例更新Transform坐標

3.使用貼圖數組配合per instance custom parameter為不同實例模型在同一材質下創建不同的紋理

為每個實例模型添加自定義參數。這里隨機0到2之間的數,之后會用這個隨機數,來控制實例模型的材質貼圖。

 接下來選中不同的貼圖,創建貼圖數組TextureArray。

 在這個貼圖數組作為貼圖拖到材質中,添加PerInstanceCustomData,該節點存儲了每個實例模型的自定義數據,也就是前面的0到2之間的數。用這個數來選擇貼圖數組中的不同貼圖。

4.ISMC和HISMC對比(有空再填坑)

5.幀率對比

使用單個的StaticMeshActor。生成1000多個actor,每個actor都tick更新位置。觀察幀率。

 使用HISM,更新位置時,仍需要遍歷每個實例模型,數量少時看不出變化,當實例模型數量多的時候,仍然會受遍歷影響,但仍比單個actor每幀刷新效果要好。

 下面是不更新位置,只單純數量的對比。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM