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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta