基於Cocos2d的MMORPG開發經驗

此次跟你們分享的是《基於Cocos2d-x的回合MMORPG開發經驗》,咱們主要是以LUAC++來開發項目,使用二者的緣由之一是LUAC++語法簡單,而且LUA開發穩定性好,不容易形成崩潰,並且它支持在線更新的機制。用LUA開發的話,邏輯代碼和資源文件會比較好,這個優勢在多平臺運營的時候很明顯。由於你更新了一個軟件以後,須要先下載平臺,這個時候若是用其餘軟件編輯會致使全部的數據不同。這個模式的第二個優勢就是出現邏輯錯誤之後咱們能夠將錯誤的信息從玩家處收回來,進行錯誤信息的蒐集。第三個優勢是內存垃圾回收,以往C++內存垃圾回收是很麻煩的,用LUA的話,你只要可以按時去清除變量,基本上不須要去擔憂內存的使用狀況。所以LUA在腳本里面的使用算是比較好的。 前端

 

不過這種模式也會有一些問題,好比說遊戲啓動時須要加載LUA文件,像現階段須要加載500多個LUA文件,這是個很頭痛的事情,可是不得不加載。加載LUA文件是須要必定時間的,現階段大概須要10秒鐘,總體的效率要比C++低,畢竟是腳本語言,仍是有一些能夠優化的方案。咱們如今採用的方式是把複雜數學計算的邏輯都放在Cocos2d-x引擎層,用C以及C++來實現。對於須要靈活可變、利於開發維護的邏輯宜放在腳本層裏面處理,這樣就增長了靈活性。須要注意一點就是LUAC之間的穿越對性能有必定的損失。若是你將它的方法所有都進行包裝的話,就會形成一個雲計算的負擔,因此建議你們直接把它包裝成LUA的開發包,數據存到LUA的對象,這個對象就是LUATeb表。 程序員

 

咱們如今使用的框架是開發者使用比較多的MVC框架,這種開發框架你們應該都比較熟悉,特別是常常在安卓下面開發遊戲的程序員。有一點不一樣的是咱們添加了一個消息監聽的機制,咱們的UI也是從新包裝了一次,而且寫了一套UI管理的方案,緣由是咱們使用的Cocos2d-x版本比較舊,沒有太豐富的空間,以後咱們對它進行了包裝,從新管理它,顯示了它的優先級別。這個方案的實現比較簡單,不像一些比較複雜的UI管理器同樣有配置、有座標、能拖動的界面能夠操做,目前是手動操做的。咱們創建這套框架就是爲了減小代碼之間的偶合性,因此目前基本上可以知足這種需求。 編程

 

前端開發遇到的難點 後端

 

接下來跟你們說一下咱們在前端開發遇到的難點,第一個難點就是遊戲大小包。一個包的2D至少要1G3D的話大概在1G以上,而手機上1G的話,可能沒有人去玩,因此不得不對遊戲包的大小進行控制。咱們目前使用的是打包工具是TP。遊戲包的大小會對用戶轉換率形成較大的影響,這是一個比較重要的內容。有不少人喜歡選用PNG的格式,這種格式有不少優勢,它的兼容性很好,體積也比較小,可是若是進行壓縮之後,會對圖像的質量有很是大的影響。 緩存

 

另外還有一種格式體積很小、兼容性很是好、畫面質量也很是好,是咱們目前主要的圖像模式,在大部分的機型上沒有出現過問題。之前還使用過JPG的格式,可是有一點很差,它對於手機芯片必定要GPUCPU,如今這種CPU大部分都不太支持,只有諾基亞和三星少部分機型支持,因此不可能使用這個做爲主要的打包格式。 服務器

 

爲了方便打包整個遊戲的資源,咱們編寫了一個打包腳本以完成整個打包遊戲的工做。咱們須要作的是配置這些腳本的參數,點一下以後就能夠完成全部的打包工做,而且同一個包能夠配置多種打包的格式,方便咱們配置壓縮的比例和方案。目前第一個遊戲剛作出來的時候有80多兆,通過壓縮以後,再通過咱們選擇不一樣的打包的格式和打包腳本,最終將大小壓縮到了48兆左右,這個是在沒有刪減任何遊戲內容的前提下作的事情。還有須要注意的一點,你們對遊戲進行打包時,若是有透明空間的話,它同樣會佔用你的內存,因此打包的時候要注意不要有太多的透明空間。 網絡

 

難點:啓動速度 多線程

 

