cocos2dx 3.17 热更新建议

在热更新场景中 设置资源的搜索路径,目的是想要热更新场景页面也更新。

在updateScene::onEnter中调用 checkHotUpdate()方法。

第一次启动app更新会成功,第二次启动app会把之前的更新删掉。第三次又会成功。。。

因为设置搜索路径了,导致AssetsManagerEx::create()方法 传的第一个参数 文件读取的是缓存目录的文件。


上面的代码逻辑就是导致 第二次启动app 会删除之前的更新的原因。其实版本并没有更新。

我在项目中,解决这个问题的方案是 在创建热更新对象之前重置了一下搜索路径,就解决了第二次失败的原因,第四次失败的原因。。。

还有一个解决方案:
就是在创建界面之前,先把热更新对象创建好, 然后在UpdateScene::onEnter()方法中调用
_am->update();


总之,使用起来感觉怪怪的。 如果不设置搜索路径,热更新界面就得不到更新,只能app版本升级的替换掉背景资源或者进度条资源。

还有一个建议 热更新里 删掉目录 在创建目录 太简单粗暴了。 希望除了这种方法,还可以自定义。
类似版本号比较的处理。可以自己设置。


我的项目中一个app有多个cocos2dx的游戏,所以存在很多版本


处理这样的 当大厅缓存目录下版本文件不对的时候 和他同一级的所有游戏都会被删除。

这种做法, 处理大部分app当然没什么问题,如果处理集合式app的时候 就有点粗暴了。

刚随便逛逛 有人也会出现这样的问题,还不知道怎么回事,要是不读源码的话,很难知道注意事项。很难知道什么样的情况下会删除缓存目录。
估计很多接触引擎没多久的程序员都不知道。
http://forum.cocos.com/t/1-9-3/66258

热更新中涉及的几个目录
有缓存目录,一般是 writepath + “/update/”
有临时目录 一般是 writepath + “/update_temp/”
有本地目录 一般是app内部目录。 android 就是在 assets目录下

热更新启动。 会读 app 内部中记录的版本 【先缓存目录找。找不到再到app内部找】
热更新资源更新时会把下载下的资源放到临时目录。更新完毕,会把这个目录下文件copy到 缓存目录,然后再删除临时目录。

本地目录中的版本大于等于缓存目录中的版本 会删除整个缓存目录
如果缓存的版本 比 本地的版本大, 会把缓存的版本当作 本地版本。 然后和远程的做比较
如果本地版本 大于等于远程版本 会删除整个临时目录。【如果有缓存版本,这里的本地版本就是缓存版本】

1赞

可能一个网络不好,版本文件数据没下完,那么整个缓存目录就没了 缓存目录千万不要放 热更新无关的东西,比如数据存储,截图图片,头像缓存等等 很容易导致 整个目录删除, 也就是说没有记录在project.manifest 中的文件也会被删除。 目前引擎做法,直接删除 简单粗暴。 得使用的时候小心一点就是了

cocos2dx 3.17 热更新不支持版本回滚。只能版本递增

如果下载某个文件出错,第二次会重新下载,第一次失败的时候,会写入错误信息。 如果错误信息时200个字节,那么是200个字节处开始下载。 所以导致所有的第一次下载失败的文件,第二次即使下载成功了,文件也是不正确的,然而版本信息文件已经改到最新了。 是断点下载的功能没处理好,还是我的文件下载服务器没配置好

问个问题,资源的话放在缓存目录里的结构跟assets目录差不多,但manifest文件的话就在根目录下project.manifest,
这样有多个manifest的话,每次都用用到缓存目录里的那个project.manifest,这里的project.manifest能不能也根据不同manifest文件来区别开啊?见下图