如何建立全局的网络接口

我把Socket封装成update自动接收网络数据,但是场景一切换定时器就没了,目前我只能切换场景之后再把Socket加入到场景中,网上全是2.X版本的解决方案,请问一下目前3.X有什么好的办法吗??

能否说一下你目前是怎么做的?

我目前是在一个独立线程里面进行接收和场景主线程等没关系

:clap::clap::clap:
与楼上做法相同。
收发包都应该创建单独线程。
需要注意两点。
1.线程传递数据时加锁。
2.cocos不能在其他线程中,创建任何与文理相关的元素,opengl底层的机制。

谢谢回复,我目前的方法是创建一个SocketHandle,继承cocos::Ref,里面封装了socket的send和receive,在OnEnter方法中启动update,update中会不停接收数据包,需要接收数据包的场景都会注册多个接收的包名,当接收到数据包就是可以解析到指定的类,有需要发送和接收数据的场景需要addChild它(这样才能让update运行),

现在我发现几乎每个场景都要用到网络数据,所以我想让它持续运行,我最早使用的就是另开线程的办法,这个方式就不能调用cocos的api,只能操作数据,我感觉不太方便所以放弃了.

@museyi @liyou0115 谢谢回复,我最早也是用这个办法,但是后来放弃了…因为操作数据的话场景需要不停地在轮询数据是否发生变化,我认为应该是有数据时主动去调用场景的函数,所以我用了另外的方式.

你的思路有问题,socket的作用就是对数据的接收和发送,一个封装良好的socket组件不应该参与任何的业务逻辑,所以在独立线程里面做数据的收发是最合理和高效的,将收到的消息以其他的形式进行分发在处理,最简单的设计方法就是把数据包按照命令分组,然后不同的界面启动的时候像socket组件注册一个回调或者消息的key,socket的那边只需要做个简单的判断进行回调就可以,然后你安心的在界面里面处理你的逻辑,这样你的socket和逻辑都能复用

我说的这种和cocos的事件分发是一样的机制,一种简单的设计模式而已

首先引擎的代码不是线程安全的,所以在新的线程中直接调用引擎的代码是有潜在问题的。建议你参考Scheduler::performFunctionInCocosThread(),该接口是为了别的线程调用渲染线程代码的。

能写个教程么,急需这方面的知识,看的我头有点大,包括内核缓冲区,粘包之类的,不是很懂啊。

@minggo
@1111894
@liyou0115
@museyi
@yangshuhong
@1111894
谢谢大家,最近一直有事没能登录来感谢你们,非常不好意思,请见谅 :slightly_smiling:

教程的话估计有经验的人都没空来写吧,只能靠自己慢慢摸索了,我也是正在摸索的路上,呵呵…