隨著手游的火熱,移動端游戲慢慢變成了游戲中的主流類型,。許多知名工作室,、獨(dú)立工作室和獨(dú)立創(chuàng)作者都開始轉(zhuǎn)而進(jìn)行移動端游戲的制作。在制作游戲的過程中內(nèi)存的過度使用,,CPU性能限制等問題往往讓游戲創(chuàng)作者十分頭疼,。Unity的高級軟件工程師團(tuán)隊將為這些復(fù)雜技術(shù)問題提供支持并幫助創(chuàng)作者們大幅優(yōu)化移動端游戲性能。在本文中他們將與我們分享一些有關(guān)移動端游戲優(yōu)化的專業(yè)知識,,如果你對創(chuàng)作移動端游戲充滿熱情或是正苦于沒有好的引擎制作游戲,,那么不妨請繼續(xù)看下去。
多年的行業(yè)經(jīng)驗使得Unity的加速解決方案團(tuán)隊對游戲源代碼了如指掌,,與大量的用戶合作,,也使得他們能夠充分利用Unity引擎幫助用戶解決各種在開發(fā)中遇到的難題。他們深入到游戲項目之中,,幫助用戶確定游戲的性能優(yōu)化點(diǎn),,以獲得更高的速度,、穩(wěn)定性和效率,。
在本文中將詳細(xì)介紹如何通過用戶界面,、物理和音頻設(shè)置等功能來提高游戲性能。
現(xiàn)在讓我們開始吧,!
物理特性
Unity內(nèi)置的Physics (Nvidia PhysX)在手機(jī)上可能很耗費(fèi)資源,,但以下技巧可以幫助你每秒擠出更多幀。
優(yōu)化設(shè)置
在PlayerSettings中,,找到Prebake Collision Meshes
請確保你已經(jīng)編輯了Physics settings(Project Settings > Physics)并已經(jīng)簡化了?Layer Collision Matrix,。
禁用Auto Sync Transforms并啟用Reuse Collision Callbacks。
修改物理項目設(shè)置以提高性能,。
請留意性能分析器中的物理模塊,。
簡化colliders
使用Mesh colliders可能會很占用資源。用原始或簡化的Mesh colliders來替換更復(fù)雜的Mesh colliders,,來顯示原始形狀將會有效的節(jié)約資源,。
colliders使用基本體或簡化網(wǎng)格。
使用物理方法移動剛體
使用分類法,,如移動位置或者添加力移動你的剛體物體,。剛體的變形組件會直接導(dǎo)致物理世界的重新計算,這在復(fù)雜場景的創(chuàng)建中非常耗費(fèi)資源,。所以我們可以將物理物體移入固定數(shù)據(jù)而無需更新,。
修正Fixed Timestep
默認(rèn)值Fixed Timestep在項目設(shè)置中是0.02 (50 Hz)。更改此項屬性可以更好的匹配你的目標(biāo)幀速率(例如,,30 fps為0.03),。
但是,如果幀速率在運(yùn)行時下降,,這意味著Unity會每幀多次調(diào)用固定數(shù)據(jù),,這可能造成CPU性能負(fù)擔(dān)。
Maximum Allowed Timestep能夠限制物理計算和固定數(shù)據(jù)事件在幀速率下降時可以使用的時間,。降低該值意味著在性能故障期間,,物理引擎和動畫可能會變慢,同時也會降低它們對幀速率的影響,。
修改固定時間步長以匹配您的目標(biāo)幀速率,,并降低最大允許時間步長以減少性能故障。
使用物理調(diào)試器可視化
使用物理調(diào)試窗口(窗口>分析>物理調(diào)試器)來幫助解決碰撞或差異的任何問題,。
物理調(diào)試工具可以幫助用戶可視化物理對象之間的交互方式,。
用戶界面
Unity用戶界面(UGUI)經(jīng)常會成為性能問題的來源。畫布組件能夠為用戶界面元素生成并更新網(wǎng)格,,并向圖形處理器發(fā)出繪制調(diào)用,。它的功能可能很耗費(fèi)資源,,因此在使用UGUI時,請記住以下要素,。
區(qū)分開畫布
如果有一個包含數(shù)千個元素的大畫布,,更新單個用戶界面元素會迫使整個畫布一起更新,這可能會讓CPU達(dá)到峰值,。
利用UGUI支持多個畫布的能力,。根據(jù)需要刷新的頻率劃分用戶界面元素。將靜態(tài)的用戶界面元素保留在單獨(dú)的畫布上,,將動態(tài)元素同時更新到較小的子畫布上,。
這樣能夠確保每個畫布中的所有用戶界面元素具有相同的Z值、材質(zhì)和紋理,。
隱藏不可見的用戶界面元素
在游戲中偶爾會出現(xiàn)一些用戶界面元素(例如,,當(dāng)角色受到傷害時會出現(xiàn)的生命條)。如果啟用不可見用戶界面元素,,它可能仍在使用繪制調(diào)用,。此時需要精確禁用所有不可見的用戶界面組件,并根據(jù)需要重新啟用它們,。
但如果你只需要關(guān)閉畫布的可見性,,那么請禁用畫布組件而不是游戲?qū)ο蟆_@可以節(jié)省重建網(wǎng)格和頂點(diǎn)的時間,。
限制圖形投射并禁用光線投射目標(biāo)
屏幕觸摸或點(diǎn)擊等輸入事件需要圖形投射功能,。這在用戶界面矩形變換的過程中簡化了屏幕上的每個輸入點(diǎn)的循環(huán)。
從頂層畫布刪除圖形投射默認(rèn)值,。相反,,添加圖形投射將專門針對需要交互的單個元素(按鈕、滾動條等),。
禁用反轉(zhuǎn)圖形,,默認(rèn)情況下處于激活狀態(tài)。
另外,,我們還可以在所有不需要的UI文本和圖像上禁用射線投射目標(biāo),。如果用戶界面很復(fù)雜,有很多元素,,所有這些細(xì)小的改變都可以減少不必要的計算,,節(jié)省資源。
如果可能,,禁用射線投射目標(biāo),。
避免布局組
布局組更新效率低,所以要注意謹(jǐn)慎使用,。如果你的內(nèi)容不是動態(tài)的,,就完全沒有必要使用布局組功能,,你可以使用比例布局的錨點(diǎn)?;蛘咴谠O(shè)置用戶界面后創(chuàng)建自定義代碼來禁用布局組組件,。
如果你確實需要對動態(tài)元素使用布局組(水平、垂直,、網(wǎng)格),,請避免嵌套它們以提高性能,。
布局組會降低性能,,尤其是嵌套時。
避免大的列表和網(wǎng)格視圖
大列表和網(wǎng)格視圖非常占用資源,。如果需要創(chuàng)建一個大的列表或網(wǎng)格視圖(例如,,有數(shù)百個項目),不要為每個項目創(chuàng)建一個用戶界面元素,,請考慮重用一個較小的用戶界面元素池,。
避免大量重疊的元素
將大量用戶界面元素(例如,堆疊在紙牌游戲中的紙牌)分層會造成資源透支,。自定義你的代碼,,以便在運(yùn)行時將分層元素合并成更少的元素和批次。
使用多種分辨率和縱橫比
現(xiàn)在的移動設(shè)備大多有著不同的分辨率和屏幕尺寸,,創(chuàng)建用戶界面的替代版本可以在每臺設(shè)備上提供最佳體驗,。
使用設(shè)備模擬器預(yù)覽各種屏幕格式。
使用全屏用戶界面時,,隱藏所有其他內(nèi)容
如果暫?;蜷_始屏幕覆蓋了場景中的所有其他內(nèi)容,你需要禁用正在渲染3D場景的相機(jī),。同樣,,禁用隱藏在頂部畫布背后的任何背景畫布元素也能有效提升游戲性能。
在全屏用戶界面期間你可以適當(dāng)降低Application.targetFrameRate,,因為我們不需要以60 fps的幀率進(jìn)行更新,。
將相機(jī)分配給世界空間和相機(jī)空間畫布
離開事件或者渲染相機(jī)字段的空白會迫使Unity填寫主攝像機(jī),這是不必要的資源浪費(fèi),。
這時你可以使用屏幕空間–覆蓋功能,,因為這不需要攝像頭的參與。
使用世界空間渲染模式時,,請確保填寫事件攝影機(jī),。
音頻
雖然音頻通常不是性能瓶頸,但你仍然可以對其進(jìn)行優(yōu)化以節(jié)省內(nèi)存,。
優(yōu)化音頻剪輯的導(dǎo)入設(shè)置,。
盡可能使用原始未壓縮的WAV文件作為你的源資產(chǎn)
如果你使用任何壓縮格式(如MP3或Vorbis)的音頻,,你需要使用Unity將它解壓縮,然后在構(gòu)建時重新壓縮它,。這會導(dǎo)致兩次音頻有損,,降低最終質(zhì)量。
壓縮剪輯并降低壓縮比特率
通過壓縮減少剪輯的大小和內(nèi)存使用:
對于大多數(shù)音頻(或MP3文件對于不循環(huán)的音頻)我們可以使用Vorbis對其進(jìn)行壓縮,。
使用自適應(yīng)差值脈沖編碼調(diào)制(ADPCM),,經(jīng)常使用的聲音(例如,腳步聲,、槍聲),。與未壓縮的PCM相比,這將縮小文件,,但在回放的過程中可以快速解碼,。
移動設(shè)備上的音效上限是22050Hz。使用較低的設(shè)置通常對最終質(zhì)量影響最??;這需要用自己的耳朵去判斷。
選擇合適的負(fù)載類型
設(shè)置因片段大小而異,。
小剪輯(<200 kb)應(yīng)該加載時解壓縮,。將聲音解壓縮為原始的16位PCM音頻數(shù)據(jù)會增加CPU使用率和內(nèi)存,因此此方法只適合短聲音,。
中等剪輯(<= 200 kb)應(yīng)該保留在內(nèi)存中壓縮,。
大文件(背景音樂)應(yīng)該設(shè)置為流動,否則整個資產(chǎn)將立即加載到內(nèi)存中,。
從內(nèi)存中卸載靜音音頻源
在創(chuàng)建靜音按鈕時,,不要簡單地將音量設(shè)置為0。你可以將音頻源組件從內(nèi)存中卸載,,但前提是玩家不會經(jīng)常打開和關(guān)閉它,。