如今越來越多的開發(fā)者使用Unity開發(fā)Android及iOS項(xiàng)目,開發(fā)過程中難免會(huì)遇到一些性能方面的問題,例如掉幀、延遲和卡頓等等,導(dǎo)致游戲體驗(yàn)變差甚至毫無游戲體驗(yàn)可言。今天這篇文章將由Niels Tiercelin,為大家分享深入剖析Unity項(xiàng)目優(yōu)化過程的上半部分。
建議使用Unity Profiler工具(Window > Profiler)來分析項(xiàng)目性能,該工具以圖形化的方式呈現(xiàn)游戲具體的行為、計(jì)算所需的時(shí)間以及每幀渲染的時(shí)長等等,包含所有可能會(huì)影響性能的數(shù)據(jù)。
使用該工具非常簡單,只需點(diǎn)擊圖表本身(例如點(diǎn)擊圖表中的某個(gè)高峰)就可以查看該幀的詳細(xì)計(jì)算數(shù)據(jù)。Unity會(huì)顯示耗時(shí)最長的處理步驟。如果并不理解其中某個(gè)處理步驟的意義,也很容易在網(wǎng)上搜索來查找相關(guān)內(nèi)容。
Unity Profiler 本身在編輯器環(huán)境下運(yùn)行,并展示游戲運(yùn)行的細(xì)節(jié),但請注意,這里并不能反映出游戲的真實(shí)性能。由于Unity編輯器需要處理游戲本身以及額外的內(nèi)容,因此此時(shí)的游戲運(yùn)行速度會(huì)比構(gòu)建之后的游戲慢一些。
使用Unity Profiler無法得知游戲運(yùn)行的真實(shí)性能,所以需要在設(shè)備上運(yùn)行游戲并進(jìn)行分析。下面以Android設(shè)備為例,配置Android SDK和JDK后構(gòu)建項(xiàng)目,然后就可以開始使用Remote Profiler了。
在Build Settings中(File > Build Settings)同時(shí)勾選 “Development Build” 和 “Autoconnect Profiler”,并確保 Editor Settings 設(shè)置中的 “Device” 一欄為 “Any Android Device”。
現(xiàn)在將設(shè)備連接到計(jì)算機(jī)并運(yùn)行游戲。正常情況下Unity中會(huì)出現(xiàn)Profiler窗口,顯示設(shè)備的運(yùn)行狀態(tài)。如果Profiler窗口未出現(xiàn),則打開Profiler窗口,在 “Active Profiler” 下拉菜單中選擇類似 “AndroidPlayer(ADB…)” 的條目,這個(gè)一般就是您的設(shè)備。
直接對設(shè)備本身進(jìn)行分析可以更精確地獲取游戲的性能數(shù)據(jù),因此優(yōu)先考慮這種方法。
另一種獲取信息的方式是編輯器日志。游戲構(gòu)建完畢后立刻打開Console窗口(Window > Console),在窗口的右上方有一個(gè)按鈕,點(diǎn)擊后選擇 “Open Editor Log”。
此時(shí)系統(tǒng)會(huì)打開一個(gè)文檔,其中包含很多構(gòu)建相關(guān)的信息,特別是構(gòu)建文件的大小以及資源占據(jù)的空間等。
Android開發(fā)相當(dāng)復(fù)雜,可能會(huì)出現(xiàn)很多問題。因?yàn)槟硞€(gè)性能問題可能僅在某些設(shè)備上出現(xiàn),而在另外一些設(shè)備上完全不是問題。因此應(yīng)該在不同設(shè)備上測試游戲,從而避免此類問題,保證您的游戲能夠在絕大多數(shù)設(shè)備上正常運(yùn)行。
雖然等到項(xiàng)目開發(fā)后期再做優(yōu)化這種想法很常見,但此時(shí)的性能問題可能已堆積成山。因此最好的做法是周期性地檢測游戲,例如在每個(gè)里程碑達(dá)成時(shí)進(jìn)行性能分析。這樣隨著游戲不斷修改,需要進(jìn)行的優(yōu)化工作也會(huì)越來越少,也能越來越快地找到性能瓶頸所在。
搞定渲染優(yōu)化這個(gè)大目標(biāo)之前,應(yīng)該先保證腳本不會(huì)出現(xiàn)問題。如果您是程序員,最好在把鍋甩給美術(shù)之前先檢查一下腳本是否有性能問題(哪怕真的是美術(shù)的鍋?。?/p>
Unity初學(xué)者通常最大的誤解在于過于依賴Update()函數(shù)。將所有內(nèi)容都塞到Update()中確實(shí)是最容易的做法,例如檢查某個(gè)狀態(tài)并根據(jù)狀態(tài)做出相應(yīng)動(dòng)作等,但如果場景中的每個(gè)GameObject都要在Update()里檢查非常多的東西或進(jìn)行復(fù)雜操作,就會(huì)大大影響游戲性能。
所以,在使用Update()之前,首先問一問自己,要實(shí)現(xiàn)的功能真的需要逐幀運(yùn)行嗎?
如果不是必須逐幀運(yùn)行,還可選擇其他幾種方式來實(shí)現(xiàn)。例如,可以利用協(xié)程(Coroutines)讓某個(gè)方法每秒鐘運(yùn)行一次:“yield return new WaitForSeconds (1);”
可以用下面的方法刷新UI:
還可以每兩幀調(diào)用一次方法來進(jìn)行某種復(fù)雜計(jì)算,如下:
善用Events、Actions,響應(yīng)式編程(Reactive Programming)
調(diào)用方法真正高效地方式是僅在需要時(shí)調(diào)用。例如當(dāng)某個(gè)變量改變時(shí)、某個(gè)方法被調(diào)用時(shí),或者某個(gè)事件發(fā)生并彈出UI菜單時(shí)等等。這就是響應(yīng)式編程的基本原理,即利用Events,對某個(gè)事件作出反應(yīng)。
在C#中您可以使用委托,尤其是Action委托,來創(chuàng)建事件。當(dāng)事件發(fā)生時(shí)調(diào)用某個(gè)函數(shù),然后由該函數(shù)去調(diào)用訂閱了該事件的方法。
例如,創(chuàng)建 “玩家跳躍”事件,在代碼中每當(dāng)玩家跳躍時(shí)就會(huì)發(fā)起這個(gè)事件。例如某個(gè)方法生成了一些灰塵效果或者播放跳躍音效,將該方法訂閱到“玩家跳躍”這個(gè)事件上,玩家跳起來時(shí)就會(huì)調(diào)用生成灰塵效果播放音效的方法。這僅僅是一種簡單的應(yīng)用,您還可以深入探究。
如果您對響應(yīng)式編程有興趣,可以參考UniRx - Reactive Extensions插件。這是為Unity設(shè)計(jì)的響應(yīng)式編程拓展,支持LINQ異步及多線程、LINQ訂閱到事件等等。
在Unity中,除了UI之外并沒有什么比較容易的辦法來檢測某個(gè)GameObject在屏幕上的點(diǎn)擊。OnMouseDown() 函數(shù)對于移動(dòng)平臺(tái)并不生效。一種可行的方案是使用射線。從攝像機(jī)出發(fā),以屏幕上手指點(diǎn)擊的位置為方向。如果射線檢測到某個(gè)對象則調(diào)用該對象的方法。
可以先定義一個(gè)Touchable類,一個(gè)Touchable層。觸摸到某個(gè)對象時(shí)則調(diào)用下面的方法:
如果檢測到觸摸操作作用在帶有Touchable的游戲?qū)ο笊?,則調(diào)用該對象的OnTouchDown()方法。
檢查腳本時(shí)一定要檢查物理交互相關(guān)的代碼(如果存在)。當(dāng)然,移動(dòng)設(shè)備上最好不要有此類代碼,但如果無法避免,應(yīng)特別注意以下幾點(diǎn):
- 動(dòng)態(tài)剛體(Rigidbody)的數(shù)量越少越好,它們會(huì)大量消耗計(jì)算性能。
- 使用基礎(chǔ)碰撞體,避免使用網(wǎng)格碰撞體,后者的計(jì)算處理要復(fù)雜得多。
- 盡量將“Collision Detection Mode” 設(shè)置為 “Discrete”,因?yàn)?“Dynamic” 會(huì)用掉更多的性能。
- 最后,可以在TimeManager窗口(Edit > Project Settings > Time)中設(shè)置 “Fixed Timestep” 的值。這個(gè)值表示兩次FixedUpdate()調(diào)用之間的時(shí)間間隔。
所以Fixed Timestep值越小表示函數(shù)調(diào)用越頻繁,從而獲得更精確的模擬計(jì)算結(jié)果,代價(jià)則是消耗更多的資源。反之,該值越大越能降低處理物理相關(guān)數(shù)據(jù)所占用的時(shí)間,如果不需要特別精確的計(jì)算結(jié)果這也是一個(gè)很好的選擇。
本文暫時(shí)為大家分享到這里,下一篇將繼續(xù)為大家講解。優(yōu)化通常需要花費(fèi)大量時(shí)間來尋找性能瓶頸并進(jìn)行測試,希望這篇文章對正在使用Unity進(jìn)行開發(fā)的朋友們有幫助。我們還會(huì)分享一些Unity項(xiàng)目制作及優(yōu)化經(jīng)驗(yàn)在Unity官方中文社區(qū)(unitychina.cn),請保持關(guān)注!
Unity開發(fā)Android應(yīng)用優(yōu)化指南(下)
轉(zhuǎn)載自Unity官方中文社區(qū)