剖析《口袋妖怪復刻版》技術架構

RexGene發表於2016-08-23

剖析《口袋妖怪復刻版》技術架構


前言

由於一次偶然的機會,使我發現了一款國內目前為止我認為對Pokemon還原度較高的一款產品——《口袋妖怪復刻版》。這款遊戲無論是戰鬥畫面,畫風,技能,甚至是寵物的叫聲,基本跟原著一模一樣,而且已經線上上各大平臺推了起來。由於畫風上非常接近原著,我猜想假如在沒有官方的支援下,能模仿得如此的高,恐怕這專案的原畫已經可以直接去畫漫畫了。而且最近這麼火的一個IP,要是沒有沒有版權,估計渠道也不敢花這麼多資源去推。所以綜合上述的理由,我認為這款《口袋妖怪復刻版》,有很大的可能性是已經獲得了授權,也因為這個原因,所以我決定要對這款遊戲進行一次簡單的分析。


結構分析

庫結構

要了解一款遊戲的框架結構,從庫檔案入手,能更快速地看出這遊戲所使用的引擎,讓我們初步來了解下這款遊戲連結庫目錄結構:
image_1aqlocd5p11adrl91pq91f1s1jung.png-66.7kB

libbspatch.so

首先說libbspatch這個庫,是友盟SDK所需要依賴的其中一個庫,主要是做增量更新,其配套的工具還有bsdiff和bspatch,分別是負責生成差分版本和打補丁,在這裡就不再細說了,有興趣的讀者可以獨自去了解下。

libcocklogic.so

阿里雲App SDK其中一個依賴庫,主要負責幽靈程式相關介面。

libtnet-2.0.17.1-agoo.so

阿里雲App SDK其中一個依賴庫,主要是提供網路連線的相關介面。

libentryexstd.so

銀聯的計費SDK所依賴的庫檔案

libluajava.so

java層呼叫lua的庫檔案

libysshared.so

提供一些最基礎介面的庫,其中包括以下介面:
memcpy
memset
strncmp

libstagefright_froyo.so

針對Android Froyo(Android 2.2)的StageFright硬體解碼庫

libstagefright_honeycomb.so

針對Android Honeycomb (Android 3.X)的StageFright硬體解碼庫

libCore.so

實現Adobe AIR框架基礎介面的庫

分析

相信有不少熟悉遊戲開發的讀者看完這些庫之後有跟我一樣的詫異。因為作為一款手機精品遊戲,它並沒有使用我們的主流引擎,而是選擇使用Adobe AIR。我認為這款遊戲之所以選用AIR,很大可能是由於遊戲的客戶端主程之前是做頁游出身,對AS有一定的依賴性,所以當準備手遊專案的時候,就優先地選用了以AS為開發語言的AIR作為開發框架。但是,我建議如果可以選擇的話,還是儘量不要選用AIR作為手機遊戲開發框架,因為從效能上來看,不見得比其他手遊開發引擎有優勢,哪怕是做效能條件沒真麼高的休閒類遊戲,在耗電量方面還是會有所影響。

第二個讓我覺得興奮的點是在java層呼叫lua這個地方。既然使用了AIR,其主要邏輯應該是使用AS,但是這裡有多了一層Java呼叫lua的需求,所以不得不讓我頓時產生了好奇心。後續我們將會開始分析應用層結構。

應用層結構

在應用層中,負責主要業務邏輯的分別是:

  • AppLoader.swf
  • Pocketmon.swf

從名字上基本可以看出,Pocketmon.swf是遊戲的主程式。遊戲的邏輯都基本寫在Pocketmon.swf(在這裡我要糾正一下《口袋妖怪》的官方英文其實應該叫《Pokemon》)。那麼AppLoader.swf主要是做什麼的呢?在資源路徑裡,我們發現了一個叫做AssetsConfig.json檔案,檔案內容大部分都是一些資原始檔,以及一些遠端資源路徑,其中也包括Pocketmon.swf。由此可見
AppLoader.swf的工作主要是負責把資源與應用更新獨立出來,方便日後其他專案的功能重用。

再說說另一個比較重要的檔案xpkg.cra。xpkg.cra是一個資源包,解包後,我們可以看到裡面大部分的資原始檔都是計費相關的,比如移動,電信,聯通,銀聯,微信等圖片Logo,以及一些lua的指令碼檔案,終於我們在這裡發現了lua的蹤影:
image_1aqpcjs436mtbp61bdog8fpr9.png-218.8kB

通過這檔案列表,我們可以大概得知,這部分的指令碼內容,主要是負責處理支付,登陸,註冊等運營平臺相關的業務邏輯。


總結

通過上述的分析,我們可以大致確定《口袋妖怪復刻版》客戶端的技術架構大致可分為三大層:

------資源載入層(AppLoader.swf)
    |    |
    |    ------AssetsConfig.json
    |
    --遊戲應用層(Pocketmon.swf)
    |
    --平臺SDK適配層
         |
         ------xpkg.cra

到目前為止以我掌握到的資訊,這遊戲充分利用了AIR的特性,在模組化管理方面做得相當的不錯,同時配合lua的使用,以最大限度降低平臺移植的成本。雖然使用的框架並非主流框架,但總體來說,還是有不少地方值得我們參考。

相關文章