- 本帖最后由 pleasenter 于 2012-5-5 15:10 编辑 *
今天好不容易绑定了luasocket2.02到cocos2d-x0.12的版本,可是正准备开写的时候突然楞住了,如果我的lua游戏逻辑需要跟服务器交互,那么我在lua中创建了一个socket并连接到服务器后,每次的send,recv都是阻塞的,而我的界面代码又是lua在执行,这也就意味着每次send,recv的时候,游戏就将卡在那里,然后等send,recv执行完毕界面才能动,局域网还好,如果是广域网呢,这是不可接受的。在c++或者别的语言里,一般是新建一个thread来解决阻塞的问题,可是我们亲爱的Lua是不支持thread的,她所支持的协程只能用于非阻塞代码,所以绑定了luasocket到cocos2d-x的行为是愚蠢的,除非你的代码在局域网内运行。
之所以写到这里,是希望国内像我一样对c++不熟悉又打算用简单的Lua来写游戏的朋友不再犯我这样的错误,抛砖引玉。
上面光写了问题,还没写解决办法呢。这里也说说我的不成熟的想法,就像平时我们在别的语言里写网络程序一样,当你有IO操作不想阻塞掉用户界面的时候,就只能用异步IO或者开一个专门的线程来执行IO操作,最后在IO完成的时候再通知到界面代码,这里无疑也只能这样解决。你可以在cocos2d-x的主程序代码(c++)里面用一个线程封装好你的socket操作,然后在主线程里增加两个数据队列(发送和接收,要有同步锁),最后封装两个函数往里面塞数据和取数据,lua代码则起协程来调用这两个函数,这两个函数是不会阻塞的,所以lua操作的界面也不会阻塞。另外lua在每次调用完这些非阻塞的函数后,可以把调用协程挂起,而c++里处理完队列数据的发送接收后再唤醒协程,这样可以了。
上面只是一个思路,我没有验证的,大家可以试试。