在過去一年里,很多端游進(jìn)入手游市場在榜單上大獲成功,但考慮到性能及用戶屬性等,如果僅僅照搬端游的玩法,在開發(fā)過程中可能會遇到很多風(fēng)險。《天龍八部3D》是搜狐暢游自主研發(fā)的一款游戲,它是3D的MMO系統(tǒng),在去年10月進(jìn)行公測及上線之后,得到了很多玩家的認(rèn)可,取得了不錯的成績。所以,今天我想來分享一下在使用Unity引擎制作《天龍八部3D》游戲的過程中遇到的一些經(jīng)驗和教訓(xùn)。
《天龍八部3D》技術(shù)方案揭秘
首先,我先簡單介紹一下《天龍八部3D》項目的基本情況。《天龍八部3D》在公測之初的24小時便獲得了1257萬的流水,首日導(dǎo)入大概110萬的用戶,在內(nèi)地以及臺灣、香港的iOS付費(fèi)及免費(fèi)榜均取得過TOP1的成績,在iPhone暢銷榜的最高排名是TOP3。正式上線之后的首月流水是2.3億,從“凌波微步”、“武林大會”到最近的“丐世英雄”,《天龍八部3D》推出的資料片流水均高于公測時,這個事例可以體現(xiàn)MMOARPG的生命力還是比較頑強(qiáng)的。
在技術(shù)層面上,結(jié)合服務(wù)器端和客戶端的整體考量,《天龍八部3D》主要運(yùn)用了以下幾種技術(shù)方案:
完整的動態(tài)負(fù)載均衡方案。單服務(wù)器支持一萬人同時在線,在人數(shù)上漲時可以調(diào)動整個服務(wù)器的負(fù)載均衡,讓一萬人都能流暢、穩(wěn)定地運(yùn)行。服務(wù)器內(nèi)部通訊機(jī)制。充分利用硬件資源。比如在一臺物理機(jī)上開兩個服務(wù)器,當(dāng)一個人多而另一個人少的時候,服務(wù)器會自動通過動態(tài)負(fù)載均衡調(diào)用更多的硬件支持人多的服務(wù)器。異常處理機(jī)制。帶有垃圾回收功能的對象池。
在服務(wù)器上,我們有較高的穩(wěn)定性和容錯性,可以穩(wěn)定運(yùn)行三周以上。這對其他類型的游戲可能并不是一件特別重要的事情,但對于MMORPG來說,卻極為重要。因為MMORPG是具備成長性和完整性的游戲,而MMORPG用戶對在線時間的要求要高于普通游戲,我們必須依靠于穩(wěn)定運(yùn)行機(jī)制來讓用戶在線時長得到保證。
而在客戶端,則有穩(wěn)定的幀率和順暢的操作感,里面帶有高效的動態(tài)資源管理策略,可以保證客戶端的內(nèi)存方面不會出現(xiàn)特別大的問題,導(dǎo)致客戶端閃退等。此外,還有成熟的性能優(yōu)化解決方案,其實在去年剛起步時我們還是一頭霧水,但經(jīng)過一年多的努力和學(xué)習(xí),我們基本上已經(jīng)學(xué)會了一套在客戶端上性能優(yōu)化的完整解決方案。
從端游到手游,如何打造驚艷的移動端畫面表現(xiàn)?
手游和端游不同,做移動端游戲,面數(shù)是一個很大的問題,手游上面數(shù)較少,而《天龍八部3D》則將游戲資源與美術(shù)相結(jié)合,從定制化的場景到人物材質(zhì)都是一種3D的表現(xiàn),這樣可以保證美術(shù)資源在面數(shù)較少的情況下,也能達(dá)到漂亮、驚艷的效果,如圖1所示。
圖1 《天龍八部3D》游戲界面截圖
《天龍八部3D》項目是從2013年11月開始立項,作為毫無手游開發(fā)經(jīng)驗的前端游研發(fā)團(tuán)隊,整個開發(fā)流程可以說是摸著石頭過河,不過幸好我們整個團(tuán)隊已在一起工作六年,非常默契,能夠較快地將想法實現(xiàn)。
項目最初一個月,我們都在探索著嘗試各種美術(shù)風(fēng)格定位,后來開始著手研究Unity引擎開發(fā),在2013年12月底,我們使用Unity做了一個Demo,基本上代表了之后的美術(shù)方向和整個玩法的基本雛形。
經(jīng)過從α、β到Golden版本的優(yōu)化演進(jìn),《天龍八部3D》從初具雛形到公測、正式上線,在此過程中真正運(yùn)用了哪些Unity技術(shù)?
大量的Unity自帶技術(shù),比如導(dǎo)航的組件等;遮擋刪除;lightMapping,用以解決光照問題;將NGUI與Unity相結(jié)合可以很方便地構(gòu)建出一個強(qiáng)大的UI系統(tǒng);Unity自帶的粒子系統(tǒng);Editor功能,可以很方便地開發(fā)各種小工具,大幅提高工作效率,比如UI輔助、圖片處理、編譯、國際化、阻擋生成等;AssetBundle,一種非常有效的資源管理方式,既可以打包、控制內(nèi)存使用,還可實現(xiàn)資源的動態(tài)更新;Unity自帶的性能分析工具Profiler,能解決所有性能問題。
下面再給大家介紹一下《天龍八部3D》中使用的一些實用方案。
緩存池機(jī)制
《天龍八部3D》游戲最初的定位是能夠在512MB的內(nèi)存上都能良好穩(wěn)定地運(yùn)行,于是,我們便使用了一種叫做緩存池的機(jī)制,這是一種內(nèi)存換時間幀率機(jī)制,《天龍八部3D》的NPC、玩家、特效、聲音等均有使用,它能夠提供較好的流暢度體驗,但需要一部分小額內(nèi)存。
資源釋放機(jī)制
在游戲運(yùn)行過程中需要找到一個合理的釋放點(diǎn),如果跑在1G以上的機(jī)器上,可能相對容易,但要兼容低端機(jī)型,合理的釋放點(diǎn)則非常重要。
《天龍八部3D》中常用的釋放點(diǎn)有兩個,分別為轉(zhuǎn)場景時釋放一些非全局資源、每次打開界面一秒后進(jìn)行一次主動調(diào)用GC的操作。這是我們權(quán)衡了很久的做法,但實際效果還很不錯。當(dāng)時我們?yōu)榱思嫒莸投藱C(jī)型運(yùn)用了緩存池的功能,在512MB設(shè)備上運(yùn)行會變卡,而且還無法控制,最終我們在打開操作界面時執(zhí)行緩存池,盡管實際出現(xiàn)卡頓但玩家卻不會有感覺,這屬于是一種比較取巧的方式。
值得開發(fā)者們注意的是,在將所有東西打包成AssetBundle時,需劃分出依賴關(guān)系,單個界面的AssetBundle最好不要超過1M,單個模型骨骼數(shù)不超過32個,角色和NPC控制在2000面以下。
最后,再來說一下《天龍八部3D》游戲中使用到的優(yōu)化方案。
客戶端大小優(yōu)化
《天龍八部3D》在剛立項時,市面流行的客戶端大小都在100M以下,當(dāng)時我們做了很多策略,包括分包下載、動態(tài)資源更新、壓縮貼圖、盡量重用資源等,最后,在上線時客戶端大小為150M。
內(nèi)存優(yōu)化
代碼中申請內(nèi)存一般是New來操作,用完內(nèi)存還要進(jìn)行一次標(biāo)記釋放,比如置空或發(fā)送Destroy消息。如果讓GC幫助釋放內(nèi)存的話,會出現(xiàn)卡頓,這個時候就需要選擇合適的時間點(diǎn)來控制GC。
盡可能多地重用資源
一般貼圖占用內(nèi)存大,如果盡可能地重用會很節(jié)省內(nèi)存。程序代碼中的內(nèi)存池、對象池如果用完,在必要的時候可以主動調(diào)用GC釋放。而做好AssetBundle資源關(guān)系的動態(tài)加載、卸載等也能省下很多內(nèi)存。
按照C++的思想來管理內(nèi)存,比如使用內(nèi)存池、對象池、手動卸載、主動GC等,能夠在內(nèi)存和幀率之間做好平衡。另外,規(guī)劃好美術(shù)資源的重復(fù)利用也相當(dāng)重要,它能夠減少包的大小,比如NPC變色多場景可共用,制備、水等很多場景的美術(shù)資源制作也可重復(fù)利用。
佟慶 《天龍八部3D》制作人;王華 《天龍八部3D》主程