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