Cocos2d-x is not thread-safe

rt,cocos2d-x 不是线程安全的!

在开发一个网络应用的时候,一般会起一个新的线程用于接收服务器端反馈的数据。

不推荐在接收线程中处理接收到的数据,因为可能会引发一些问题,

普遍的做法是把收取到的网络数据抛给主线程做处理。


前次我就遇到了与此相关的问题,在接收线程中我一收到服务器端发过来的数据就做处理了,

(具体来说就是在子线程中为当前场景添加了一个精灵节点)

结果添加的这个精灵竟然没有正常的显示出来!

(经过我多次地测试,找到了一点儿规律:如果精灵所使用的纹理之前有加载过,则能正常显示;反之则显示不正常)


怎么解决这个问题?

接收线程只负责消息的接收,不负责消息的处理。

接收线程将收到的消息派发给主线程进行处理(附带的,OpenGL 也不是线程安全的)。

CCNotificationCenter 和 MTNotificationQueue 能够比较轻松愉快地解决类似的问题,

(在了解这两个东西之前,我一直采用的是 “单例暂存接收到的消息” + “scheduleUpdate持续不断检测” 的方式)

完整的用法目前还不是很了解,有待进一步研究

(总而言之,NotiCenter + NotiQueue 比我所采用的原始的方式是先进了太多了,怎一个爽字了得)。


下面是我在逛论坛的时候看到的,觉得说挺有借鉴价值的

(虽然不太适用于 ccx —— ccx 添加子节点必须在主线程内完成,所以 “处理线程” 是不成立的)

关键是接收和处理哪个更快。

子线程不要既接收又处理,应该分为接收线程和处理线程,

根据接收和处理数据的速度情况分配数量,接收线程和处理线程通过待处理队列来交换信息。

最好做成自适应的,待处理队列增长到一定程度就增加处理线程,减少接收线程;

队列缩减到一定程度就增加接收线程减少处理线程。

用多态来解决不同数据有不同处理的问题。

(橡木疙瘩(u010936098)@CSDN)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值