Unity開發(fā)Android應(yīng)用優(yōu)化指南(上)

如今越來越多的開發(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)先考慮這種方法锥涕。

選擇設(shè)備作為“Active Profiler”

另一種獲取信息的方式是編輯器日志衷戈。游戲構(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ū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末取董,一起剝皮案震驚了整個(gè)濱河市棍苹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茵汰,老刑警劉巖枢里,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蹂午,居然都是意外死亡栏豺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門豆胸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奥洼,“玉大人,你說我怎么就攤上這事晚胡×榻保” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵搬泥,是天一觀的道長桑寨。 經(jīng)常有香客問我,道長忿檩,這世上最難降的妖魔是什么尉尾? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮燥透,結(jié)果婚禮上沙咏,老公的妹妹穿的比我還像新娘。我一直安慰自己班套,他們只是感情好肢藐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吱韭,像睡著了一般吆豹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天痘煤,我揣著相機(jī)與錄音凑阶,去河邊找鬼。 笑死衷快,一個(gè)胖子當(dāng)著我的面吹牛宙橱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蘸拔,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼师郑,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了调窍?” 一聲冷哼從身側(cè)響起宝冕,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陨晶,沒想到半個(gè)月后猬仁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡先誉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年湿刽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐耳。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诈闺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铃芦,到底是詐尸還是另有隱情雅镊,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布刃滓,位于F島的核電站仁烹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咧虎。R本人自食惡果不足惜卓缰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砰诵。 院中可真熱鬧征唬,春花似錦、人聲如沸茁彭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽理肺。三九已至摄闸,卻和暖如春善镰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪薪。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工媳禁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人画切。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像囱怕,于是被迫代替她去往敵國和親霍弹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容