Cocos2d-x开发网络游戏(四) 处理网络线程

2024-06-12 19:32

本文主要是介绍Cocos2d-x开发网络游戏(四) 处理网络线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://blog.sina.com.cn/s/blog_6084f58801014g0g.html


由于socketcc只开放了以阻塞的形式接收网络数据,所以为避免界面卡死,我们只能选择开线程的方式。其实即使以非阻塞的形式接收网络数据,我们通常也要以开线程的形式来处理网络数据。

既然处理网络数据要开线程,那么我们的网络线程要开在哪里呢?2dx的创始人walzer给出的建议是开在appDelegate中。那么接收到网络数据,分包处理后(关于数据接收,分包可以参考上一篇文章)引出的界面更新问题我们如何去处理,由于界面的更新不能放到线程里去处理,我们要做的是如何把子线程接收处理后的数据放到主线程去更新。这里给出一种思路:客户端网络线程接收包处理后将其封装成事件然后加入事件队列,当然队列封装成什么样子要看你自己处理。然后在主线程中取出队列事件命令进行界面的更新。

下面是实现思路:

1.           实现公共消息处理类:此类继承自CCNode,用于主线成界面更新。公共消息处理类用于处理公共消息,也就是处理可能在任何场景都会进行界面更新的消息。比如服务器发送消息要求客户端不论在那个场景都要弹出提示框的命令等。特定场景的消息的处理放到特定场景即可,不再赘述。

class CCQuene;

class NetPackage;

 

class PublicMsgHandler:public cocos2d::CCNode {

private:

CCQuene * _eventQuene;

private:

MutualExclusion mutexQuene;

pid_t           pidMutExOwner;

void            WaitMutex() { mutexQuene.Lock(); pidMutExOwner = getpid(); }

void            ClearMutex() { mutexQuene.Unlock(); }

public:

PublicMsgHandler();

~PublicMsgHandler();

virtual void update(float fDelta);

void addEvent(NetPackage * netPackage);

};

 

来看里面的实现:

 

PublicMsgHandler::PublicMsgHandler(){

    _eventQuene=new CCQuene();

    this->onEnter();

    this->onEnterTransitionDidFinish();

    this->scheduleUpdate();

}

 

PublicMsgHandler::~PublicMsgHandler(){

    this->unscheduleUpdate();

    delete _eventQuene;

}

 

void PublicMsgHandler::update(float fDelta){

    WaitMutex();

    if (_eventQuene->count()>0) {

        NetPackage * package=(NetPackage *)_eventQuene->popObject();

        switch (package->type) {

            default:{

                CCLog("public events");

            }

                break;

 

        }

        package->release();

    }

    ClearMutex();

}

 

void PublicMsgHandler::addEvent(NetPackage * netPackage){

    WaitMutex();

    _eventQuene->pushObject(netPackage);

    ClearMutex();

}

 

需要注意的是这里使用了资源锁,因为_eventQuene在不同线程执行时很可能发生同时访问,这是如果没有处理,将直接导致崩溃。关于信号量有什么不接大家可以参考操作系统。

         update中我们添加事件处理。如界面更新等。

         在接收线程中接收封装NetPackage,然后将其扔进队列

 

2.           如何在appDelegate中实现主线程的界面更新。

我们知道CCNode中实现了update方法,CCNode在调用schedualUpdate后可以实现update调用,当注意有前提,此CCNode必须处于running状态。默认情况下节点加入父节点后就会自动处于running状态。不过可以的是AppDelegate不是继承自CCNode,这样我们就没有办法在此调用update方法。那么那些共有消息如何处理。

别急,有办法。看下PublicMsgHandler的构造函数

PublicMsgHandler::PublicMsgHandler(){

    _eventQuene=new CCQuene();

    this->onEnter();

    this->onEnterTransitionDidFinish();

    this->scheduleUpdate();

}

在构造函数中我们调用了

this->onEnter();

this->onEnterTransitionDidFinish();

只要调用这两个方法节点就可以处于运行状态。

 

3.           使AppDelegate保有PublicMsgHandler

bool AppDelegate::applicationDidFinishLaunching()

{

pMsgHandler=new PublicMsgHandler();

。。。。。。

。。。。

    }

ok,这样游戏就可以接收公共消息并可以实现主线成的更新。对于相应页面的消息处理,你可以同样按PublicMsgHandler的处理方式去处理。

就介绍到这了。

这篇关于Cocos2d-x开发网络游戏(四) 处理网络线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055133

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处