cocos2dx上做边下边玩小包热更

这篇具有很好参考价值的文章主要介绍了cocos2dx上做边下边玩小包热更。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为公司业务需求需要做边下边玩的小包下载,在这里记录一下思路

下载库我使用的是cocos2dx 4.x的CCDownloader来下载文件

大体思路就是hook住fileutils中的getFileData函数和isFileExist函数。

isFileExist:无论初始包里文件是否存在,只要文件是游戏的资源文件这里都要返回“文件存在”

getFileData:这里判断当文件在文件列表中但是游戏包体里不存在该文件时,需要暂停主线程并且去下载文件,文件下载完成时恢复主线程

当暂停主线程时,下载文件的回调需要在子线程中回调否则无法回调成功

除上面的下载文件以外,主线程中根据缺少的文件列表按照一定策略持续下载缺少的文件(优先下载列表等)。

下面是一些主要的代码:

 1 //使用条件变量暂停主线程
 2 //继承了CCFileUtils文件
 3 unsigned char* QFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
 4 {
 5     auto download = QDownloadSmallPack::getInstance();
 6     auto index = QIndex::getInstance();
 7     if (download->isStartCheckRes())
 8     {
 9         bool hasFile = download->checkFile(pszFileName);
10         if (!hasFile)
11         {
12             QIndex::IndexEntry* filePathInIndex = index->getFilePathByIndex(pszFileName);
13             if (filePathInIndex && !filePathInIndex->name.empty())
14             {
15                 std::unique_lock<std::mutex> lock{_m};
16                 download->downloadFile(filePathInIndex, _cond_var);
17                 
18                 if (!download->isDownloadOK)
19                 {
20                     _cond_var.wait(lock, [download](){ return download->isDownloadOK; });
21                 }
22                 
23             }
24         }
25     }
26 
27     return CCFileUtils::getFileData(pszFileName, pszMode, pSize);
28 }
- (id)init: (const cocos2d::network::DownloaderApple*)o hints:(const cocos2d::network::DownloaderHints&) hints
{
    DLLOG("Construct DownloaderAppleImpl %p", self);
    // save outer task ref
    _outer = o;
    _hints = hints;

    // create task dictionary
    self.taskDict = [NSMutableDictionary dictionary];

    // create download session
    NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    if (hints.callBackInMainThread)
    {
//在主线程中回调
        self.downloadSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
    else
    {
//在子线程中回调
        self.downloadSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:nil];
    }
    
//    self.downloadSession.sessionDescription = kCurrentSession;
    return self;
}
//其他两个回调做同样的修改就好    
void onProgress(final int id, final long downloadBytes, final long downloadNow, final long downloadTotal) {
        DownloadTask task = (DownloadTask)_taskMap.get(id);
        if (null != task) {
            task.bytesReceived = downloadBytes;
            task.totalBytesReceived = downloadNow;
            task.totalBytesExpected = downloadTotal;
        }
        if (_callBackInMainThread){
            Cocos2dxHelper.getActivity().runOnGLThread(new Runnable() {
                @Override
                public void run() {
                    nativeOnProgress(_id, id, downloadBytes, downloadNow, downloadTotal);
                }
            });
        }else {
//在子线程中回调
            new Runnable() {
                @Override
                public void run() {
                    nativeOnProgress(_id, id, downloadBytes, downloadNow, downloadTotal);
                }
            }.run();
        }
    }
//cv是getfiledata中使用的条件变量    
_downloader->onFileTaskSuccess = [this, &cv](const cocos2d::network::DownloadTask& task)
    {
//做一些游戏自己的检测逻辑,确认文件下载完成之后这里设置条件变量并且通知主线程恢复
            isDownloadOK = true;
            cv.notify_all();
    };
   

 文章来源地址https://www.toymoban.com/news/detail-774757.html

 