咱們遇到另一個難點就是啓動速度。啓動的時候加載LUA文件很慢,因此每次加載要等十幾秒纔可以進入遊戲,咱們第一次啓動加載了一分多鐘才進入,當時是徹底沒有辦法接受的。後來在代碼上作了一些優化的工做,將一些文件放到後面去加載,不過咱們目前沒有這樣作,由於這樣可能會形成其餘的問題。如今想到的辦法就是把配置文件裏面的函數儘可能壓縮,優化表格結構,讓列數儘可能減小。好比說只導出和保管客戶端要用到的數據,這樣能夠節省不少的空間。咱們能將1M的壓縮到1K,這樣一來仍是比較有用的。目前咱們的啓動時間是14秒左右。其實咱們也有想過其餘的一些加速方式,好比說將它編譯成C代碼,就能夠極大加快它的速度,可是編譯成C代碼以後,就沒有優化代碼的更新了,就會失去這個機制,我以爲很划不來,因此放棄了。另外咱們也考慮過階梯的優化方案,可是優化階梯更適合服務器的開發,好比有大量的邏輯運算和操做方面對於性能提高比較高,對於客戶端來講,客戶端的運行結構比較複雜,它對於性能的提高是比較有限的。 架構

 

難點:閃退問題 框架

 

還有一個難點就是常常會遇到閃退的問題。其中比較嚴重的問題就是資源加載內存峯值形成閃退。爲了不內存暴漲,咱們須要測試全部圖片,對256色度的PNG8格式圖片進行了測試。它自己會用到的庫加起來總共不到1M,這個是庫內部申請的內存,以後再進行分配,大概會消耗16MB緩存。PNG8格式的圖片是一個更真實的測試環境,它將測試的方式複製紋理到GPU中,而後會再釋放png庫和zlib庫所用到的零散內存,最終的峯值達到48M,以後內存會穩定在16M。此外,咱們對於pvr.ccz+Rgba4444的文件進行測試,測試的狀況就好不少,它加載文件只消耗了1點幾兆,緩存須要8兆,而後進行數據解包操做,再到文件的緩存,加載到CUP,最終這個峯值達到16M,因此它的內存會達到8M,峯值是16M

 

  JPG 的測試結果
 

針對JPG質量的測試結果,咱們分析JPG庫裏面有一個內存池的管理,並非想象中使用那麼高的內存。它首先會進行一個內存分配工做,這個使用大概有0.5M,基本上能夠忽略。而後數據緩存,再到對齊的緩存,會使用12M的內部空間,複製紋理到GPU須要12M的空間,同時又會再分配12M的內存也就是說這個時候達到峯值32M,最後它的峯值會慢慢降回到12M,而後退掉12M,以後會回到複製數據使用的緩存。因此JPG的內存使用最高達到36M,沒有網上說得那麼高,咱們本身測試的數據峯值並無比PNG高,目前PNG是使用內存峯值最高的。JPG的格式在有一些機型上會有兼容性的問題,在後面的機型適配部分我會跟你們介紹這個狀況。

 

閃退的一個有效解決方法是下降進程佔用的基本內存。使用Cocos2d-x自己的紋理緩存機制,一是清理紋理緩存,二是清理動畫對象緩存,三是清理幀對象緩存。你們儘可能不要使用大圖片,若是將大圖片切割成小圖片的話會好一點。另外還有一個不錯的方法就是改變紋理加載的機制,能夠在加載紋理的過程當中間隔一點的時間,對於峯值起到很大的緩解做用。咱們目前使用的方法就是隔一幀進行加載,這樣能夠有效防止峯值加載的問題。當連續加載不少幀的時候,你的真實內存漲幅會很快,若是你每隔一幀加載的話,漲幅會比較少。目前因爲每一個手機系統的內存管理的機制不一樣,致使手機使用操做系統的內存機制都不太同樣,可是有一點能夠肯定,就是使用了換頁的概念。由於在一些測試的機型上,能夠檢測到的紋理內存比實際的紋理內存要小几十兆。

 

另外,還有其餘的辦法下降進程平均使用的總量,Cocos2d-x自己提供了紋理緩衝的機制,功能實用,加快了運行的速度,咱們也的確在使用中或者在內存出現問題的時候去考慮清理緩存,這是比較快速解決問題的辦法。可是我仍是建議你們不要頻繁清理緩存,由於每次清理完緩存的代價就是下次要從新下載全部的資源,那樣會很是慢。咱們如今的解決方式就是在一些比較合適的時機進行緩存的清理,並且Cocos2d-x對於內存緩存有警報的做用,清理的工做也都是針對於具體的操做須要而作的,可是不太建議在內存警報的時候將剛剛加載的緩存所有清掉。咱們測試安卓系統上內存警報的泛值是12%15%,像動畫對象緩存和清理幀對象的緩存佔用空間不大,沒有什麼清理的價值。另一個比較容易忽略的方法就是LUA有一個JC的機制,有時候會清理掉20M的內存,這個也是比較可觀的。

 

