剖析《口袋妖怪復刻版》技術架構
前言
由于一次偶然的機會,使我發現了一款國內目前為止我認為對Pokemon還原度較高的一款產品——《口袋妖怪復刻版》。這款游戲無論是戰斗畫面,畫風,技能,甚至是寵物的叫聲,基本跟原著一模一樣,而且已經在線上各大平臺推了起來。由于畫風上非常接近原著,我猜想假如在沒有官方的支持下,能模仿得如此的高,恐怕這項目的原畫已經可以直接去畫漫畫了。而且最近這么火的一個IP,要是沒有沒有版權,估計渠道也不敢花這么多資源去推。所以綜合上述的理由,我認為這款《口袋妖怪復刻版》,有很大的可能性是已經獲得了授權,也因為這個原因,所以我決定要對這款游戲進行一次簡單的分析。
結構分析
庫結構
要了解一款游戲的框架結構,從庫文件入手,能更快速地看出這游戲所使用的引擎,讓我們初步來了解下這款游戲鏈接庫目錄結構:
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的蹤影:
通過這文件列表,我們可以大概得知,這部分的腳本內容,主要是負責處理支付,登陸,注冊等運營平臺相關的業務邏輯。
總結
通過上述的分析,我們可以大致確定《口袋妖怪復刻版》客戶端的技術架構大致可分為三大層:
------資源加載層(AppLoader.swf) | | | ------AssetsConfig.json | --游戲應用層(Pocketmon.swf) | --平臺SDK適配層 | ------xpkg.cra
到目前為止以我掌握到的信息,這游戲充分利用了AIR的特性,在模塊化管理方面做得相當的不錯,同時配合lua的使用,以最大限度降低平臺移植的成本。雖然使用的框架并非主流框架,但總體來說,還是有不少地方值得我們參考。
來自:https://www.zybuluo.com/RexGene/note/474952