[√]cocos creator 热更新源码剖析(3)

简介: [√]cocos creator 热更新源码剖析

Downloader

几个比较重要的下载回调

  • onDataTaskSuccess
  • onFileTaskSuccess
  • onTaskProgress
  • onTaskError

开启了一个线程进行下载,使用到了curl,每个下载文件都会创建一个DownloadTask

manifest下载失败的处理

void AssetsManagerEx::onError(const network::DownloadTask& task,
                              int errorCode,
                              int errorCodeInternal,
                              const std::string& errorStr)
{
    if (task.identifier == VERSION_ID)
    {
        // 当收到下载version.manifest失败后,会尝试下载project.manifest
        CCLOG("AssetsManagerEx : Fail to download version file, step skipped\n");
        _updateState = State::PREDOWNLOAD_MANIFEST;
        downloadManifest();
    }
    else if (task.identifier == MANIFEST_ID)
    {
       // 当收到project.manifest也下载失败了,就会抛出异常 
        dispatchUpdateEvent(EventAssetsManagerEx::EventCode::ERROR_DOWNLOAD_MANIFEST, task.identifier, errorStr, errorCode, errorCodeInternal);
        _updateState = State::FAIL_TO_UPDATE;
    }
    else
    {
        if (_downloadingTask.find(task.identifier) != _downloadingTask.end()) {
            _downloadingTask.erase(task.identifier);
        }
        // 热更过程中下载失败
        fileError(task.identifier, errorStr, errorCode, errorCodeInternal);
    }
}

update

开始更新下载需要的文件

void AssetsManagerEx::update()
{
    // .. 一些错误检查
    _updateEntry = UpdateEntry::DO_UPDATE;
    switch (_updateState) {
        case State::FAIL_TO_UPDATE:
        case State::READY_TO_UPDATE:
        case State::NEED_UPDATE:
        {
            if (_updateEntry == UpdateEntry::DO_UPDATE)
            {
                // 一般正常流程都会命中这个逻辑
                startUpdate();
            }
        }
            break;
    }
}
void AssetsManagerEx::startUpdate()
{
    if (_updateState == State::READY_TO_UPDATE)
    {
        // Start to update 6 files from remote package.
        msg = StringUtils::format("Start to update %d files from remote package.", _totalToDownload);
        dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_PROGRESSION, "", msg);
        batchDownload(); // 批量创建下载任务队列
    }
}

更新成功

触发事件UPDATE_FINISHED,js层收到后软重启即可

cc.audioEngine.stopAll();
cc.game.restart();
Uncaught TypeError: Cannot read property 'emit' of null, location: src/cocos2d-jsb.js:0:0
STACK:
[0]_onTouchEnded@src/cocos2d-jsb.js:25740
[1]253.proto.emit@src/cocos2d-jsb.js:41837
[2]_doDispatchEvent@src/cocos2d-jsb.js:15311
[3]dispatchEvent@src/cocos2d-jsb.js:16193
[4]_touchEndHandler@src/cocos2d-jsb.js:15200
[5]_onTouchEventCallback@src/cocos2d-jsb.js:32750
[6]_dispatchEventToListeners@src/cocos2d-jsb.js:32836
[7]_dispatchTouchEvent@src/cocos2d-jsb.js:32785
[8]dispatchEvent@src/cocos2d-jsb.js:33037
[9]handleTouchesEnd@src/cocos2d-jsb.js:39827
[10]_mouseEventsOnElement@src/cocos2d-jsb.js:39986
[11]anonymous@src/cocos2d-jsb.js:40005
[12]dispatchEvent@jsb-adapter/jsb-builtin.js:3077
[13]anonymous@jsb-adapter/jsb-builtin.js:3149
_onTouchEnded: function _onTouchEnded(event) {
    if (!this.interactable || !this.enabledInHierarchy) return;
    if (this._pressed) {
      cc.Component.EventHandler.emitEvents(this.clickEvents, event);
      this.node.emit("click", this); // 这里报的错
    }
    this._pressed = false;
    this._updateState();
    event.stopPropagation();
},
 ERROR: Uncaught TypeError: Cannot read property 'length' of undefined, location: src/cocos2d-jsb.js:0:0
STACK:
[0]lookupClasses@src/cocos2d-jsb.js:42198
[1]unpackJSONs@src/cocos2d-jsb.js:42274
[2]unpackJson@src/cocos2d-jsb.js:19647
[3]unpack@src/cocos2d-jsb.js:19680
[4]anonymous@src/cocos2d-jsb.js:19703
[5]finale@src/cocos2d-jsb.js:18985
[6]anonymous@src/cocos2d-jsb.js:20636
[7]anonymous@src/cocos2d-jsb.js:18962
[8]anonymous@jsb-adapter/jsb-engine.js:3183
[9]readFile@jsb-adapter/jsb-engine.js:3149
[10]readJson@jsb-adapter/jsb-engine.js:3171
[11]parseJson@jsb-adapter/jsb-engine.js:3468
[12]download@jsb-adapter/jsb-engine.js:3354
[13]downloadJson@jsb-adapter/jsb-engine.js:3480
[14]invoke@src/cocos2d-jsb.js:18956
[15]process@src/cocos2d-jsb.js:18966
[16]retry@src/cocos2d-jsb.js:20634
[17]download@src/cocos2d-jsb.js:18990
[18]load@src/cocos2d-jsb.js:19700
[19]fetch@src/cocos2d-jsb.js:19514

事件ID

enum class EventCode
{
    ERROR_NO_LOCAL_MANIFEST,
    ERROR_DOWNLOAD_MANIFEST,
    ERROR_PARSE_MANIFEST,
    NEW_VERSION_FOUND,
    ALREADY_UP_TO_DATE,
    UPDATE_PROGRESSION,
    ASSET_UPDATED,
    ERROR_UPDATING,
    UPDATE_FINISHED,
    UPDATE_FAILED,
    ERROR_DECOMPRESS
};

image.png

目录
相关文章
|
存储 JSON 缓存
CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle
CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle
1129 0
uniapp的touchstart与click
uniapp的touchstart与click
711 0
|
Dart 开发工具 Android开发
快速集成 Flutter Shorebird 热更新
Flutter Shorebird 是一种云端代码推送服务,可以让开发者在几分钟内集成,无需修改代码即可将更新推送到任何 Dart 代码,支持所有 Android 和 iOS 设备,并符合 App Store 和 Play Store 的规定。Shorebird 最大的优点是无代码侵入,快速集成,设计优秀。
618 2
快速集成 Flutter Shorebird 热更新
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
375 15
|
JavaScript Android开发 C++
Cocos Creator 解决热更新资源md5比较引发卡顿问题(一)
Cocos Creator 解决热更新资源md5比较引发卡顿问题
777 0
|
算法 定位技术
连连看核心算法与基本思想(附全部项目代码链接与代码详细注释)
连连看核心算法与基本思想(附全部项目代码链接与代码详细注释)
739 0
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
262 0
|
JavaScript C++
[√]cocos creator 热更新源码剖析(1)
[√]cocos creator 热更新源码剖析
340 1
|
存储 缓存 API
CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager
CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager
1105 0
|
JavaScript C++
[√]cocos creator 热更新源码剖析(2)
[√]cocos creator 热更新源码剖析(2)
256 1