a little mind of binding luasocket to cocos2d-x

不好意思,我的英文实在太差了,只好用中文,反正这也不是求助:)

今天好不容易绑定了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**里处理完队列数据的发送接收后再唤醒协程,这样可以了。

上面只是一个思路,我没有验证的,大家可以试试。

http://www.cocos2d-x.org/boards/11/topics/6584

看了你的帖子,有两个问题:
1.https://github.com/dualface/cocos2d-x/tree/master/lua/exts
这里面真找不到llthread这货啊。好像是exts压根就没有。

2.llthread应该是你写的,因为我在网上搜到的没有lua对线程的支持库,可是Lua里开线程稳定吗?我看你好像是cocos2d-x的lua负责人,久仰了,上面写的东西写得有问题请多包涵,开始确实没找到lua对线程的支持。

刚刚又想到个问题,你的那种情况是解决某一个阻塞IO的操作时用的,比如你里面的一个http请求,这种请求做完就返回一个数据就完了,如果是那种长连接应该怎么办呢,就是说一直运行在那里的线程跟服务器收数据给主线程呈现,然后主线程根据用户的请求发送数据给服务器。

我也正在做这个集成。

以前是把 llthreads 放到 cocos2d-x 仓库中的,但后来考虑到保持 cocos2d-x 的单纯,所以又去掉了。现在自己下载集成即可。

llthreads 是别人开发的 lua 模块,下载地址: https://github.com/Neopallium/lua-llthreads 。我自己使用是很稳定的,还没发现问题。
不过我也打算再尝试一下 LuaLanes (https://github.com/LuaLanes/lanes) 模块,感觉这个模块功能更多,而且更新更活跃。

你说的长连接应该是开个独立的线程来维护连接,并通过某种渠道和主线程交换数据。
你可以参考 lua-zmq 的做法来实现(https://github.com/Neopallium/lua-zmq)。
LuaLanes 提供了更简单的线程间通讯功能,也可以试试看。

Please use English in this forum.
Chinese post please visit the forum of http://cn.cocos2d-x.org

OK.
I am sorry to the post.