《球球大作战》游戏优化之路(上)
自從2015年《球球大作戰》發布以來,現已擁有五億多的玩家。如此龐大的玩家群體,對游戲的畫面,性能要求是非常高的。在Unite Shanghai 2019大會中,《球球大作戰》客戶端主程王國祎和資深技術徐宇峰帶來了關于《球球大作戰》優化之路。
本文將分享《球球大作戰》客戶端主程王國祎演講部分,他將分享《球球大作戰》升級到Unity 2017版本遇見升級問題和資源問題,以及如何去處理解決。
?
演講內容
大家好,感謝大家來聽我們的分享。我是《球球大作戰》客戶端主程王國祎,主要負責《球球大作戰》的客戶端開發。之前都是以聽眾角度參加Unite大會的,這次作為一個演講嘉賓過來參加,感覺體驗還是不太一樣,很有新鮮感。
簡單介紹一下《球球大作戰》,這是一款多人休閑競技游戲,主要強調多人合作玩法,玩法簡單上手,但想要達到高的級別或段位,還是比較困難的。
《球球大作戰》發布于2015年,當時很多游戲的玩家現在都上了初中或高中。就像《超級馬里奧》或《魂斗羅》可以成為我們這一代人的回憶一樣,我也希望《球球大作戰》能成為他們的長久陪伴,這也是我創作游戲的初衷。
?
升級Unity 2017
《球球大作戰》早期使用Unity 4.7開發,所以整個表現效果都是Unity 4.7版本,后來我們也嘗試升級了Unity 5的版本,但發現問題還是比較多,所以我們去年做了Unity 2017版的升級,我們會在下面分享升級過程遇到的一些問題,后面還有優化的過程和新的方式。
先講第一部分,是我們升級Unity 2017遇到的一些問題。最開始我們也嘗試升級Unity 2018版本,我們試了Unity 2018.1和Unity 2018.2,在轉換過程中的問題還是可以接受的,但上線測試時發現了兼容性問題,最后我們還是選擇使用比較穩定的版本,也就是Unity 2017.4.3。
小提示:Unity每個周期會有3個TECH技術前瞻版本和1個LTS長期穩定支持版本,Unity一直建議對已發布的游戲采用LTS版本,也就是Unity 2017.4或者Unity 2018.4,從而避免遇見上文提到的兼容性問題。請閱讀:Unity全新的版本發布計劃。
為什么選擇Unity 2017呢?主要是因為它和Unity 4.7有一些不同的地方。
?
1、ASTC圖片壓縮格式
我們一開始嘗試在Android和iOS同時使用該格式,后來經過大量測試發現Android不支持這個格式機型占比很高,最后在Android系統上還是使用原有的ETC和ETC2格式,只在iOS上使用ASTC格式。
iOS在iPhone 5S及以下機型硬件會走原解壓的過程,整個圖片的加載速度會比之前稍微慢一些,但我們覺得速度測試下來還是比較理想的,所以還是堅持在iOS系統使用ASTC格式。
2、Bundle LZ4的壓縮
在Unity 4.7版本時,我們基本是不做壓縮和解壓縮的,中間會用LZMA做傳輸過程的壓縮,這樣在壓縮和解壓方面不會占用時間。
到了Unity 2017.4后,因為它本身就支持LZ4的壓縮,不管從解壓速度和內存大小來說,它都是很少的,所以我們最后決定用LZ4。
3、Bundle文件的異步加載和讀取
在使用Unity 4.7時,我們在加載非壓縮文件時是走同步的方式,因為本身Unity也沒有做異步加載Bundle的接口,但是Unity 5.x以上版本就支持這個接口了,所以我們這邊Bundle是使用了異步加載的方式。
4、運行時設置分辨率
我們有一些優化測試下來發現,該游戲本身手機的分辨率可以達到很好的提高幀率并降低消耗的效果。
Unity 2017.4和Unity 4.7在設置分辨率有一個很大的不同是,之前在Unity 4.7降低分辨率時,在Android系統會出現閃一次黑屏現象,這在Unity 2017.4上是沒有的,所以我們可以用這個特性來動態調整屏幕的分辨率。
在特定場景中,例如:高渲染的場景中,可以動態調低分辨率,使用戶可以在沒有感知的情況下提高幀率。
5、Camera RT縮放分辨率可提高幀率
在Unity 4.7上我們嘗試過在Camera縮放分辨率,但是沒有效果。在Unity 2017之后,我們嘗試這個方式發現效果比較明顯,發現平均幀率可以提高15幀左右。但是帶來的問題是,可能顯示上有稍許的差別,沒有原始的不改分辨率的情況好。
6、Android支持IL2CPP
Android支持IL2CPP主要是為了Google之后發版本的。
7、支持GPU Instance
我們在年初的時候制作一個3D的玩法,如果是Unity 4.7的話,這個玩法在我們的機子上就爆表了,因為同場景渲染的動作非常多。
在升級到Unity 2017時,使用GPU Instance幫了很大的忙。尤其在動作處理這塊,可以動態合批,然后它合成的效果非常好。
8、動畫系統可以對指定區域縮放
最后一點也是美術吐槽非常多的,那就是Unity 4.7動畫調整的時候,不能對指定區域進行縮放,它只能一幀一幀地調,這是升級后緩解最大的一點。
Q1:游戲幀率降低
下面簡單說下升級2017后遇到的一些問題,這些問題是我們沒想到會發生的。因為我們想:升級引擎只是對一些資源,效果會有一些提升,甚至效率會提升。但升級完之后,測試發現在同等手機,同等內容的情況下,幀率反而會減低。
?
我們對問題查了很久,做了很多版本的比對,甚至對不同版本,不同客戶端進行差異的比對。測試下來的效果是:Unity 2017在同等情況下比Unity 4.7要低10幀左右。這主要發生在中端偏低端的機型,正常的中端以上機型沒有這個問題,甚至表現效果會更好。
我們測試問題的時候,還做了獨立的只有核心玩法的版本,這個版本拋離了游戲以外的系統,只有核心玩法。這樣是想更好地測試過程,并盡快地排除問題,
因為這些問題比較難發現,所以這個版本一直是我們測試的核心版本,而且這個版本也做了動畫錄制的功能,把每一局的表現的協議和腳本都錄制下來,每一局都是自動播放,這樣循環地查看問題,查看每個幀率的表現,最后找到這些問題。
?
有幾個選項上的切換,一個是Android上的Blit Type。
Blit Type選項在Unity 2017版本上是2.0之后開放的,也就是說2.0之前是沒有這個選項的。我們測試時發現,把這個選項關掉后,幀率確實提升了很多,提升了5-6幀左右,我們發現它對中低端硬件的渲染影響還是比較大的。
我們與Unity官方技術支持交流,他們說針對不同的游戲,手機靚號賣號平臺這個選項可能選擇自動的會比較好。但是測試下來發現,可能因為我們的游戲對3D和渲染光照方面使用的不是很多,所以去掉該選項,使用Never可能效果會更好。
因為我們的游戲表現上看起來是一款2D游戲,所以對鏡頭上的HDR和抗鋸齒MSAA不是很實用,所以我們會在Camera組件中,去掉勾選Allow HDR和Allow MSAA這二個選項。
還有光照這塊,因為游戲沒有使用實時光,所以我們在Lighting設置去掉Realtime Lighting和Mixed Lighting選項。調整了這些選項后,幀率持平了原來的游戲表現。
?
Q2:資源問題
下面是轉換上的資源問題。球球到現在為止的皮膚總量已經超過4千多個,也就是意味著我們在轉換過程中要排查每一個資源,和舊的資源去比對,會不會有顯示上的問題。這是非常巨大的工作量。
?
這邊一個問題就是,我們有一些美術同學可能前期從一些舊的資源里,使用Mesh導出的文件包含中文的命名,這是為以后埋了一個坑。
雖然在Unity 4.7里沒有問題,會顯示一個橫杠,不會顯示中文名,顯示上不會有問題。但同樣的資源轉到Unity 2017后,顯示上會出現一些引用丟失的情況。
我們分析過后,發現Meta文件中的Unicode碼丟失了,所以需要手動地把這些復制過去,所以這是當時解決問題比較棘手的地方,因為當時都是手動復制的,幸好這些中文的資源不是特別多。
?
還有就是轉換之后粒子縮放的問題。因為球球的皮膚之間是互相疊加的,疊加之后為了做相互的疊加效果,會有Z軸的壓縮。所以轉換之后,粒子的縮放模式變成了Hierarchy模式,根據主節點一起縮放。
這個問題導致的效果是,Z軸上的粒子表現縮放會有縮放的顯示問題,會有穿插,最后表現的效果是和大小縮放后的效果不是很一致。
我們向Unity反饋過這個問題,Unity也在跟蹤處理這個問題。我們現在改成了Local模式,因為我們自定義了一個縮放的腳本來控制球體和粒子放大縮小后的效果。
?
Q3:打包問題
接下來分享我們碰到的一些打包上的問題。
?
我們的美術資源現在有6G多,在舊版本中打包耗時非常長,耗時通常要半個小時左右。在資源量非常大、冗余之后,工程啟動也非常慢。
升級Unity 2017之后,資源在打包速度和工程開啟速度上都有些提升,但還是沒達到理想的情況。
我們采取的方式是把老舊資源拆解到另外一個工程里面,保證二個工程的引用是統一的,Guid也是統一的。這樣在老工程中的資源是不進行打包處理的,只打包新的資源,這樣提高了很多打包速度,Unity打開美術工程資源的速度也會非???。
?
我們在Unity 4.7導出的是一個Eclipse的項目,所以在打包時哪怕文件很多也不會有打包失敗的情況。但是使用Android Studio的時候,如果使用默認設置的話,會出現打包失敗。
這個失敗問題比較奇葩,它不會給你提示錯誤,只是打包時間非常非常漫長,甚至在最后沒有結束的時間。
我們也查了很多資料了解這個問題,最后發現是要調整緩存,在打包Android Studio時,如果本身包含的文件非常多,要記得把緩存改大一些,要不然打包時會有問題。
?
在導出iOS工程時,我們會導出XCode工程,發現每次導出時Framework Search Paths的目錄,就是庫引用的目錄每次都會被清空。
我們有很多第三方的庫是需要被引用的,而且打包是自動的,iOS這邊導出后會自動設置好,所以后面改了方法,是在導出時使用PBXProject.SetBuildProperty方法,把需要引用的庫再動態地添加上去,來解決這個問題。
?
客戶端版本
這是我們測試的一種方式。我們游戲對玩家手感操作的敏感度可能非常高,也就是說,如果一個版本發布后,和之前的手感有所差別,對我們是比較災難性的結果。
所以我們測試使用二個版本,一個叫預覽版,一個叫正式的線上版。玩家正常玩的都是線上版,然后我們會推送給玩家預覽版,預覽版的賬號和服務器是通用的,只有客戶端不同,一個是普通的是Unity 4.7版本,另一個是升級之后的Unity 2017的版本。
我們讓玩家體驗這二個版本,并且給反饋,因為玩家會在同一個手機上體驗二個版本,所以給出的反饋都是比較真實的,都是比較及時有效的。我們覺得這個方法是最有效的測出問題的方法。
?
版本兼容,渠道更新
我們線上其實一直存在二個版本,因為我們早期嘗試使用過5.x版本去升級。當時做完后發現效果并不好,而當時盲目樂觀地直接用5.x版本進行開發,導致新制作的資源都回退掉了。
我們進行Unity 2017版本升級的時候,直接拆成了二個版本,也就是說正式開發過程還在Unity 4.7上,無論是美術還是程序,都在老版本開發。
線上還會同時存在老版本和新版本,開發的內容和功能在Unity 4.7版本更新好后會合并到Unity 2017的版本,并同步更新出去。二個版本一般會有三個月的兼容期,盡量讓玩家把測試期縮短,讓玩家在里面反饋問題。
我們會在部分渠道先上傳一些版本,然后小范圍地進行更新,目的是不影響玩家的情況下進行更新,擔心新版本的兼容性會存在問題。
?
球球優化
下面講一下球球的優化,前面我們講了球球的升級,其實升級的目的是想通過升級的一些手段去做新一輪的優化。
以前我們會從技術角度去做問題的排查和優化,例如:玩家網絡有問題,反映延遲很高。我們覺得把TCP換成UDP,并且調到比較好的主干網絡或機房網絡,會解決這些問題。其實并不然。
有一次我參加《球球大作戰》的見面會,一個玩家吐槽他連接自家WiFi時非???#xff0c;延遲非常高。他上網查問題,搜了一些帖子,發現有人回復說把防火墻關掉,他嘗試后發現真的好很多。出現這個問題我想的是可能他的網絡把UDP常用端口屏蔽掉了,然后只能走不是UDP常用的端口。
通過這個問題,我們發現玩家往往發現的問題不是我們要優化的點。我們從技術角度想的一般是網絡上換一個網絡底層,把DrawCall降低,以為這樣就解決了問題。其實并不是,我們要從玩家的角度去查找到這些問題。
制定美術資源標準
我們之前的美術標準都是一刀切,例如:最高不可以是多少Drawcall、面數、骨骼數。
但美術在制作資源的時候,如果低于這個標準,例如很簡單的資源,美術會覺得反正低于這個標準,那么就多加一些特效。如果超過這個標準,但是又是重點的付費道具,短時間無法優化好。
我們總結發現,美術資源標準要差異化。
下圖是我們新制定的美術標準。
?
對于美術或游戲來說,我們的道具分普通的道具和炫酷的道具,我們要把檔位精細化,有界定的指標確定一般的檔位是多少,然后是比較炫酷道具的指標,再定最大指標。
這樣美術操作時會覺得比之前靈活很多,會知道自己制作的資源屬于什么檔位,然后按檔位去做優化。
LOD優化
還有就是針對游戲的LOD優化,因為《球球大作戰》看上去更像是一個2D游戲,和3D游戲的LOD優化不太一樣。
我們使用的方法是皮膚像素占屏幕像素的比例差,進行高低品質資源的切換,在球體非常小的時候,我們會提供低配的提前渲染好的圖片。
因為我們試過簡化特效粒子,發現不管是工作量還是效果都不是很理想,后來我們發現玩家主要注意的視野都是大球,而不會很關注小球。所以我們采取的方法是,提前渲染好圖片,替換到比較小的資源上,在玩家球體很小時,使用圖片渲染。
?
手機性能分類
對于手機機型劃分,很多優化方式對玩家或多或少有影響,所以我們想針對不同機型對游戲做優化。最開始其實沒有按機型分,因為我們覺得機型太多無法劃分。
我們的方法比較投機取巧,那就是使用CPU型號去做手機型號分檔。網上可以找到CPU梯度圖,不同CPU在不同檔位,只要獲取玩家的CPU信息就可以對應到不同的檔位里面。
但測試后發現這個方法不太樂觀,因為我們遇到一個現象:有的手機CPU處于中檔,但是屏幕分辨率卻非常高,這時會出現整體性能表現降低的現象,所以我這種方式不太靠譜。
?
我們最后選擇的方法是:由于游戲運營已久,有大量的玩家幀率卡頓日志,所以我們通過玩家的幀率、每局游戲得到幀率差值、最高最低值等,決定該局游戲的幀率范圍。
然后過濾出來手機在運行時是處于高檔機型、低檔機型、還是中檔機型。這個分檔比較靠譜,雖然這樣涉及機型較多,但準確性比之前的方法高很多。
我們發現周邊的同事都在不停的換新款手機,所以我們會習慣認為玩家的手機也在不停更新換代。通過游戲數據我們發現千元機占了60%多的用戶,這也讓我們把優化重點放在這些手機型號上。
網絡卡頓
下圖是我們每局結束都會上報的網絡使用情況,我們還沒對數據做處理,而是對上報結果進行分析。
我們覺得玩家手機使用4G基站網絡,或使用WiFi,過程是路由器到主干網,主干網到游戲服務器。這只是把主要網絡情況監控下來,后期會做一些篩選和定制化的策略,例如一些提醒,這是我們后面要做的事。
?
小結
在《球球大作戰》優化之路的中,我們將繼續分享本次演講巨人網絡資深技術徐宇峰講述后期游戲制作中的優化方式,敬請期待。
總結
以上是生活随笔為你收集整理的《球球大作战》游戏优化之路(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Unity开发一款塔防游戏(一):攻击
- 下一篇: 《球球大作战》游戏优化之路(下)