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