剖析《口袋妖怪复刻版》技术架构

Esmeralda72 7年前
   <p> </p>    <h2><strong>前言</strong></h2>    <p>由于一次偶然的机会,使我发现了一款国内目前为止我认为对Pokemon还原度较高的一款产品——《口袋妖怪复刻版》。这款游戏无论是战斗画面,画风,技能,甚至是宠物的叫声,基本跟原著一模一样,而且已经在线上各大平台推了起来。由于画风上非常接近原著,我猜想假如在没有官方的支持下,能模仿得如此的高,恐怕这项目的原画已经可以直接去画漫画了。而且最近这么火的一个IP,要是没有没有版权,估计渠道也不敢花这么多资源去推。所以综合上述的理由,我认为这款《口袋妖怪复刻版》,有很大的可能性是已经获得了授权,也因为这个原因,所以我决定要对这款游戏进行一次简单的分析。</p>    <h2><strong>结构分析</strong></h2>    <h3><strong>库结构</strong></h3>    <p>要了解一款游戏的框架结构,从库文件入手,能更快速地看出这游戏所使用的引擎,让我们初步来了解下这款游戏链接库目录结构:</p>    <p><img src="https://simg.open-open.com/show/15f9c70e20b9ec45aa87e6552e90878d.png"></p>    <p>libbspatch.so</p>    <p>首先说libbspatch这个库,是友盟SDK所需要依赖的其中一个库,主要是做增量更新,其配套的工具还有bsdiff和bspatch,分别是负责生成差分版本和打补丁,在这里就不再细说了,有兴趣的读者可以独自去了解下。</p>    <p>libcocklogic.so</p>    <p>阿里云App SDK其中一个依赖库,主要负责幽灵进程相关接口。</p>    <p>libtnet-2.0.17.1-agoo.so</p>    <p>阿里云App SDK其中一个依赖库,主要是提供网络连接的相关接口。</p>    <p>libentryexstd.so</p>    <p>银联的计费SDK所依赖的库文件</p>    <p>libluajava.so</p>    <p>java层调用lua的库文件</p>    <p>libysshared.so</p>    <p>提供一些最基础接口的库,其中包括以下接口:</p>    <p>memcpy</p>    <p>memset</p>    <p>strncmp</p>    <p>libstagefright_froyo.so</p>    <p>针对Android Froyo(Android 2.2)的StageFright硬件解码库</p>    <p>libstagefright_honeycomb.so</p>    <p>针对Android Honeycomb (Android 3.X)的StageFright硬件解码库</p>    <p>libCore.so</p>    <p>实现Adobe AIR框架基础接口的库</p>    <p>分析</p>    <p>相信有不少熟悉游戏开发的读者看完这些库之后有跟我一样的诧异。因为作为一款手机精品游戏,它并没有使用我们的主流引擎,而是选择使用Adobe AIR。我认为这款游戏之所以选用AIR,很大可能是由于游戏的客户端主程之前是做页游出身,对AS有一定的依赖性,所以当准备手游项目的时候,就优先地选用了以AS为开发语言的AIR作为开发框架。但是,我建议如果可以选择的话,还是尽量不要选用AIR作为手机游戏开发框架,因为从性能上来看,不见得比其他手游开发引擎有优势,哪怕是做性能条件没真么高的休闲类游戏,在耗电量方面还是会有所影响。</p>    <p>第二个让我觉得兴奋的点是在java层调用lua这个地方。既然使用了AIR,其主要逻辑应该是使用AS,但是这里有多了一层Java调用lua的需求,所以不得不让我顿时产生了好奇心。后续我们将会开始分析应用层结构。</p>    <h3><strong>应用层结构</strong></h3>    <p>在应用层中,负责主要业务逻辑的分别是:</p>    <ul>     <li>AppLoader.swf</li>     <li>Pocketmon.swf</li>    </ul>    <p>从名字上基本可以看出,Pocketmon.swf是游戏的主程序。游戏的逻辑都基本写在Pocketmon.swf(在这里我要纠正一下《口袋妖怪》的官方英文其实应该叫《Pokemon》)。那么AppLoader.swf主要是做什么的呢?在资源路径里,我们发现了一个叫做AssetsConfig.json文件,文件内容大部分都是一些资源文件,以及一些远程资源路径,其中也包括Pocketmon.swf。由此可见</p>    <p>AppLoader.swf的工作主要是负责把资源与应用更新独立出来,方便日后其他项目的功能重用。</p>    <p>再说说另一个比较重要的文件xpkg.cra。xpkg.cra是一个资源包,解包后,我们可以看到里面大部分的资源文件都是计费相关的,比如移动,电信,联通,银联,微信等图片Logo,以及一些lua的脚本文件,终于我们在这里发现了lua的踪影:</p>    <p><img src="https://simg.open-open.com/show/585424a886772b1572bba86cf48a2dd8.png"></p>    <p>通过这文件列表,我们可以大概得知,这部分的脚本内容,主要是负责处理支付,登陆,注册等运营平台相关的业务逻辑。</p>    <h2><strong>总结</strong></h2>    <p>通过上述的分析,我们可以大致确定《口袋妖怪复刻版》客户端的技术架构大致可分为三大层:</p>    <pre>  ------资源加载层(AppLoader.swf)   | |   | ------AssetsConfig.json   |   --游戏应用层(Pocketmon.swf)   |   --平台SDK适配层   |   ------xpkg.cra</pre>    <p>到目前为止以我掌握到的信息,这游戏充分利用了AIR的特性,在模块化管理方面做得相当的不错,同时配合lua的使用,以最大限度降低平台移植的成本。虽然使用的框架并非主流框架,但总体来说,还是有不少地方值得我们参考。</p>    <p> </p>    <p>来自:https://www.zybuluo.com/RexGene/note/474952</p>    <p> </p>