之前几个小游戏项目都是以JSON进行传输,这回做IO类游戏,同房间超过30人后客户端在运行一会后运行越来越慢,经各方面排查最终发现:使用JSON传输数据量传输导致数据量大增(每秒20K),从而影响了游戏的运行速度。于是着手将JSON改为二进制传输。
服务器端用的是PHP的Workerman,这个开源框架十分好用,几个项目下来也非常稳定。 PHP有pack和unpack可作为二进制的封包和解包。但经过测试,发现服务器向客户端发送数据时总会导致客户端断线。由于开始并不知道是哪里引起的问题,所以排查了半天,后来终于发现是因为Workerman的默认设置而引起。
Workerman默认的传输格式是UTF,也就是:
$connection->websocketType = Websocket::BINARY_TYPE_BLOB;
看了文档如下设置:
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
设置好后重启服务果然好了。
我将游戏核心传输部分改为二进制数据传输,而90%的命令仍然以JSON传输,这样游戏的修改工作量大大降低,而且JSON确实也很好用。这样即解决了游戏过程大量的数据传输,又保留了大量JSON的易用性。