cocos2d 热更流程

admin 2018-3-28 213

小笔记第六弹。

谈谈cocos2d实现的热更流程,网上代码一大把,这里就不贴代码了,况且不同版本的使用方式也不一定一样。

这里是使用的AssetsManagerEx和EventListenerAssetsManagerEx实现的热更。AssetsManagerEx负责创建管理热更的对象,EventListenerAssetsManagerEx负责监听AssetsManagerEx对象在热更过程中状态机的变化,留出的接口面向用户,也就是说,用户需要在热更的某个时刻实现某种功能,需要写在EventListenerAssetsManagerEx的回调函数中。

首先在创建AssetsManagerEx对象时,需要读取本地的project.manifest文件,文件格式网上也有很多介绍,不赘述。将读取的本地project.manifest文件通过json的格式存储在manifest类创建的对象中。用户手动调用AssetsManagerEx的update函数,开始进入下载version.manifest(下载url都存储在本地的project.manifest文件中),解析version,比较版本,如果版本不同,就下载远程的project.manifest文件,再解析project.manifest文件,解析中其中asset部分,也就是需要热更的真正内容,可以是脚本文件,可以是zip压缩包,可以是资源文件。然后和下载version和project文件流程一样,调用downloader类创建的对象创建下载task,将task添加到下载队列,等待director的mainloop调用。



其实,cocos2d封装的热更流程还不是很好用,首先,热更前没有判断本地是否存在文件,其次,没有判断文件的md5值。

这个也是比较好解决的,可以在AssetsManagerEx的startUpdate函数中一并解决,startUpdate函数首先通过genDiff判断本地project和远程project的差异,读出asset的差额部分,然后可以再通过asset对象存储的path判断本地是否存在文件(path是相对路径,可以加上本地存储路径得到全路径),如果文件存在,则可以通过utils中的getFileMD5Hash方法获取本地文件的md5(3.15以上版本新增,具体实现过程可以参考小笔记第五弹),跟asset对象中存储的md5值比较,就可以知道本地文件是不是最新的,是否需要热更了。


奇怪的是,cocos自己也封装了判断md5的函数,就是这货:setVerifyCallback,源码中对这个函数的解释是:Set the verification function for checking whether downloaded asset is correct, e.g. using md5 verification,意思是执行回调函数判断下载的资源是否正确,比如通过md5判断等等。但是,仔细阅读代码就会发现,这货的执行顺序在startUpdate之后,在updateSuccess之前,也就是说,是在资源已经下载到本地的temp文件夹再执行这个回调函数,到时候下载的流量和时间都已经用掉了,cocos2d这么做也太懒了吧。。。。。没办法,要想实现无差别热更,只能自己修改代码了。本人修改的源码由于存在商业用途,恕不能公开,但是根据上面提供的思路,对cocos2d热更的流程熟悉的,很快就能改写出来。同时提醒一下,如果用的是低版本引擎,想添加这个功能的,需要把utils,fileutils,manifest和热更函数的相关部分都修改掉,据说3.15以下AssetsManagerEx函数不稳定,本人判断是fileutils中各个平台特别是ios平台的差异导致的,但是没有亲自实践,所以这个坑本人直接用高版本的代码填了,但是关于win32的文件操作,部分还需要自己完善相关功能。


最新回复 (0)
返回