diff --git a/packages/engine/AssetsManagerEx.cpp b/packages/engine/AssetsManagerEx.cpp index 9a0147c4ec6d601a2245e89dad691fcb95f6a491..189a7bdb3e8d3d4e3412c31d0d4f66bcf806ff43 100644 --- a/packages/engine/AssetsManagerEx.cpp +++ b/packages/engine/AssetsManagerEx.cpp @@ -79,6 +79,7 @@ AssetsManagerEx::AssetsManagerEx(const std::string& manifestUrl, const std::stri , _currConcurrentTask(0) , _verifyCallback(nullptr) , _inited(false) +, _canceled(false) { init(manifestUrl, storagePath); } @@ -208,6 +209,7 @@ AssetsManagerEx* AssetsManagerEx::create(const std::string& manifestUrl, const s void AssetsManagerEx::initManifests() { _inited = true; + _canceled = false; // Init and load temporary manifest _tempManifest = new (std::nothrow) Manifest(); if (_tempManifest) @@ -269,6 +271,7 @@ bool AssetsManagerEx::loadLocalManifest(Manifest* localManifest, const std::stri return false; } _inited = true; + _canceled = false; // Reset storage path if (storagePath.size() > 0) { @@ -1011,7 +1014,7 @@ void AssetsManagerEx::updateSucceed() } // Remove from delete list for safe, although this is not the case in general. - auto diff_itr = diff_map.find(dstPath); + auto diff_itr = diff_map.find(relativePath); if (diff_itr != diff_map.end()) { diff_map.erase(diff_itr); } @@ -1271,6 +1274,9 @@ void AssetsManagerEx::onError(const network::DownloadTask& task, } else { + if (_downloadingTask.find(task.identifier) != _downloadingTask.end()) { + _downloadingTask.erase(task.identifier); + } fileError(task.identifier, errorStr, errorCode, errorCodeInternal); } } @@ -1345,6 +1351,10 @@ void AssetsManagerEx::onSuccess(const std::string &/*srcUrl*/, const std::string } else { + if (_downloadingTask.find(customId) != _downloadingTask.end()) { + _downloadingTask.erase(customId); + } + bool ok = true; auto &assets = _remoteManifest->getAssets(); auto assetIt = assets.find(customId); @@ -1407,13 +1417,13 @@ void AssetsManagerEx::batchDownload() void AssetsManagerEx::queueDowload() { - if (_totalWaitToDownload == 0) + if (_totalWaitToDownload == 0 || (_canceled && _currConcurrentTask == 0)) { this->onDownloadUnitsFinished(); return; } - while (_currConcurrentTask < _maxConcurrentTask && _queue.size() > 0) + while (_currConcurrentTask < _maxConcurrentTask && _queue.size() > 0 && !_canceled) { std::string key = _queue.back(); _queue.pop_back(); @@ -1421,8 +1431,8 @@ void AssetsManagerEx::queueDowload() _currConcurrentTask++; DownloadUnit& unit = _downloadUnits[key]; _fileUtils->createDirectory(basename(unit.storagePath)); - _downloader->createDownloadFileTask(unit.srcUrl, unit.storagePath, unit.customId); - + auto downloadTask = _downloader->createDownloadFileTask(unit.srcUrl, unit.storagePath, unit.customId); + _downloadingTask.emplace(unit.customId, downloadTask); _tempManifest->setAssetDownloadState(key, Manifest::DownloadState::DOWNLOADING); } if (_percentByFile / 100 > _nextSavePoint) @@ -1450,4 +1460,23 @@ void AssetsManagerEx::onDownloadUnitsFinished() } } +void AssetsManagerEx::cancelUpdate() +{ + if (_canceled) + { + return; + } + _canceled = true; + std::vector> tasks; + for (const auto& it : _downloadingTask) + { + tasks.push_back(it.second); + } + for (const auto& it : tasks) + { + _downloader->abort(*it); + } + _downloadingTask.clear(); +} + NS_CC_EXT_END diff --git a/packages/engine/AssetsManagerEx.h b/packages/engine/AssetsManagerEx.h index 7bd5be62e967fd3331cc1e761e7c372cd06c5a55..b09b16562abf42078ed6ae1081f8916554accb08 100644 --- a/packages/engine/AssetsManagerEx.h +++ b/packages/engine/AssetsManagerEx.h @@ -193,6 +193,10 @@ public: */ void setEventCallback(const EventCallback& callback) {_eventCallback = callback;}; + /** @brief Cancel update + */ + void cancelUpdate(); + /** * @brief 设置热更新地址,由于热更新地址会动态的发生变化,热更新的地址以下发的地址为准,设置热更新地址后,会自动的替换所有热更新的源地址 */ @@ -404,6 +408,10 @@ private: //! Marker for whether the assets manager is inited bool _inited; + //! Marker for whether the update is canceled + bool _canceled; + //! Downloading task container + std::unordered_map> _downloadingTask; /*是否启用资源下载类型*/ bool _isUsingAssetsType; /*资源类型 ""为大厅 其它为子游戏包名*/ diff --git a/packages/fix_engine/main.js b/packages/fix_engine/main.js index e2c132b70fc5d1816f6e95a348cb9626fea66bcb..e0d3b9012c840cec79de4e04d9c3eaefb5ac2c7e 100644 --- a/packages/fix_engine/main.js +++ b/packages/fix_engine/main.js @@ -219,7 +219,8 @@ module.exports = { if (creatorVersion == "2.4.0" || creatorVersion == "2.4.1" || creatorVersion == "2.4.2" || - creatorVersion == "2.4.3" + creatorVersion == "2.4.3" || + creatorVersion == "2.4.4" ) { Editor.log("Creator 版本 : " + Editor.versions.CocosCreator); Editor.log("Creator cocos2d 版本 : " + Editor.versions.cocos2d); diff --git a/project.json b/project.json index ec020d46e3efc70f75542a9f2abd5ee4db04ed5a..8f5986eccdf0267524d485a282b61cd56d79ac59 100644 --- a/project.json +++ b/project.json @@ -1,7 +1,7 @@ { "engine": "cocos2d-html5", "packages": "packages", - "version": "2.4.3", + "version": "2.4.4", "id": "92b3c247-ed81-4660-8b62-79a3740a2e97", "isNew": false } \ No newline at end of file diff --git a/settings/project.json b/settings/project.json index 293e689d9bda98d929dc8a15430035ce5b68c9e1..bd79e65e235254ca6c856ae7d002b20278bf77f9 100644 --- a/settings/project.json +++ b/settings/project.json @@ -172,7 +172,7 @@ }, "use-customize-simulator": true, "use-project-simulator-setting": false, - "last-module-event-record-time": 1609754655364, + "last-module-event-record-time": 1615434241540, "assets-sort-type": "name", "facebook": { "appID": "",