Cocos2d-x is not thread-safe

来源:互联网 发布:淘宝店铺总销量怎么看 编辑:程序博客网 时间:2024/05/16 00:32

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

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

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

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


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

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

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

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


怎么解决这个问题?

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

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

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

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

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

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


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

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

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

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

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

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

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

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

(橡木疙瘩(u010936098)@CSDN)

0 0
原创粉丝点击