最近逐渐变成了lua黑,群里也时不时的和二小姐(一位lua粉)怼一波。
游戏行业用到lua那也是大家公认的好,优势不计其数。到底是什么原因让我对它如此抵触?几点无关痛痒的主观认识让我不太喜欢用它。

非人类的luasocket


大约两个多月前,和一朋友合作说写个小手机网游出来,他用的cocos引擎C++和lua。为了给他省事。自然想到直接使用lua那边的socket他应该使用起来更方便。可是我先自己写了个低配demo来测的时候发现

  • 发送和接收数据要以\n或者\r结尾(哪个语言有你这蛋疼要求?)
  • 收不到char的13,因为这是\r(exo me??哪个语言像你这样?)

当然上面这两点实际上是我使用不当的原因造成的(网搜不靠谱系列).后来朋友在官方文档里解决了这两个问题。但也是在我们决定还是使用c++的网络模块,并且使用一段时间后因为他有些控制不当,他才决定研究官方文档使用luasocket.(于是我们的填坑之路起航…)

供不应求的库


也是大约两个月前,我传了一个json数据给他。他在JSON.decode的时候报错,因为必须是utf-8而我收到的是unicode(有中文).当时为了赶进度,懒得研究了,于是把我这边传的内容改改改改,用其他方式传递给他。可是吖,前些天我一不小心又传了几个有中文的json串给他。他又报错了,我这才回想起当初这问题没有根治。我让他把unicode转成utf-8他也说lua没有现成可用的接口,当时倒是网上搜了段可用代码先用着了.
在设计战斗回放功能的时候,我说数据量特别大,需要用zip压缩一下再发给客户端,发现,也没有现成的zlib库可以用(这似乎是我搜索方式不对),不过这功能还在后面,到时候再仔细研究一下.

嗤之以鼻的速度


这里的速度,不是说运行速度慢,lua的运行速度比我们python还是是要快那么一些的.我说的速度,还是luasocket。
使用luasocket期间,一切还算是比较正常,没有出什么大的问题,连接断开也控制得比较好.直到…
因为我们要在游戏中使用语音功能.我们选择的方式是客户端使用第三方工具录音,然后把二进制通过服务器转发给另外几个玩家,再进行组装mp3播放.然后问题就来了,录个二十秒半分钟的语音。二进制的长度达四五万的样子,突然发现,另外几个玩家收不到语音,而且一发语音之后发现所有的数据都收不到了.开始我们对服务端的socket进行了质疑,经过各种验证发现没问题,最后定位为数据太长luasocket接收不过来或者是超出了它所能一次接收的范围然后客户端就不会去取(我们取数据的方式是达到规定的长度后才会去socket里面取),于是我们认为分包就能解决这个问题,把语音数据分成多个包,把一个包的数据量控制在1500,于是我们发现了另外一个更让人想骂街的问题. 连续发送超过20个包给客户端的时候,因为处理不过来,导致后面几个包会超时重发(),为解决个问题,语音发送方又控制了一下把多个包分在多帧发.发现并不能彻底解决问题,而且也认为就算把语音问题解决了,后面难保不会出现连续几十个包发过来..经过商讨,终于还是决定,放弃luasocket

综上


让我对lua越来越黑的原因,大概就是这两点了

  • 没有优秀的网络模块,只有依靠别的语言才能存活(虽然人们对lua一直以来的定位就是辅助)
  • 没有足够的库支持,很多都得再造轮子or依靠其他语言

这应该算是我对lua的使用不恰当,造成了我这想法,正确使用lua的方式,就应该是打辅助方便热更.

留言

2017-02-15