到了这里,关于cocos2dx上做边下边玩小包热更的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《入门级-Cocos2dx4.0 塔防游戏开发》---第六课:欢迎界面开发(四、自定义精灵)

    目录  一、开发环境 二、开发内容 2. 1 新建自定义精灵 2.2 在welcome中创建新的menu 2.3 消息绑定以及消息响应 三、演示效果 四、知识点 4.1 内部消息响应 4.2 字体精灵说明 4.3 CC_SYNTHESIZE宏 操作系统:UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程:统信UOS下配置安装cocos2dx开发

    2024年02月11日
    浏览(42)
  • Pygame和Cocos2d

    Pygame和Cocos2d都是 Python 中常用的游戏引擎,但它们的设计目标、特点和使用场景略有不同。 Pygame与Cocos2d,目前是使用人数最多的两个Python游戏库。根据某知名产品点评网站的数据显示,Cocos2d排名第一,Pygame排名第二。 Pygame是一种基于SDL(Simple DirectMedia Layer)的Python库,主要

    2024年01月21日
    浏览(47)
  • cocos2D插件转3D插件

    cocos2D插件转3D插件

    2024年02月16日
    浏览(48)
  • Cocos2d-x实现文字颜色渐变

    更改CCLabel文件的updateColor()函数中的顶点颜色即可,代码如下: 效果图:  

    2024年02月12日
    浏览(44)
  • cocos2d-x C++与Lua交互

    Cocos版本: 3.10 Lua版本: 5.1.4 环境: window Visual Studio 2013 Lua 作为一种脚本语言, 它的运行需要有 宿主 的存在,通过 Lua虚拟栈 进行数据交互。 它的底层实现是 C 语言,C语言封装了很多的API接口,使得C/C++与Lua之间可以很方便的通信交互。 Lua的官网: https://www.lua.org/ 在coc

    2024年02月08日
    浏览(46)
  • 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目。 在Cocos2d-x被整合到Cocos引擎之前,我们可以不那么方便地在我们创建的工程里调试Cocos2d-x的代码,当我们使用了整合后的Cocos引擎,调试

    2024年02月12日
    浏览(58)
  • cocos2d-x Android原生平台与Lua交互

    版本: cocos2d-x 语言: C++/Java/Lua cocos2d-x原生平台Android 接入第三方SDK, 需要了解 LuaJavaBridge 的使用。 它封装了用于 Java 和 Lua 的相互调用, 其调用通过 C++ 为中介,简要的流程: Lua调用Java: Lua - C++ - Java Java调用Lua: Java - C++ - Lua 以此方式来实现数据的交互, 接下来我们分别说下

    2024年02月08日
    浏览(49)
  • cocos2d-x 3.17 推箱子 0.1

    此版本为推箱子游戏的基础版本, 后续添加如下功能 人物动画 TiledMap 解析 射线碰撞检测 下一步提示, C++算法解析 道具, 可以回退一步 通过 cocos 命令新建一个项目, 将本项目的 Reources 目录和 Classes 目录复制过去即可 使用图集绘制 Sprite , 然后手动处理碰撞检测 游戏学论著翻译

    2024年02月08日
    浏览(49)
  • 绑定证书的cocos2d程序如何对wss长连接抓包

    点击上方 ↑ ↑ ↑ 蓝字[ 协议分析与还原 ]关注我们 “  解决在应用内绑定了证书的cocos2d应用wss长连接抓包的问题。 ” 在分析应用的过程中,不可避免地需要抓包。 没加密的还好说,随便找个工具抓下就可以分析了,有些应用数据使用tls加密了,但用的是系统内置的证书,

    2024年02月05日
    浏览(57)
  • win10 vs2022 搭建 cocos2d-x 3.17 开发环境

    https://cocos2d-x.org/download/ 也可以在 github 下载 https://github.com/cocos2d/cocos2d-x/tags https://docs.cocos2d-x.org/cocos2d-x/v3/zh/ https://docs.cocos2d-x.org/api-ref/cplusplus/v3x/index.html 需要 python2 , 安装后可以用 python2 的绝对路径运行 cocos 的 setup.py 如何没有把 python2 加入到环境变量, 可以修改引擎路径下

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包