关于热更新的一些问题

各位好:

我们公司正在使用 Cocos Creator 开发项目,有些问题想请教版上大神们

拜读 panda 大神的 资源热更新教程 后,我们自己做了一些优化:
我们先针对 src、res 的某些资料夹做压缩,再产生 md5 ,这样可以避免 res/import 中约2000多个档案逐一下载和比对

目前我们遇到几个问题:

  1. Cocos Creator 构建发布,貌似会把 src、res 这些资料夹砍掉再建立, 这样即使里面的档案没有异动,产生的 md5 仍会不一样,
    导致每次更新都会下载所有资源,这部份该怎么解决呢?
    有办法让 Cocos Creator 不要删除原本的资料夹吗?

  2. 按照 panda 大神的范例,我们在游戏一开始检查更新,更新完毕后呼叫 cc.game.restart();
    那有没有办法,在游戏不用重新启动的情况下,动态加载一个 scene 以及它的相关脚本和资源?
    还是说未來的版本會提供这个功能? 有没有大约的时间点呢?

另外,也感谢 ffskyfan 这一篇 AssetsManagerEx 解压大的压缩包会出现个别问题
这个修改​​解决了热更新解压缩时,资料夹还没建立导致解压缩失败的问题,
麻烦 cocos 团队能否评估一下,合并到之后的版本,感谢大家不吝指教~

发布原生平台时,档案并不会有异动才对,怎么会 md5 不一样?

未压缩的档案 md5 是一样的,可是我们对重建过的资料夹压成zip,md5 就会不同。

我这边试过,资料夹不变,里面的档案也都没改动的话,压出的zip md5是相同的。

但每次Cocos Creator 构建发布之后,资料夹就会砍掉重建,md5就会不同。

我们会把 res\import 压成一个zip

主要是这些档案数量很多(上千个),放到 web server 或是给玩家下载都挺费时的~

我这边测试的结果,要压缩的资料夹中有树状的子资料夹,建立日期改变以后,压缩后的zip md5 就会不一样了。

不知这个问题有没有好的解法?
我想打包 zip 给玩家下载后再解压缩,会是蛮常用到的功能~

如果可以让我们选择不要删原本的资料夹,应该就可以解决了?
(这样我们出安装包时,可以先删除资料夹得到乾净的版本,
热更新时不删除资料夹,这样压缩后的 md5 只有修改的地方会变)

你可以不使用 md5 作为版本号,使用静态版本号就可以了,关于热更新的其他问题,我过一段时间会开始优化一次

好的,感谢您~:slightly_smiling:

编辑器构建时,很难知道说某个资料相对硬盘上的版本是否有发生变动,因此只能全部覆盖一次。这样就算文件夹没删除,文件的修改日期一样会发生变化。
我建议针对这种需求,可以自己另外做一个同步脚本/插件,把编辑器构建好的项目与你服务器上的项目进行比对,仅更新发生了变化的文件。

了解,我们会在评估下 感谢~

之前遇到的问题,从build资料夹中将部分档案压缩成zip,
再对zip算md5时每次都会不一样,
今天进一步找到原因了。

一般的copy都会变动到timestamp ,所以压成zip时这个资讯也写进去了。
今天尝试保留原始档案的timestamp,使用的是node.js的fs-extra套件:
var fs = require(‘fs-extra’);
fs.copySync(‘SrcDir’, ‘DestDir’, { preserveTimestamps: true });
这样压出来的zip算md5就不会变动了。

不知道引擎copy资源这一段是怎么做的,但是应该也会有类似的选项
希望引擎团队 @panda @jare 能帮我们在build搬移资料的时候也加上这个选项~
这样不管是zip或散档,都可以统一使用md5这一套版本控管的机制了
这个对与我们版本管理会方便许多~ 膜拜~~m(_ _ )m

md5 不一样的原因不是 timestamp 导致的,是因为编辑器构建时对一些动态资源使用了动态的 uuid,每次构建的时候 uuid 都会变化。这个编辑器已经在1.4版本中改进了,现在构建后 uuid 不会改变。

应该说某个档案的 timestamp 会影响到以它做成压缩档后,该 zip 档的 md5
我这边是拿 build\jsb-default\res\raw-internal\image 这些图档做实验
按下引擎的构建后,修改时间、访问时间都会改变(可观察档案的属性)
而我自己使用 reserveTimestamps 属性来 copy 档案到另一个资料夹,timestamp 是不会变的。
最后再观察压缩档的 binary 内容是否相同

多谢反馈,1.4 会尝试对 raw asset 加入这个标记,不过这个也只是短期内有效,之后构建时 raw asset 仍然有可能被重新编码,到时 time stamp 就还是会改变。

好的感谢 @jare ~期待1.4版本,我们也会配合调整作法

我测试了一下,在 copy 的时候添加了 preserveTimestamps: true 测试结果还是无法做到它的 md5 相等…

Knox 大大测试过了,copy 过后,修改时间不变,创建时间仍然会改变,平台是 windows,这个方法似乎不可行

不用md5做校验 用文件大小做校验是否可行呢。

应该是构建的时候,build资料夹整个删除重建的关系
(我测的时候,目的地档案没删除)。
用文件大小做校验有可能会誤判。
我能理解引擎删除整个资料夹,是为了最后留下乾净的资源档目录。
这部份有没有可能让我们客制化呢?
例如放出这部份的脚本,允许我们自己修改?
或者像我之前提的,让我们可以选择要不要删除旧有的资料夹

不删除旧资料的话,你们怎么剔除不需要的文件呢?
这部分将来会开放允许修改的,不过现在还不太成熟,开放的话太早了点实现起来也很 hack。
我建议你们自己在服务器进行单文件的 md5 比对。也就是在服务器上保留上一次构建的结果,然后自己比对变动的部分。