rt,cocos2d-x 不是线程安全的!
在开发一个网络应用的时候,一般会起一个新的线程用于接收服务器端反馈的数据。
不推荐在接收线程中处理接收到的数据,因为可能会引发一些问题,
普遍的做法是把收取到的网络数据抛给主线程做处理。
前次我就遇到了与此相关的问题,在接收线程中我一收到服务器端发过来的数据就做处理了,
(具体来说就是在子线程中为当前场景添加了一个精灵节点)
结果添加的这个精灵竟然没有正常的显示出来!
(经过我多次地测试,找到了一点儿规律:如果精灵所使用的纹理之前有加载过,则能正常显示;反之则显示不正常)
怎么解决这个问题?
接收线程只负责消息的接收,不负责消息的处理。
接收线程将收到的消息派发给主线程进行处理(附带的,OpenGL 也不是线程安全的)。
CCNotificationCenter 和 MTNotificationQueue 能够比较轻松愉快地解决类似的问题,
(在了解这两个东西之前,我一直采用的是 “单例暂存接收到的消息” + “scheduleUpdate持续不断检测” 的方式)
完整的用法目前还不是很了解,有待进一步研究
(总而言之,NotiCenter + NotiQueue 比我所采用的原始的方式是先进了太多了,怎一个爽字了得)。
下面是我在逛论坛的时候看到的,觉得说挺有借鉴价值的
(虽然不太适用于 ccx —— ccx 添加子节点必须在主线程内完成,所以 “处理线程” 是不成立的)
关键是接收和处理哪个更快。
子线程不要既接收又处理,应该分为接收线程和处理线程,
根据接收和处理数据的速度情况分配数量,接收线程和处理线程通过待处理队列来交换信息。
最好做成自适应的,待处理队列增长到一定程度就增加处理线程,减少接收线程;
队列缩减到一定程度就增加接收线程减少处理线程。
用多态来解决不同数据有不同处理的问题。
(橡木疙瘩(u010936098)@优快云)