測試的積存的佔用狀況

 

第一個是PC上的峯值,PC上的峯值是212M,這裏統計出來的數據是根據PSS。能夠看到後面的三星I9001佔用的內存大概是240M。其實Cocos2d-x開發這個大型的MMORPG佔用內存是比較嚴重的問題,通常來講都會遇到內存佔用的問題。咱們能夠看到比較有意思的地方是三星I9300這款機器,它的峯值只有90多兆,可是它的紋理內存達到110到120,說明這臺機器紋理內存的管理比其餘的系統要好。接下來是海爾360,差很少是200MOPPO以及小米、HTCG11、摩托羅拉這些在圖上都有具體的峯值。

 

另一個閃退的緣由就是C++指針使用不當。自定義的C++對象導出給LUA使用的時候須要引發注意。若是這個時候你的C++對象已經清除的話,在LUA上是不可能知道的,這是使用Cocos2d-x過程當中最容易遇到的一個問題,特別是使用C++LUA的開放模式。另外,若是你交給LUA管理的話,就算你使用的時候沒有問題,可是它的時間會很難掌握,可能會常常有對象被LUA控制,會形成在必定時間內,有很大一部份內存被佔用掉。咱們目前選擇的方案有兩塊數據,分別是LUAC++,如今的模式是各管各的。

 

難點:適配機型

 

這個適配機型也是遇到不少問題的,在安卓平臺適配的能夠有安卓2.3.7-4.2.2,不過大部分的機器均可以很流暢運行,包括一些主流的機器都沒有問題,好比三星、聯想、OPPO、索尼、HTCLG、小米、MX。可是有一些比較麻煩的機器,好比華爲的低端機,很容易形成閃退的問題。還有一個就是小米手機,小米用戶是咱們的主要用戶羣,可是用小米機器編輯圖片的時候會常常形成白屏,目前咱們不太清楚什麼緣由形成的。

 

後端開發的經驗

 

如今我介紹一下後端開發的經驗。C++LUA開發模式,你要說它有優點也能夠,有劣勢也能夠。首先,這種格式是單服單進程多線程架構模式,這種架構模式很方便、簡單,由於只有一個內存須要維護。另外它能夠支持熱更新,咱們在實際過程當中會遇到網絡環境差的問題,手機網絡環境比PC網絡環境差不少,2G的網絡要比WIFI網絡環境好,WIFI的網絡環境要比3G的網絡狀況好,這是咱們本身測試的狀況,但也不是絕對的測試狀況。在這種狀況下常常會遇到收不到包、發不出去包,或者是收到包了,可是數據收不全等問題。

 

如今咱們有兩個個解決方案

 

一個是創建發包收包的重發機制,從邏輯層面進行彌補。一旦出現發不出去包或者收不到包的狀況,咱們會不停的重試這個過程,重試一段時間都沒有辦法完成的話,就要再進行重發。

 

另一個解決方案就是減小對於網絡的依賴,數據包不要太大。由於不少自動回合的遊戲,也許能達到30回合,這個時候包的數據是比較大的,可能會發生一次發不完的狀況,須要多發幾回,可是實際上增長了網絡上傳輸的風險,因此若是能作成小包的話,就儘可能作成小包。

 

如下是張成與現場觀衆的互動問答:


提問:我過C++開發,大家用什麼工具進行調試?

 

回答:咱們寫了一個調試的功能,咱們只要在Cocos2d-x裏面就能夠堆棧的信息,你要看到運行狀態的值,其實咱們大部分狀況下會輸出,這樣調試會比較快一點,可是若是查不出來的話,咱們也會用Cocos2d-x工具來調試。

 

提問:專門進行內存調試的時候,在虛擬機上面有幾十兆,可是在真機上面只有幾兆,以哪一個爲準呢?

 

回答:以真機爲準。好比說安卓的調試,用安卓的虛擬器,它比真機的數據高不少,虛擬的那個數據不是真實的。

 

提問:後臺架構的話,用LUA、以及用C、用C++對比的優勢跟缺點是什麼呢?

 

回答:LUA自己的優點就是它的自己語言層面就能夠解決編程的問題,稍微會比C以及C++更快一點,性能上沒有區別。

相關文章
相關標籤/搜索