【转】U3D手游《苍穹变》性能优化经验谈
4月11日,由unity公司舉辦的Unite 2016大會在上海正式舉行,在4月12日的案例分享專場會議上,天神互動U3D高級開發工程師康凱以手游《蒼穹變》為例講述了3DMMOARPG游戲開發過程中的優化思路和方法。
以下是演講實錄:
康凱:大家上午好,天神互動是一家2009年成立的公司,公司主要是開發MMO項目,產品有微端版的《蒼穹變》在騰訊游戲大廳上線,我這次分享的是我們開發的手游版《蒼穹變》的一些經驗。
我自己是天神互動unity3d高級開發工程師,在天神有機會參與PC版和手游版蒼穹變的設計、開發和優化方面的工作。蒼穹變手游iOS最低配置是iPhone4S,我從三個方面和大家分享開發蒼穹變手游版的經驗,主要按照項目時間順序。前期我們會準備基礎知識,因為蒼穹變手游是我們開發的第一款MMOARPG手游,接下來跟大家說一下開發過程中的關鍵點,最后是性能優化。
前期基礎準備工作對于整個后期的結果至關重要,所以我們做了一些知識方面的準備,包括CPU、GPU硬件支持我們自己科普了一下,包括驅動程序、圖形API,當時針對的平臺是iPhone,Unity深入的了解了一下,移動平臺上MMOARPG有一個很關鍵的矛盾,需要解決ARPG龐大復雜的功能需求和對性能的要求,游戲首先不能崩潰、不能卡頓還不能發燙,在移動平臺有限的硬件資源條件下做開發、比我們開發PC版的MMO復雜很多,我們面臨很多的挑戰。
這是我們的一些前期知識準備得到的結論,結論是一般3D游戲瓶頸主要在渲染方面,渲染問題包括三個方面,CPU、GPU和內存,由于手機上采用的是內存、顯存共享的方式,因此不存在傳統PC上數據從內存到顯存傳輸的瓶頸,在移動平臺上我們更加關注CPU和GPU。
CPU眾所周知最大的瓶頸是Drawcall,而它的本質是GPU不具備融錯內容,所以要求CPU的合法性,這樣導致一個比較嚴重的問題,在于我們的CPU向GPU提交數據。
開發過程中的關鍵點,首先團隊準備,我們先要確定目標機型,如果沒有目標這個事情無法衡量性能優化的指標是否達標,性能指標主要是Drawcall和內存如何在場景、角色、特效和UI之間進行分配,有句比較受用的話,說優化做的好、不如前期設計規劃的好,像這種大型項目,前期如果沒有一個良好的規劃,后續各個工種之間溝通上成本會非常高。
接下來我們講團隊成員對硬件達成共識,就是花一些時間對美術非技術人員,和策劃人員進行一些圖形學方面的培訓,這在一個大型項目中是非常值得的,告訴他們哪些東西消耗多少,我們需要怎么應對,有時候他們會想出更好的解決方案。
美術規范文檔,它的重要性在于如果是大型項目,像我們的MMOARPG一般團隊四五十人的規模,美術人員占比很高,如果前期沒有科學合理的規范,美術同學到項目后期會涉及到項目的大量返工,我們找了同行測試、調研,調研了八家公司。工作流同理,我們參與人員眾多,我們需要規劃清晰的工作流,確保每個部門的輸入輸出盡量減少耦合工作。工具準備,我們會前期準備好一些工具確保我們工作流的順暢。
接下來客戶端框架設計,我本人是客戶端開發工程師,所以只能給大家講講客戶端的框架設計,至關重要的三個方面,第一方面是資源加載模塊,包括依賴式打包,資源CDN放緩存,從服務器到硬盤,硬盤到內存如何妥善釋放掉。資源加載模塊是我們要解決的一號問題,因為這塊出問題整個游戲進不去的,整個開發過程中必須保證這一條通道的暢通,我們的做法是放最優秀的技術人員解決這方面的問題。
然后GamePlay框架,簡單說是角色的移動戰斗和換裝這塊,我們采用縱橫模式,縱橫框架縱向采用分層,舉個例子,角色管理器,角色管理狀態機這種縱向結構,每個底層不會有上層的引用。
接下來是UI框架,UI框架是我們放在第三個但重要性并不是第三,蒼穹變手游版客戶端代碼有20萬行,80%以上是UI的邏輯,UI對整個項目的高速開發非常重要,我們需要設計一套,并且UI程序員工作占比也比較高,一個開發團隊七八個客戶端大概有5到6人做UI邏輯這部分,部分需要高速并行的開發,策劃的需求變動比較劇烈,因此我們需要良好的UI框架讓各個模塊之間能夠并行、以比較良好的速度運轉。
然后談一下關于性能優化方面的經驗,但是請大家注意這次分享的是蒼穹變手游版的優化經驗,而蒼穹變手游我們定位的是iPhone4S這個機能的設備,有些東西不一定是非常適用于現在的iPhone5S之類,我們了解清楚基礎原理,再有目的的針對特定的機型做特定的優化。
關于TA(技術美術),大型團隊里面我們經驗是開發手游版的MMOARPG必須配備TA,要貨真價實的TA,因為3DMMO游戲是一種密集型的應用,最大量的硬件資源消耗在于圖形渲染,就是我們內存也好、CPU也好、GPU也好這方面需要有一個合格的TA幫我們解決美術資源到程序中的一系列問題,包括美術規范的制定和后期的優化方案的提出。
性能優化的基本原則是我們前提有一個技術美術,第一步是找到瓶頸,如前所說,憑借要么是CPU要么是GPU,而這兩方面的優化方案截然不同,如果問題出在CPU、優化GPU會得到相反的結果,找到瓶頸需要一些工具,推薦的是Adreno Profiler,,另外一個是Unity自己的工具,這個像紅框里面看到的,可以看到一些信息是被CPU卡住還是被GPU卡住。
接下來講紋理貼圖,第一步要解決紋理貼圖的問題,因為貼圖在ARPG游戲里面內存占比最高的,性能消耗也是最高的,紋理壓縮大家可以看一下公式,如果256x256貼圖不采用是256K,采用壓縮是32K,如果游戲有上百兆紋理題圖、那么壓縮后可能之為原來的5%,游戲包體能有更小,并且紋理貼圖的尺寸如果采用紋理壓縮,紋理貼圖的數據更容易被二級緩存緩存,也可以大幅提高性能,其實紋理壓縮并不是很復雜。
然后采用適合的尺寸,一個物件占屏幕100×100沒有必要采用256x256貼圖的,但是實際項目中參與美術人員眾多,場景規模非常大,紋理貼圖數量多,這一點是非常容易被忽視的,造成我們寶貴的內存和GPU、浮點運算的浪費。
接下來Alpha通道分離,這個問題我們到后期優化后解決不了這個問題,我們請了一個外國人,國外頂級的圖形學專家,他給我們說了一系列的優化方案,其中有一條叫做Alpha通道分離,是說Alpha通道的貼圖,建議拆成兩張一張不帶Alpha通道,一種是帶的,這個好處是紋理壓縮格式不帶Alpha通道,我們拆出來以后能夠兼容廣大的安卓設備,另外一條好處單獨拆分的Alpha通道可以縮減尺寸,因為Alpha通道圖大部分是不透明或者透明,基本是01,我們可以縮減尺寸可以對它進行更高強度的紋理壓縮。
然后我們說Shader優化的重要性,在于可變成渲染管道里面想接入GPU浮點運算次數,能做的是在于Shader,Shader這方面大家想象一下,我們假設象素著色器每一個象素額外多一部分乘法運算,iPhone 960×640的象素每幀要多6萬次的符點運算,如果Shader寫了多一步浪費乘法運算,每秒會多出3000萬次的浮點運算。減少象素著色器的運算量,我們建議優先采用低精度的數據類型,這些在某些GPU上能夠以更短的時間周期執行完畢,再說精確點這些在蘋果的GPU使用低精度浮點運算是這樣,安卓的設備上不一定。
場景,場景是游戲里面內存和GPU和CPU消耗大戶,怎么解決這個問題呢?一些比較有用的經驗是場景的Mesh烘焙后刪除多余的信息,當數量變成十萬級的時候是非??捎^的,我們的經驗是刪除之后在某些場景內存能夠節約3到5兆,iPhone4S上是不錯的,能把節約出來的這部分內存用來把場景做的更漂亮。另外地形用的是T4M,這是美術同學們自己總結,用T4M導出obj在3dmax里二次壓縮有更好的效果。接下來是植物,用Mesh雕刻邊緣,這些被切除的邊緣不會浪費掉寶貴的浮點運算次數。接下來手動區域合并,Unity自己自帶合并,有動態合并和靜態合并,這兩點我們項目沒有使用,靜態合批導致內存增大,我們采用的是手動區域合并,把臨近的物件進行網格的合并。
接下來角色,我們并沒有把角色做到次世代這么高的精度,角色的骨骼、動畫有些設備在CPU進行運算的,而CPU從4S到5S硬件跑分從2000分到1.5萬分性能翻7倍,但是CPU只是從兩個雙核1G到1.3G,因此角色技術是一個嚴峻的挑戰,在沒有有效技術解決同屏角色問題以前,我們對于角色的頂點數和骨骼數依然謹慎對待。然后動畫,動畫這塊耗CPU也耗內存,一個主角攻擊動作400K,所以降低動畫精度,縮短動畫時間,動畫按需加載,一個是SkinMeshRenderer。
接著特效,場景、角色和特效是性能三大殺手,特效對性能殺的是GPU,我們如果一個屏幕上疊加了960×640半透區域,那就是三千萬次乘以10,這個實際上我們游戲到現在依然沒有一個比較好的解決方案,只能是把這些采用Mesh雕刻,多余的部分進行切除,現在能解決是減少半透區域在屏幕的面積,我們測試整個屏幕的半透明的化、性能上幀數要掉10幀,如果一樣是420層的半透區域縮小到10×10象素可以跑滿幀,所以半透區域對性能影響是很大的,消耗了我們的浮點運算能力,也耗了寶貴電量。均勻分配特效時間,包括技能特效起飛、飛行爆炸,這些時候需要盡量的均勻分配粒子出現的時間。
到最后跟大家分享兩句比較受用的話,游戲一部分是基于科學的模擬,一部分是繪畫,我們可以采用一些障眼法,由整個團隊合作,由美術、技術和策劃想出一些好辦法能夠大幅度節約運算量達到比較好的效果。另外一部分是越是尊重和理解硬件的限制我們游戲越能得到良好的表現,我的演講完畢,謝謝大家。
(來源:GameLook)
總結
以上是生活随笔為你收集整理的【转】U3D手游《苍穹变》性能优化经验谈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】D3DLOCK详解
- 下一篇: 【转】Unity3D将来时:IL2CPP