物理
Unity 的內(nèi)置物理系統(tǒng) (Nvidia PhysX) 在移動設(shè)備上開銷較大。下面的提示可以幫助您每秒減少更多幀。
優(yōu)化設(shè)置
在 PlayerSettings 中,盡可能選中 Prebake Collision Meshes。
啟用 Prebake Collision Meshes
請務(wù)必同時編輯 Physics 設(shè)置 (Project Settings > Physics)。盡可能簡化 Layer Collision Matrix。
禁用 Auto Sync Transforms 并啟用 Reuse Collision Callbacks。
修改物理項目設(shè)置以進(jìn)一步提高性能
留意 Profiler 的 Physics 模塊是否有性能問題
簡化碰撞體
網(wǎng)格碰撞體開銷較大。用簡單的原始碰撞體或網(wǎng)格碰撞體代替更復(fù)雜的網(wǎng)格碰撞體來近似原始形狀。
使用原始或簡化網(wǎng)格來表示碰撞體
使用物理方法移動剛體
使用類方法(如 MovePosition 或 AddForce)來移動 Rigidbody 對象。直接轉(zhuǎn)換其 Transform 組件可能導(dǎo)致重新計算物理世界,在復(fù)雜場景中,這樣需要較大開銷。
在 FixedUpdate 中而不是 Update 中移動物理體。
修改固定時間間隔
Project Settings 中的默認(rèn) Fixed Timestep 是 0.02 (50 Hz)。根據(jù)目標(biāo)幀率對此進(jìn)行更改(例如,對 30 fps 設(shè)置為 0.03)。
否則,如果幀率在運行時下降,也就是說 Unity 每幀都多次調(diào)用 FixedUpdate,可能會因物理內(nèi)容過多而造成 CPU 性能問題。
Maximum Allowed Timestep 對幀率下降時物理計算和 FixedUpdate 事件可以使用的時間進(jìn)行限制。降低該值意味著在性能頓挫過程中,物理系統(tǒng)和動畫會緩慢下來,但也會減小其對幀率的影響。
將以減 Fixed Timestep 修改為與目標(biāo)幀率相符,降低 Maximum Allowed Timestep 以減少性能毛刺
通過 Physics Debugger 實現(xiàn)可視化
使用 Physics Debug 窗口 (Window > Analysis > Physics Debugger) 可幫助故障檢查有問題的碰撞體或者出現(xiàn)差異的情況。下面是一個顏色編碼的指示器,指示哪些游戲?qū)ο罂梢韵嗷ヅ鲎病?/p>
Physics Debugger 可幫助您可視化物理對象能夠相互交互的方式
有關(guān)更多信息,請參閱 Unity 文檔中的物理調(diào)試可視化。
https://docs.unity3d.com/cn/current/Manual/PhysicsDebugVisualization.html
用戶界面 UI
Unity UI (UGUI) 常常是性能問題的來源。Canvas 組件生成和更新 UI 組件的網(wǎng)格并向 GPU 發(fā)出繪制調(diào)用。它的運行開銷很大,因此,在使用 UGUI 時,請注意以下因素。
Unity UI 文檔:
https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/index.html
劃分畫布
如果是包含成千上萬個元素的大型畫布,更新單個 UI 元素就必須更新整個畫布,這可能會造成 CPU 尖峰。
利用 UGUI 的功能可以支持多個畫布。根據(jù) UI 元素的更新頻率要求,劃分這些元素。將靜態(tài) UI 元素保留在單獨的畫布上,將同時更新的動態(tài)元素保留在較小的子畫布上。
確保每個畫布中的 UI 元素都有相同的 Z 值、材質(zhì)和紋理。
隱藏不可見的 UI 元素
可能有些 UI 元素(如僅當(dāng)角色收到傷害時才出現(xiàn)的生命值血條)只偶爾在游戲中出現(xiàn)。如果不可見的 UI 元素是活動的,它仍然可能使用繪制調(diào)用。顯式禁用所有不可見的 UI 組件,在需要時再重新啟用。
如果只需要關(guān)閉畫布的可見性,請禁用 Canvas 組件而不是游戲?qū)ο?。這樣就不必重新構(gòu)建網(wǎng)格和頂點。
限制 GraphicRaycaster 和禁用 Raycast Target
輸入事件(如屏上觸摸或單擊)需要 GraphicRaycaster 組件。它只是循環(huán)處理屏幕上的每個輸入點,檢查它是否在 UI 的 RectTransform 之內(nèi)。
從層級視圖的頂層畫布中移除默認(rèn)的 GraphicRaycaster。只向需要交互的各元素(按鈕、滾動矩形等)添加 GraphicRaycaster。
禁用在默認(rèn)情況下處于活動狀態(tài)的 Ignore Reversed Graphics
另外,在所有不需要 Raycast Target 的 UI 文本和圖像上將其禁用。如果是包含很多元素的復(fù)雜 UI,所有這些小更改都可以減少不必要的計算。
盡可能禁用 Raycast Target
避免使用布局組
布局組的更新很低效,應(yīng)少量使用。如果內(nèi)容是動態(tài)的,應(yīng)完全避免不用,而是使用錨點進(jìn)行比例布局?;蛘?,創(chuàng)建自定義代碼,在 Layout Group 組件設(shè)置 UI 之后,將該組件禁用。
Layout Group 文檔:
https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIAutoLayout.html
如果動態(tài)元素確實需要使用布局組(水平、垂直、網(wǎng)格),應(yīng)避免嵌套它們,從而改善性能。
布局組會降低性能,尤其是在嵌套時
避免使用大型列表和網(wǎng)格視圖
大型列表和網(wǎng)格視圖開銷很大。如果需要創(chuàng)建大型列表或網(wǎng)格視圖(如包含成百上千項目的物品欄屏幕),可以考慮重復(fù)使用較小的 UI 元素池,而不是為每個項目都創(chuàng)建 UI 元素。請參閱此示例 GitHub 項目了解實際方法。
GitHub 項目:
https://github.com/boonyifei/ScrollList
避免大量使用重疊元素
對大量 UI 元素(如卡牌游戲中堆疊的卡牌)分層會造成過度繪制。自定義代碼在運行時將分層元素合并到更少的元素和批次中。
使用多種分辨率和寬高比
現(xiàn)在,移動設(shè)備使用的分辨率和屏幕大小極為不同,創(chuàng)建不同的 UI 版本可以按設(shè)備提供最佳體驗。
UI 版本:
https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/HOWTO-UIMultiResolution.html
使用設(shè)備模擬器可以預(yù)覽 UI 在各種受支持的設(shè)備上的呈現(xiàn)。您也可以在XCode 和 Android Studio 中創(chuàng)建虛擬設(shè)備。
設(shè)備模擬器:
https://docs.unity3d.com/Manual/com.unity.device-simulator.html
使用設(shè)備模擬器預(yù)覽各種屏幕格式
使用全屏 UI 時,隱藏其他全部內(nèi)容
如果暫停屏幕或者啟動屏幕遮住場景中的其他全部內(nèi)容,則禁用攝像機對 3D 場景的渲染。同樣,禁用隱藏在頂層畫布之后的所有背景畫布元素。
由于不需要以 60 fps 的幀率進(jìn)行更新,可以考慮在全屏 UI 過程中降低 Application.targetFrameRate。
將攝像機分配給世界空間畫布和攝像機空間畫布
將 Event 或 Render Camera 字段留空會使 Unity 填充 Camera.main,這會導(dǎo)致不必要的開銷。
盡可能使畫布 RenderMode 采用 Screen Space - Overlay,這樣就不需要攝像機。
使用世界空間 (World Space) 渲染模式時,請務(wù)必填充 Event Camera
音頻
盡管音頻通常不會造成性能瓶頸,還是可以進(jìn)行優(yōu)化以節(jié)省內(nèi)存。
盡量使用單聲道聲音剪輯
如果要使用 3D 空間音頻, 請以單聲道 (single channel) 的形式創(chuàng)作聲音剪輯,或者啟用 Force To Mono 設(shè)置。在運行時定位使用的多聲道聲音會扁平化為單聲道源,因此會增加 CPU 開銷和浪費內(nèi)存。
盡可能使用原始未壓縮 WAV 文件作為源資源
如果使用任何壓縮格式(如 MP3 或 Vorbis),Unity 會將其解壓并在構(gòu)建時重新壓縮。這樣會導(dǎo)致兩個有損通道,從而降低最終質(zhì)量。
壓縮剪輯并降低壓縮比特率
通過壓縮減小剪輯的大小和內(nèi)存使用量 :
對大多數(shù)聲音使用 Vorbis(或者對不循環(huán)的聲音使用 MP3)。
對常用的短聲音使用 ADPCM(如腳步聲、槍聲)。相比于未壓縮的 PCM,這樣可以減小文件大小,在播放時又可以很快解碼。
移動設(shè)備上的音效最高為 22,050 Hz。使用較低設(shè)置通常對最終質(zhì)量影響很小,當(dāng)然,請使用您自己的耳朵來判斷。
優(yōu)化 AudioClip 的導(dǎo)入設(shè)置
選擇正確的加載類型
每個剪輯大小的設(shè)置都不同。
小剪輯 (< 200 kb) 應(yīng)采用 Decompress on Load。將聲音解壓縮為原始 16 位PCM 音頻數(shù)據(jù),會導(dǎo)致 CPU 開銷和內(nèi)存占用,因此,這僅適用于短聲音。
中等剪輯 (>= 200 kb) 應(yīng)保持為 Compressed in Memory。
大文件(背景音樂)應(yīng)設(shè)置為 Streaming。否則,整個資源會一次性加載到內(nèi)存中。
從內(nèi)存中卸載靜音的音頻源 (AudioSources)
實現(xiàn)靜音按鈕時,不要只是將音量設(shè)置為 0。可以銷毀 AudioSource 組件,從而將其從內(nèi)存中卸載,這樣,播放器不需要過于頻繁地切換開關(guān)。