cocos3——9.AssetsManager动态更新配置文件详解

前端之家收集整理的这篇文章主要介绍了cocos3——9.AssetsManager动态更新配置文件详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.version.manifest

版本配置主要是用于快速确定是否需要更新,如果project.manifest很大的话这个是很有必要的。

  1. {
  2. // assets manager从这里下载所有的assets
  3. "packageUrl" : "http://example.com/assets_manager/TestScene/",// version.manifest
  4. "remoteVersionUrl" : "http://example.com/assets_manager/TestScene/version.manifest",// project.manifest
  5. "remoteManifestUrl" : "http://example.com/assets_manager/TestScene/project.manifest",// 本mani文件的版本
  6. "version" : "1.0.0",// 组版本
  7. "groupVersions": {
  8. "1" : "1.0.22"
  9. }
  10. "engineVersion" : "Cocos2d-JS v3.0 RC0"
  11. }
比较版本的方式是:version字段必须相等,然后比较groupVersions的所有字段(字段总数及对应的值)必须等。具体代码是:
  1. bool Manifest::versionEquals(const Manifest *b) const
  2. {
  3. // Check manifest version
  4. if (_version != b->getVersion())
  5. {
  6. return false;
  7. }
  8. // Check group versions
  9. else
  10. {
  11. std::vector<std::string> bGroups = b->getGroups();
  12. std::unordered_map<std::string,std::string> bGroupVer = b->getGroupVerions();
  13. // Check group size
  14. if (bGroups.size() != _groups.size())
  15. return false;
  16. // Check groups version
  17. for (int i = 0; i < _groups.size(); ++i) {
  18. std::string gid =_groups[i];
  19. // Check group name
  20. if (gid != bGroups[i])
  21. return false;
  22. // Check group version
  23. if (_groupVer.at(gid) != bGroupVer.at(gid))
  24. return false;
  25. }
  26. }
  27. return true;
  28. }


2.project.manifest

apk里的project.manifest会和下载的project.manifest(如果更新过的话会cache在下载目录的)比较version,选择version大的版本。所以这里介绍服务器的project.manifest配置。

其他的和上面的一样,只是新加了assets和searchPaths字段,用于配置更新的文件及要设置的搜索目录。

  1. {
  2. "packageUrl" : "http://192.168.1.103/bw","remoteManifestUrl" : "http://192.168.1.103/bw/project.manifest","remoteVersionUrl" : "http://192.168.1.103/bw/version.manifest","version" : "1.0.22","groupVersions" : {
  3. "1" : "1.0.22"
  4. },"engineVersion" : "3.0 rc0","assets" : {
  5. "app.zip" : {
  6. "md5" : "69361FEDE857D55A627B997828D63A0E","compressed" : true,"group" : "1"
  7. }
  8. },"searchPaths" : [
  9. ]
  10. }
md5表示asset的版本信息,compressed可选,如果压缩了则下载后会被解压。group值在现在的cocos2dx 3.3里也没有用到(可能后边会用吧),所以暂且可以不配置。

而客户端更新文件的方式是,比较本地(或cache过的)和从服务器下载的project.manifest文件的差值,然后进行更新。具体算法是比较assets的所有值,减少的就删除

新增了就添加,md5变了就修改。所以目前没有用到group字段,当然你可以用来自己配置的时候区分各个组。具体比较代码

  1. std::unordered_map<std::string,Manifest::AssetDiff> Manifest::genDiff(const Manifest *b) const
  2. {
  3. std::unordered_map<std::string,AssetDiff> diff_map;
  4. std::unordered_map<std::string,Asset> bAssets = b->getAssets();
  5. std::string key;
  6. Asset valueA;
  7. Asset valueB;
  8. std::unordered_map<std::string,Asset>::const_iterator valueIt,it;
  9. for (it = _assets.begin(); it != _assets.end(); ++it)
  10. {
  11. key = it->first;
  12. valueA = it->second;
  13. // Deleted
  14. valueIt = bAssets.find(key);
  15. if (valueIt == bAssets.cend()) {
  16. AssetDiff diff;
  17. diff.asset = valueA;
  18. diff.type = DiffType::DELETED;
  19. diff_map.emplace(key,diff);
  20. continue;
  21. }
  22. // Modified
  23. valueB = valueIt->second;
  24. if (valueA.md5 != valueB.md5) {
  25. AssetDiff diff;
  26. diff.asset = valueB;
  27. diff.type = DiffType::MODIFIED;
  28. diff_map.emplace(key,diff);
  29. }
  30. }
  31. for (it = bAssets.begin(); it != bAssets.end(); ++it)
  32. {
  33. key = it->first;
  34. valueB = it->second;
  35. // Added
  36. valueIt = _assets.find(key);
  37. if (valueIt == _assets.cend()) {
  38. AssetDiff diff;
  39. diff.asset = valueB;
  40. diff.type = DiffType::ADDED;
  41. diff_map.emplace(key,diff);
  42. }
  43. }
  44. return diff_map;
  45. }

猜你在找的Cocos2d-x相关文章