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

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3