UE4 优化
?
目錄
1. 材質(zhì)
2. 靜止光線
3. 頂點/網(wǎng)格:
4. 渲染相關(guān):
5. 特殊的性能提升建議
6. 代碼編譯優(yōu)化
7. 燈光優(yōu)化
8. 陰影優(yōu)化
9. 材質(zhì)優(yōu)化
10. 植被優(yōu)化
11. 物理與碰撞優(yōu)化
12. 動畫優(yōu)化
13. UI優(yōu)化
14. 位移優(yōu)化
15. 特效優(yōu)化
16. AI優(yōu)化
17. Dedicated Server優(yōu)化
1. 材質(zhì)
(1)紋理采樣器:減少數(shù)量優(yōu)化;
(2)mip map:優(yōu)化大紋理遠(yuǎn)距離小部分采樣。
2. 靜止光線
(1)重疊:(大于等于5個的靜止光線重疊,擁有最小半徑的靜止光線會開始投射動態(tài)陰影)
3. 頂點/網(wǎng)格:
(1)使用DCC工具或者UE4支持的網(wǎng)格簡化工具來減少網(wǎng)格中的頂點數(shù)量。
(2)網(wǎng)格合并拆分:有功能性拆分,無功能性合并;(防止單獨處理變換和碰撞)
(3)經(jīng)常不可見,不可見之前不執(zhí)行:Components.Add()方法,這樣可以節(jié)省許多處理器周期;
RegisterComponent()方法,避免每幀更新;
(4)不需要碰撞:ChildMeshComponent?->?SetCollisionProfileName?(?UCollisionProfile?::?NoCollision_ProfileName?); ?
(5)不需要重疊:MeshComponent?->?bGenerateOverlapEvents?=?false?;
(6)統(tǒng)一用父級邊界檢測:ChildMeshComponent?->?bUseAttachParentBound?=?true?;
(7)避免網(wǎng)格單獨打光:bLightAttachmentsAsGroup為true,你可以選擇在你的對象的每個網(wǎng)格中使用相同的間接照明緩存信息,這會節(jié)省獨立更新網(wǎng)格的時間。
4. 渲染相關(guān):
(1)查看渲染系統(tǒng)決定不繪制的初始量的數(shù)量:Frustum Culled初始量值
查看方式一:視口左上角▼—>stat—>Advance—>…
方式二:命令ToggleDebugCamera,快捷鍵F
(2)性能可視化工具
(2.1)線框視圖模式
????????可以告訴你場景和獨立網(wǎng)格中有多少頂點和三角形
快捷鍵:F1;
命令:viewmode wireframe
(2.2)著色器復(fù)雜性可視化
????????當(dāng)你的場景中存在很多材質(zhì)時,可能很難確定哪些是復(fù)雜的;
快捷鍵:F5
命令:viewmode shadercomplexity
這里的暗綠色區(qū)域比淺綠色區(qū)域含有更復(fù)雜的著色程序邏輯,紅色和白色區(qū)域也仍有更加復(fù)雜的著色邏輯。著色復(fù)雜性最大的原因通常是:當(dāng)多重透明材質(zhì)重疊時,需要為所有重疊區(qū)域計算著色。
材質(zhì)編輯器中,stats,查看
1)著色器的說明數(shù)量:減少數(shù)量可優(yōu)化性能;
? 2)紋理緩存:紋理采樣器過多,增加寫入寫出負(fù)擔(dān);可減少紋理采樣器數(shù)量優(yōu)化;
3)錐形紋理技術(shù)(mip map):優(yōu)化大紋理遠(yuǎn)距離小部分采樣。(
Detail Of Level?—>Mip Gen Settings)
(2.3)光線復(fù)雜度視圖模式
????????顯示了影響你的幾何圖形的非靜態(tài)光線的數(shù)量;
快捷鍵:F9
按鍵:視口左上角▼—>Light Complexity
一個光線可以被剔除的方式有很多,包括半徑削減、z型交叉、攝像頭背對光源、光函數(shù)是0等等;
(2.4)靜止光線重疊視圖模式
???????靜止光線重疊視圖模式用紅色顯示了哪些靜止光線正被迫移動。
按鍵:視口左上角▼—>Stationary Light Overlay
靜止光線一次最多只允許4次重疊。一旦你有了大于等于5個的靜止光線重疊,擁有最小半徑的那個靜止光線會開始投射動態(tài)陰影,這會產(chǎn)生很高的性能代價。
(2.5)其他Stats視圖
在Window>Statistics菜單中有一些其他統(tǒng)計數(shù)據(jù)視圖:
(2.5.1)紋理Stats?(檢查大紋理及使用次數(shù)優(yōu)化)
工具顯示了在當(dāng)前關(guān)卡下使用的所有紋理,它們的分辨率、使用次數(shù)和游戲中出現(xiàn)的時間。如果你的場景中有高分辨率的紋理并且沒有被很多使用次或者不常見,它們不僅會占據(jù)很多不必要的內(nèi)存,而且也會造成GPU處理緩慢,增加GPU渲染場景花費的時間。
(2.5.2)初始量Stats(檢查線框細(xì)節(jié),頂點數(shù)量優(yōu)化)
許多有用信息,開始是在你的骨骼網(wǎng)格、靜態(tài)網(wǎng)格和場景中有多少三角形初始量。如果你在你的場景中定義了一個對象,它的三角形數(shù)量很多,試著在線框?qū)哟紊嫌^察這個角色。
可視化用來觀察線框在一個正常的觀察距離外是否保持著實線(或接近實線),這意味著在你的網(wǎng)格中你有比你需要的更多的細(xì)節(jié),你可以使用DCC工具或者UE4支持的網(wǎng)格簡化工具來減少網(wǎng)格中的頂點數(shù)量。
(3)分析器
也許在優(yōu)化性能時應(yīng)該熟悉的兩個最重要的工具是CPU分析器和GPU分析器。(程序獨立而非編輯器狀態(tài)運行,屏蔽編輯器處理帶來的影響)
(3.1)CPU分析器
UnrealFrontend.exe,在UE4/Engine/Binaries 文件夾中。你可以看到如下的界面,先在導(dǎo)航找到Session前端標(biāo)簽,之后找到分析器標(biāo)簽
準(zhǔn)備:測試建立(Test Buid)
無論是何種原因,如果你不能完成測試建立或者烘焙(需要烘焙來讓你的內(nèi)容作為獨立游戲來運行,這可以通過Unreal編輯器的File Menu > Cook Content for*Platform*完成,或者你可以為其他平臺給你的內(nèi)容打包)你的內(nèi)容,你可以完成一個開發(fā)編輯器建立,帶著游戲選項運行,這會為很好地為你顯示不同特征的相對性能代價,但是一個含有烘焙內(nèi)容的測試建立對于得到最終數(shù)據(jù)是最佳選擇。
(3.2)GPU分析器
啟動:
控制臺輸入profilegpu來啟動GPU分析器或者按Ctrl+Shift+, 來啟動,這會打開GPU觀察器:
5. 特殊的性能提升建議
(1)合并網(wǎng)格?(合并:拼接模型無特殊要求合并處理;拆分:部分可見整體渲染;)
多個網(wǎng)格集合圖形的網(wǎng)格可能會分別單獨調(diào)用GPU來繪制,也因為UE4會為每個網(wǎng)格單獨保存和更新變換信息,而且可能檢查這些獨立網(wǎng)格間的碰撞。所以,如果沒有功能性的原因來設(shè)置單獨網(wǎng)格的話,應(yīng)該考慮在把它們引入UE4之前在DCC工具中選擇合并它們。
關(guān)于合并網(wǎng)格反對的說法是:一個單獨的網(wǎng)格可能不能被部分剔除,所以如果它的任何一部分是可見的,整個網(wǎng)格都會渲染。由于這個原因,可能把你的整個關(guān)卡都合并成一個單獨網(wǎng)格可能不是一個好主意,但是讓每一個三角形都成為一個單獨網(wǎng)格同樣也不是最理想的,所以在兩種極端中取得平衡至關(guān)重要。
(2)由大量網(wǎng)格組成的單一對象
一些建議,來避免在這些事情上浪費不必要的CPU和GPU的周期。
(3)推薦的光線性能設(shè)置
動態(tài)對象的每個對象陰影可以通過不選關(guān)卡平行光中的bUseInsetShadowsForMovableObjects 的flag來禁用,這會提升性能。
在你的關(guān)卡的平行光屬性中,通常減少動態(tài)陰影級聯(lián)的數(shù)量不會對陰影外觀產(chǎn)生非常大的影響,但是會提升性能,默認(rèn)的是5,但是減少至大約3的樣子就會產(chǎn)生大致差不多的效果。
?
(4)動態(tài)陰影?
動態(tài)陰影的代價可能很大,尤其是全局動態(tài)陰影。這是因為三角形必須得為動態(tài)陰影映射重新渲染。如果你在移動光源上需要許多動態(tài)陰影來使多邊形盡可能少,如果你想要更多多邊形,那就試著少用帶有動態(tài)陰影的可移動光線。(可移動光線.動態(tài)陰影與多邊形數(shù)量權(quán)衡)
記住,設(shè)置了4個以上的重疊固定光線會迫使半徑最小的那個變成可移動的,這樣就會開始投射動態(tài)陰影。固定光重疊可視化是確保沒有過多重疊的好方法。
(5)限制后過程效果
后過程效果同樣是代價很大的,禁用你不需要的效果也可以很大地提升性能。一些可以考慮禁用的后過程效果包括鏡頭閃光、土地深度和屏幕空間反射。為了提升性能,你可能也想要以低質(zhì)量運行屏幕空間抗混疊,以更小的散景尺寸運行散景DOF(景深Depth of Field),因為這里的尺寸與性能是負(fù)相關(guān)的(更大的散景意味著更差的性能)。
如果最終你可以在其它系統(tǒng)中取得足夠的性能提升,你可以之后選擇性地把這些效果重新啟用。
(5.1)高存儲低質(zhì)量影響
(6)在單一鏡頭中限制貼花數(shù)量
如果在攝像頭中同時有許多彼此接近的貼花,有時這樣的代價是很大的。如果你有比如說50個貼花正同時被渲染,這對于性能可能有消極影響。試著稀釋或擴散這些貼花,那么就不會有那么多貼花同時被渲染了。
貼花設(shè)置,參考:http://m.manew.com/thread-96950-1-1.html
(7)以更低分辨率和更少變形渲染
如果你想要試著以稍低的分辨率和稍少的變形進行渲染來節(jié)省性能,試著做、看看它看起來和運行起來效果如何是非常簡單的。
當(dāng)游戲運行時,你可以打開控制臺輸入“r.screenpercentage 90”,其中90是全屏尺寸和渲染的百分比。
更永久的設(shè)置方法是:選中你的后步驟列表里的“覆寫屏幕百分比”框,之后將屏幕百分比設(shè)置成想要的百分比(小于等于100)。
(8)場景捕捉對象()
場景捕捉對象(如場景捕捉立方體)的默認(rèn)設(shè)置是捕捉每幀。捕捉這些基本涉及到從不同視角渲染整個場景(對于一個場景捕捉立方體來說,會這做6次,每次渲染立方體的一個面),還有從玩家的視角來渲染。這樣的代價明顯是很大的(如果一個場景中有許多這樣的對象尤其如此),所以,除非每幀都抓取它們是你的游戲的一個重要特點,抓取應(yīng)該被禁用。
總體來講,同樣的原因,限制場景抓取物件的總數(shù)量是有道理的。
(9)其它涉及事項:
(9.1)設(shè)置最大和最小幀率
可以在DefaultConfig.ini文件中設(shè)置來控制這個變量,默認(rèn)如下:
?[/Script/Engine.Engine]bSmoothFrameRate=true MinSmoothedFrameRate=22
MaxSmoothedFrameRate=62
(9.2)禁用遮擋剔除()
對于一些特定類型的游戲,遮擋剔除可能會花費比它本身所節(jié)省的時間更多。比如:在打斗游戲中,通常場景中的所有內(nèi)容都應(yīng)該是被渲染的,不常見的情況是許多幾何圖形被其他對象遮擋,在這些情況下,使用全局預(yù)計算可見復(fù)選框也許有幫助;
(9.2.1)設(shè)置 (參考:https://docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/VisibilityCulling/VisibilityCullingReference/)
- Project Settings?-> Rendering?-> Culling
?????????如果需要增大以屏占比基準(zhǔn)的剔除強度(代價是剔除效果比較突兀)以提升渲染效率,將以上三個數(shù)值屬性值增大;
- Actor:設(shè)置按實例距離,或者是否使用剔除距離體積來剔除Actor:
- ?剔除距離體積
- 預(yù)計算可視性場景設(shè)置:(World Settings -> Precomputed Visibility)
- 預(yù)計算可視性覆蓋體積(通常用于移動平臺)
?
????????覆蓋可見Actor(Override Visible Actors)
從該體積內(nèi)部查看時,預(yù)計算可視性始終視為可見的Actor數(shù)組。
????????覆蓋不可見Actor(Override Invisible Actors)
從該體積內(nèi)部查看時,預(yù)計算可視性始終視為不可見的Actor數(shù)組。
????????覆蓋不可見關(guān)卡(Override Invisible Levels)
從該體積內(nèi)部查看時,預(yù)計算可視性始終視為不可見的Actor所屬的關(guān)卡名稱數(shù)組。
6. 代碼編譯優(yōu)化
(1)藍圖和C++的性能差距不超過兩倍。(Game模式)
藍圖轉(zhuǎn)C++:參考:[UE4]藍圖轉(zhuǎn)換成C++代碼 - 一粒沙 - 博客園
(2)向量變換
盡量使用FTransform::TransformXXX()和FTransform::InverseTransformXXX,而不是FQuat::RotateVector和FQuat::UnrotateVector,因為前者使用了更多的當(dāng)前硬件支持的矢量匯編指令,榨干了硬件性能,而后者是為了跨平臺,老老實實使用C++代碼來執(zhí)行計算公式,雖然也調(diào)用了硬件匯編指令,但數(shù)量相對較少;
(3)VS2019:針對C++代碼編譯速度、以及CPUAVX/AVX2指令集下的矢量計算進行了更深入的優(yōu)化;
(3.1)編譯速度方面:完整編譯速度,VS2019(16.2)是VS2017(15.9)的3.5倍,增量編譯速度,VS2019(16.2)是VS2017(15.9)的1.6倍;
(3.2)代碼優(yōu)化方面:以游戲幀率作為測試標(biāo)準(zhǔn),VS 16.2相對16.0提升了2%到3%,而16.0相對15.9最大可以提升2.8%,也就是說使用VS2019編譯代碼,相比VS2017,可以讓游戲運行時幀率提升5%左右。
(4)斷點調(diào)試UE4中的內(nèi)聯(lián)函數(shù):用FORCEINLINE_DEBUGGABLE代替FORCEINLINE;
(5)代碼算法優(yōu)化:
(5.1)TArray清空:空間還要用時,用Reset()替代Empty(),因為前者不會銷毀內(nèi)存空間。
(5.2)TArray移除元素:元素順序不關(guān)心時,用RemoveAtSwap()代替RemoveAt(),前者是用數(shù)組末尾的元素來填補內(nèi)存空洞(移除元素后產(chǎn)生的無效內(nèi)存空間),而后者是對空洞后的所有元素平移。
(5.3)單個生產(chǎn)者單個消費者(SPSC)的線程環(huán)境,可以使用TCircularQueue作為消息隊列來保證數(shù)據(jù)安全,比使用FScopeLock消耗低,因為前者內(nèi)部使用的是atomic,而非lock(雖然atomic也算一種輕量級lock)。
(6)視距裁剪(剔除)
(6.1)使用Cull Distance Volume進行細(xì)粒度的視距裁剪。Project Settings中的Occlusion Culling只能通過一個臨界閥值來控制視距裁剪,而Cull Distance Volume可以設(shè)置多級裁剪參數(shù)。
7. 燈光優(yōu)化
(7.1)Lightmass Importance Volume:大場景,不添加則全局構(gòu)建光照貼圖產(chǎn)生全局Indirect Lighting Cache;添加則在指定區(qū)域構(gòu)建光照貼圖Indirect Lighting Cache;
(7.2)Cast Volumetric Shadow
點光源和聚光燈盡量不要開啟Cast Volumetric Shadow;默認(rèn)只有平行光開啟了此選項。開啟后的性能消耗為不開啟的性能消耗三倍。不開啟表示陰影計算方式使用Shadow Mapping,開啟表示使用Shadow Volume,前者的陰影計算沒有后者精準(zhǔn),但是計算量小;
(7.3)體積霧與燈光配合
如果開啟體積霧,建議將燈光改成靜態(tài)光,這樣在Build Lighting時會生成預(yù)計算的體積霧相關(guān)數(shù)據(jù),這樣可以顯著提升體積霧性能。體積霧性能消耗巨大。
(7.4)靜態(tài)光不用時禁用Static Lighting
(全是動態(tài)光 Movable Light 或者固定光 Stationary Light),則要禁用 Static Lighting,以節(jié)省 Static Lighting 相關(guān)的開銷(比如 LightMaps和ShadowMaps的相關(guān)計算)。禁用方式:Project Settings -> Engine -> Rendering -> Lighting -> disableAllow Static Lighting。
當(dāng)全動態(tài)燈光為性能瓶頸時,禁用Static Lighting可以提升性能。
(7.5)關(guān)閉Support Global clip plane for Planar Reflections,默認(rèn)關(guān)閉,開啟后消耗巨大。
(7.6)AO性能優(yōu)化(Ambient Occlusion)
在超大型場景中,一般燈光會是性能瓶頸之一,特別是動態(tài)光場景下。此時關(guān)閉AO可以大幅提高幀率(AO默認(rèn)為開啟,早期版本默認(rèn)是關(guān)閉的)。開啟AO后(Project Settings -> Rendering -> Default Settings ->Ambient Occlusion),引擎默認(rèn)的AO為SSAO(Screen Space Ambient Occlusion), SSAO無法進行預(yù)計算,所以GPU性能開銷較大,可以修改為DFAO(Distance Field Ambient Occlusion)以提升性能,因為DFAO可以預(yù)計算,代價是增加顯存開銷;
DFAO相關(guān)的兩個優(yōu)化選項:
- Compress Mesh Distance Fields: 通過壓縮Distance Fields volume texture來減少顯存占用,代價是當(dāng)使用Level Streaming時會出現(xiàn)Hitch。
- Eight Bit Mesh Distance Fields: 將Distance Fields volume texture從16位格式壓縮為8位格式,代價是AO視覺效果變粗糙;
8. 陰影優(yōu)化
(8.1)使用非靜態(tài)的Directional Light
(Stationary 或者 Movable),場景中有大量單位時,一定要開啟Dynamic Shadow Distance(默認(rèn)為0,表示關(guān)閉)。提升性能的原因:Dynamic Shadow Distance 表示在多少距離內(nèi)使用動態(tài)陰影,超過這個距離之外Fade成靜態(tài)陰影,而Fade成靜態(tài)陰影后就可以提升性能。
(8.2)邏輯控制Cast Shadow
雖然燈光提供了屬性DistanceField Shadow Distance來控制陰影根據(jù)攝像機距離投射,但是這種做法是一刀切。比如:假設(shè)性能瓶頸是大量怪物的陰影投射,遠(yuǎn)處山體和建筑的樹木的陰影投射對性能影響很小,此時使用DistanceField Shadow就會導(dǎo)致場景的表現(xiàn)效果大打折扣。推薦做法是,程序邏輯上控制:如果是怪物對象,只對離攝像機一定距離內(nèi)的怪物開啟陰影。
物體投射陰影的開關(guān):
void UPrimitiveComponent::SetCastShadow(bool NewCastShadow)。
9. 材質(zhì)優(yōu)化
(9.1)材質(zhì)類型的性能,從快到慢:Opaque -> Masked -> Translucent。
(9.2)大量單位:比如500個,那么這些單位一定要做材質(zhì)LOD,并盡可能多的去掉半透明材質(zhì)(比如在最后兩級直接去掉半透明效果),否則性能消耗呈指數(shù)級增長。
(9.3)GPUVisualizer的BasePass耗時較高,那么很大一部分原因是材質(zhì)復(fù)雜度過高。
(9.4)貼花:Decal消耗和像素數(shù)量有關(guān),程序功能絕對不要亂用貼花,美術(shù)鋪場景除外。比如程序想用貼花做一個范圍標(biāo)記,如果當(dāng)標(biāo)記范圍很大時絕對不要用貼花,可以改成劃線或者不通透貼圖。如果場景需要大量使用貼花,根據(jù)視距動態(tài)創(chuàng)建和銷毀貼花,僅僅SetVisibility是不夠的,隱藏后還是會有巨大的開銷;(待驗證)
(9.5)材質(zhì)種類:場景中的材質(zhì)種類要提前規(guī)劃好,拼場景時只在規(guī)劃好的材質(zhì)中選擇。如果同屏的材質(zhì)種類較多,會增加draw call。特別是場景美術(shù)用網(wǎng)上素材東拼西湊,很容易導(dǎo)致材質(zhì)種類數(shù)量急劇上漲。
/* Performance Guidelines for Artists and Designers
https://docs.unrealengine.com/latest/INT/Engine/Performance/Guidelines/? */
10. 植被優(yōu)化
10.1 地形編輯時,使用Instanced Static Meshes。Intancing會增加GPU的開銷,但是可以顯著降低CPU的開銷;注意:實際應(yīng)用中,Instancing并不能作為減少CPU draw call次數(shù)的主要途徑,因為實際的游戲場景不可能全是instanced mesh,即使是滿屏的植被,也并非一定要用instanced mesh。要減少draw call次數(shù),需要減少材質(zhì)種類,提高材質(zhì)復(fù)用率。
10.2 當(dāng)Instanced Mesh的數(shù)量較多時(比如百萬級),一幀內(nèi)執(zhí)行RemoveInstance或者UpdateInstanceTransform數(shù)次,幀率會狂瀉。優(yōu)化辦法:
(1)操作Instanced Mesh之前,將UHierarchicalInstancedStaticMeshComponent::bAutoRebuildTreeOnInstanceChanges設(shè)置為false,然后執(zhí)行你需要的各種Instanced Mesh操作;
(2)操作完之后,然后將bAutoRebuildTreeOnInstanceChanges設(shè)置為true;
(3)然后執(zhí)行BuildTreeIfOutdated(true, false);,這樣可以顯著減少因操作百萬級Instanced Mesh而導(dǎo)致的性能損失。
10.3 植被材質(zhì)消耗成為瓶頸時,寧可增加面數(shù),也不要使用 Translucent 材質(zhì),Masked酌情使用。比如一根草的面片,其整個形狀全部使用三角面拼出來,而不要用一個三角面再加 Mask 或者 Translucent 材質(zhì)的方式。
10.4 為Instanced Mesh設(shè)置合適的Cull Distance。
11. 物理與碰撞優(yōu)化
11.1 BoxComponent的 Generate Overlap Events 設(shè)置為false。如果不需要Overlap事件,那么就將該屬性設(shè)置設(shè)置為false,默認(rèn)為true。當(dāng)BoxCompont達到一定量級時,開啟Generate Overlap Events的性能消耗是關(guān)閉情況下的兩倍。
11.2 不需要物理,將 Simulate Physics?設(shè)置為false。
11.3 不需要Hit事件,將 Simulation Generates Hit Events?設(shè)置為false。
11.4 如果場景中物體類型(WorldStatic、WorldDynamic、Pawn等)很多,且每種數(shù)量也很多,則Collision 的 Object Response 通道設(shè)置的越少越好,把可以設(shè)置為 Ignore 的通道都設(shè)置為 Ignore 。如果場景中的物體類型比較單一,即使這種類型的物體在場景中有數(shù)百個,Object Response 即使都設(shè)置為Block 或者 Overlap,對性能也沒有影響。
11.5 如果是大型RTS游戲,場景有海量單位時(比如星際2中大規(guī)模的蟲族小狗),能不用UE4的 Collision 就不要用 Collision,否則幀數(shù)狂瀉。
建議自己實現(xiàn)一個簡易的自定義Collision,比如球形Collision,然后計算該 Collision 與單位之間的直線距離,來判斷是否是否發(fā)生了碰撞,并且降低檢測間隔,比如 0.1秒一次。用此種方式,如果單位數(shù)量較多時,還需要自己寫一個類似Distance Filed的八叉樹來緩存單位列表,以降低計算單位間距時遍歷單位列表的循環(huán)次數(shù)。
12. 動畫優(yōu)化
12.1 打開角色藍圖 -》 MeshComponent -》 Detail 面板中的 Optimization 類別下 -》 勾選 Enable Update Rate Optimizations。
12.2 只對渲染的 SkinnedMesh執(zhí)行 Tick 和 RefreshBoneTransforms
USkinnedMeshComponent::MeshComponentUpdateFlag = OnlyTickPoseWhenRendered;
默認(rèn)是AlwaysTickPoseAndRefreshBones,表示不管是否被渲染(在可見區(qū)域內(nèi)),都執(zhí)行 Tick 和 RefreshBoneTransforms。
舊版本中MeshComponentUpdateFlag叫做SkinnedMeshUpdateFlag。
注意:如果關(guān)閉動畫Tick,和Tick相關(guān)的邏輯就會失效,比如Transform (Modify) Bone。
12.3 ?動畫藍圖的邏輯盡量直接訪問成員變量,引擎默認(rèn)開啟了優(yōu)化選項:動畫藍圖中的成員變量在編譯時會被復(fù)制到Native Code中,從而避免在運行時進入藍圖虛擬機(Blueprint Virtual Machine)執(zhí)行藍圖代碼,因為藍圖VM運行效率低。
默認(rèn)會被編譯優(yōu)化的參數(shù)類型包括:
member variables;
negated boolean member variables;
members of a nested structure;
具體說明見官方文檔:
Animation Optimization
https://docs.unrealengine.com/en-us/Engine/Animation/Optimization
Animation Fast Path Optimization
https://docs.unrealengine.com/en-us/Engine/Animation/Optimization/FastPath
13. UI優(yōu)化
13.1 能用HUD解決的就不要用UMG,等到需要顯示時才創(chuàng)建Widget對象,不顯示時則銷毀,UMG對象較多時性能消耗巨大。
比如場景內(nèi)有一千個單位,每個單位上都創(chuàng)建有WidgetComponent,即使這些WidgetComponent沒有顯示任何東西,也會產(chǎn)生巨大的GPU開銷。
13.2 不能使用UMG來修改鼠標(biāo)光標(biāo),因為UMG來制作響應(yīng)速度較高的顯示邏輯時,會有肉眼可見的明顯延遲(由此可見UMG的性能消耗有多高),可以使用Hardware Cursors來代替UMG制作光標(biāo)。
* Epic Games工程師分享:如何在移動平臺上做UE4的UI優(yōu)化?
http://youxiputao.com/articles/11743
14. 位移優(yōu)化
14.1 海量Pawn(比如500個)單位移動,如果是在 Tick 中使用 AddMovementInput 移動,幀率直接下降一半(比如從90幀下降到40多幀)。對于無法移動的單位,最好停止執(zhí)行 AddMovementInput() ,以提升性能。
15. 特效優(yōu)化
盡量不要使用 Volume domain,使用后會顯著增加GPU開銷。可以通過 profilegpu 檢測 Volume 開銷。
16. AI優(yōu)化
如果角色不需要 Controller ,就不要給它 Spawn Controller。如果一個角色長時間停止,則先給他Unpossesed() ,等到可移動時再PossessedBy()。
測試:500個角色,AI Controller Class 設(shè)置為:null、 AIController、PlayerController 的幀數(shù)分別為 120 fps、 100 fps、75 fps。
17. Dedicated Server優(yōu)化
17.1 服務(wù)端cook時剝離動畫數(shù)據(jù)
Project Settings -> Engine -> Animation -> 勾選 Strip Animation Data on Dedicated Server。
如果在動畫中添加了觸發(fā)修改數(shù)據(jù)的 Notify Event,勾選此選項會有問題。請確保動畫中掛載的 Notify 只是表現(xiàn)相關(guān),不涉及游戲邏輯。
17.2 Server模式下禁用角色物理模擬
FBodyInstance->bSimulatePhysics 設(shè)置為false。默認(rèn)為false。
SkeletalMeshComponent::bEnablePhysicsOnDedicatedServer 設(shè)置為 false , 默認(rèn)為 true 。但這樣會導(dǎo)致物理驗算以客戶端為準(zhǔn),有被外掛hack的風(fēng)險。bEnablePhysicsOnDedicatedServer 在 run-time 修改不生效。
17.3 Server模式下禁用 Collision
UPrimitiveComponent->bGenerateOverlapEvents 設(shè)置為false,角色藍圖中的 CollisionComponent 默認(rèn)為true。
17.4 Server模式下Detach角色身上所有的裝飾性組件;
17.5 AnimInstance的Root Motion Mode不要修改為Root Motion from Everything,盡量使用默認(rèn)值Root Motion from Montage Only,以減少服務(wù)器的動畫同步計算量。
17.6 4.20提供了針對Dedicated Server優(yōu)化的新特性:Replication Graph,可以初略地理解為針對網(wǎng)絡(luò)通信的LOD(不過Replication Graph提供了不止網(wǎng)絡(luò)層面的LOD,更多特性見官方文檔)。沒有這特特性之前,調(diào)用Multicast函數(shù),幾公里外的Actor也會觸發(fā)Multicast,而實際上這種Actor可能不需要即時更新數(shù)據(jù)或者等到出現(xiàn)在視距內(nèi)時再手動ForceNetUpdate()。有了Replication Graph之后,這種手動優(yōu)化方式可以交給引擎自己管理。
總結(jié)
- 上一篇: 带参数的URLconf
- 下一篇: yii2笔记: 单元测试