您好,我发现在AssetsManagerEx.cpp的逻辑中,是通过Manifest->saveToFile保存manifest文件中热更内容的下载状态的。AssetsManagerEx.cpp中共有5处saveToFile,如果是第一次热更新,AssetsManagerEx.cpp的startUpdate第三处的saveToFile会将远程manifest保存到本地,但是这个manifest不带任何文件的下载状态。
之后的逻辑_tempManifest->setAssetDownloadState(it->first, Manifest::DownloadState::UNSTARTED);
会更新下载状态,但是没有及时保存到本地,而是等到AssetsManagerEx::queueDowload中的_percentByFile / 100 > _nextSavePoint条件满足时,才能调用saveToFile保存文件的下载状态。
在第一个文件下载完之前,_percentByFile一直为0,不会调用saveToFile,如果此时关掉应用再次打开,会调用
_tempManifest->genResumeAssetsList(&_downloadUnits);
但是因为之前的待下载文件的状态DownloadState::UNSTARTED都没能保存,所以genResumeAssetsList就得不到下载列表,热更就直接完成了。
我的临时改法是,改成_percentByFile / 100 >= _nextSavePoint,因为一开始_percentByFile为0,所以在下载第一个文件之前调用queueDowload()里面的saveToFile会把待下载文件的状态写入到本地的manifest文件中,使得再次热更时genResumeAssetsList能收集到待热更的文件。
但是我感觉这样还是有一点风险,就是AssetsManagerEx::startUpdate()中的第三个saveToFile保存了无下载状态的文件列表,之后的queueDowload中再保存一个有状态的下载列表,如果这中间除了什么问题,导致有状态的列表没有保存,那么热更就失效了。所以能不能第一次保存的时候就是保存有状态的下载列表呢?
不知道我理解的热更流程对不对,谢谢!
Creator 版本号:1.4.2
运行时目标平台:(Web/iOS/Android/模拟器)
手机浏览器平台:(机型,浏览器)
操作系统:(编辑器错误)
详细报错信息,包含调用堆栈:
编辑器之前是否有其它报错:
做了什么操作引起的 Bug:
偶发 bug 的概率和额外线索:(重现几率/场景节点规模/项目资源规模)