如今越來越多的開發(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é)计贰,但請(qǐng)注意顶别,這里并不能反映出游戲的真實(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è)備劫乱。
直接對(duì)設(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è)備上測(cè)試游戲尺栖,從而避免此類問題,保證您的游戲能夠在絕大多數(shù)設(shè)備上正常運(yùn)行烦租。
雖然等到項(xiàng)目開發(fā)后期再做優(yōu)化這種想法很常見延赌,但此時(shí)的性能問題可能已堆積成山除盏。因此最好的做法是周期性地檢測(cè)游戲,例如在每個(gè)里程碑達(dá)成時(shí)進(jìn)行性能分析挫以。這樣隨著游戲不斷修改者蠕,需要進(jìn)行的優(yōu)化工作也會(huì)越來越少,也能越來越快地找到性能瓶頸所在掐松。
搞定渲染優(yōu)化這個(gè)大目標(biāo)之前踱侣,應(yīng)該先保證腳本不會(huì)出現(xiàn)問題。如果您是程序員大磺,最好在把鍋甩給美術(shù)之前先檢查一下腳本是否有性能問題(哪怕真的是美術(shù)的鍋B站洹)
Unity初學(xué)者通常最大的誤解在于過于依賴Update()函數(shù)。將所有內(nèi)容都塞到Update()中確實(shí)是最容易的做法杠愧,例如檢查某個(gè)狀態(tài)并根據(jù)狀態(tài)做出相應(yīng)動(dòng)作等待榔,但如果場(chǎ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拜马,對(duì)某個(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)用崩侠,您還可以深入探究。
如果您對(duì)響應(yīng)式編程有興趣屁柏,可以參考UniRx - Reactive Extensions插件啦膜。這是為Unity設(shè)計(jì)的響應(yīng)式編程拓展,支持LINQ異步及多線程淌喻、LINQ訂閱到事件等等僧家。
在Unity中,除了UI之外并沒有什么比較容易的辦法來檢測(cè)某個(gè)GameObject在屏幕上的點(diǎn)擊裸删。OnMouseDown() 函數(shù)對(duì)于移動(dòng)平臺(tái)并不生效八拱。一種可行的方案是使用射線。從攝像機(jī)出發(fā)涯塔,以屏幕上手指點(diǎn)擊的位置為方向肌稻。如果射線檢測(cè)到某個(gè)對(duì)象則調(diào)用該對(duì)象的方法。
可以先定義一個(gè)Touchable類匕荸,一個(gè)Touchable層爹谭。觸摸到某個(gè)對(duì)象時(shí)則調(diào)用下面的方法:
如果檢測(cè)到觸摸操作作用在帶有Touchable的游戲?qū)ο笊希瑒t調(diào)用該對(duì)象的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)行測(cè)試,希望這篇文章對(duì)正在使用Unity進(jìn)行開發(fā)的朋友們有幫助哺哼。我們還會(huì)分享一些Unity項(xiàng)目制作及優(yōu)化經(jīng)驗(yàn)在Unity官方中文社區(qū)(unitychina.cn)佩抹,請(qǐng)保持關(guān)注!
Unity開發(fā)Android應(yīng)用優(yōu)化指南(下)
轉(zhuǎn)載自Unity官方中文社區(qū)