1. 程式人生 > >Unity3D優化技巧系列二

Unity3D優化技巧系列二

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。

繼續給讀者分享Unity3D關於優化技術,首先我們要做的是找到優化目標,對於專案我們主要關心的是程式執行效率,資源載入處理換句話說就是包體的大小,最後是程式碼的設計,下面就給讀者逐一分析講解:

一、程式優化

很多開發者認為程式優化主要是美術的事情,其實不然,程式碼寫的不好一樣的卡頓,舉個例子,對於類似一些子彈類的特效,如果每次使用的時候去生成,使用完再銷燬,這樣會導致產生很多記憶體碎片,從而會導致卡幀的情況發生,這個就是程式自己的事情了,解決方式使用物件池進行預載入處理。再舉一個例子

,比如我們經常討論的資源載入的效率,記得我以前做一款橫版遊戲時,有一個功能是從2D場景切換到3D場景,為了不影響體驗中間不能加進度條,需要直接載入。這個問題比較棘手,有的同學可能會說,預先載入,但是由於前面也有場景資源而且佔用一部分記憶體,如果預載入會產生記憶體瞬間增大,導致記憶體崩掉,這種方式行不通。讀者可以考慮一下相機的裁剪範圍,3D相機是通過視景體裁剪的,在視景體外的物體不參與渲染,這樣可以優化效率,我們的解決方案也是基於這種方式處理的,採用的方式是通過設定攝像機的視距逐步增大處理的,可以用一個for迴圈,依次增大相機的距離,剛開始距離比較小,載入的資源比較小,速度非常快,進入場景後再逐步放大,這種方式解決了我們的問題。

再通過案例說一下,也是程式碼導致的問題,比如大家在開發介面時喜歡用靜態類去做,如果只是幾個類還是可以接受的,多了就會出問題。為什麼呢?這就要介紹一下靜態類和單例類的區別,關於這個問題在面試時也經常被問到。靜態類是常駐記憶體的,它會一直佔用記憶體,一般在遊戲開發中會用靜態類去處理。其它的用單例模式去做,這樣的好處是在程式執行時只保留一個備份。單例模式主要是針對管理類處理的,這也體現了模組化思想。

二、資源的處理

再說一下資源的載入效率優化,很多專案開發並沒有對建模進行優化,比如模型的面數控制在多少?模型的材質都有哪些?這個關係到模型佔用記憶體的大小,網上也有很多關於這方面的介紹,其實這個沒有一個固定的標準,因為現在硬體提高很快,但是我們自己在製作時要本著一個原則,就是模型面數儘量少,可以通過材質去表現的,可以使用比較少的面去處理,也就是Shader的渲染,材質渲染要注意的問題是儘量少用透明材質或者說有深度測試的Shader,如果在遊戲場景中使用的比較多,會比較耗的。因為他要改變渲染狀態模式,材質的使用原則有高光,法線,環境對映這些貼圖,這些渲染主要是針對玩家自身的,不要對遊戲中所有的角色進行這樣的渲染。在策劃製作美術需求時,儘量考慮到美術材質的重用問題,也就是建立美術的素材庫。

作為遊戲中的主角,不僅需要材質渲染而且還需要在其身上掛武器還有要生成特效,對於網路遊戲來說,同屏的人數越多這些處理也要耗費CPU和GPU,在製作時需要考慮到粒子對於遊戲的影響,遊戲中的粒子特效生成和消失都要消耗CPU計算的,而粒子的材質渲染需要GPU提供支援。針對這種情況,我們只能去自己測試,比如在場景中加入多少個粒子影響效率,為了測試方便我們需要整一個小的Demo去測試,把遊戲場景也放進去,模擬遊戲的環境,不用整太多程式碼,可以讓特效隨機播放,必須打包到手機上進行測試,同樣的原理也可以測試角色動作這些。分開測試完成後再將它們整合在一起,再測試一下效率,這樣也就是我們所說的壓力測試,測試結果可以供美術參考後期製作。當然實際執行還要在遊戲中檢視效率,這個會在後面給讀者介紹。

三、架構設計

遊戲架構設計與優化也是息息相關的,沒有遊戲架構的產品在上線後進行版本迭代時會出現問題,這也是考驗產品的架構設計,運營會根據使用者對上線產品的反饋做出改變,運營會快速的提出需求,要求產品增加功能或者調整數值等等。能否快速的響應這些需求變化?這就要看架構設計了。常用的架構設計有MVC,工廠模式,抽象工廠模式,狀態模式以及FSM有限狀態機等等。

其實做架構設計的目的是幫助開發者能夠在已有的框架下快速的開發以及迭代邏輯開發,大家可以思考一下,遊戲團隊是多個人協助完成的,如果沒有架構,在開發邏輯的時候,每個人都是按照自己的想法去整,那樣就亂套了,如果是一個人開發還好,多個人那就容易出問題了。如果後期這個人離職,新來的人看不懂,再按照自己的想法重新再搞一套就形成了一個惡性迴圈。這個專案後期就死掉了。

架構設計首先應用在遊戲UI上,使用的架構設計是MVC,每個UI對應的就是View也就是窗體的顯示,C就是控制View的切換也就是UI的切換,M表示的遊戲介面的數值操作。這樣程式只需要在對應的View模組和Cotrol模組下寫邏輯就可以了,非常方便。而且這麼做的好處另一個是可以真正的將程式和美術分離開,美術製作不影響程式的實現,UI上不要掛接任何指令碼,可以在程式執行時動態掛載,方便美術更新效果。

遊戲中的角色都有自己的動作,動作之間是可以切換的,很多程式的寫法就是封裝動作介面,直接傳一個引數,這樣的缺點就是很容易搞混,特別是對於多個動作之間互相切換時容易發生錯誤,而如果採用FSM有限狀態機就可以避免這種問題發生,技能特效也可以應用FSM有限狀態機去設計。

在MVC模式的運用上,還可以用於武器模組的開發,在槍戰遊戲中,玩家可以更換多種槍支,槍支顯示可以用View,更換可以用Controller去控制,Model模組就是槍支的資料,最近我們就用這種設計模式開發了一款槍戰遊戲。

架構設計不拘泥於形式,遊戲的種類無非就是那麼幾種,對於開發者來說能夠熟練掌握幾種架構設計模式就足夠了。

以上寫的三點,目的是告訴讀者在解決效率優化時要多思考,不能只侷限於某個方面,從下篇部落格開始講解具體執行。