博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【cocos2d-x 手游研发小技巧(8)通讯的数据压缩与解压 】
阅读量:4931 次
发布时间:2019-06-11

本文共 2391 字,大约阅读时间需要 7 分钟。

天说一下手机游戏通讯协议中的数据问题,大量的数据将给服务器端和客户端带来很大的压力,一般来说。

游戏的数据分静态数据和服务器传过来的动态数据,静态数据大部分通过lua,xml,csv等格式来存储使用。

动态数据则由服务器发给我们了,不管是用弱联网还是强联网,往往服务器会发送大量的一些数据给客户端接收,

如果思路设计的不好,往往发送接受而不止一次,那么遇到这样的服务器客户端交互的大数据问题只能靠压缩和解压来处理了,

压缩后不但可以将大数据变小,还可以为用户节省流量,一举多得的事情是非常赞的。

最近我的一个项目就使用了这个压缩和解压工具,源码是C写的,所以可以放心的跨平台使用。

 

下面我说一下具体使用的细节:

 

1,在使用之前需要先初始化一下,且初始化一次就好,放在构造函数中

 

     //消息压缩加密        if (lzo_init() != LZO_E_OK)        {            printf("internal error - lzo_init() failed !!!\n");            printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n");        }

 

2,在给服务器发送的时候也可以压缩,压缩方法如下:

lzo_uint in_len;    lzo_uint out_len;    lzo_bytep in_last = (lzo_bytep)json_data;    in_len = strlen(json_data);    if (lzo1x_1_compress(in_last,in_len,outlast,&out_len,wrkmem) == LZO_E_OK)    {        printf("compressed %lu bytes into %lu bytes\n",               (unsigned long) in_len, (unsigned long) out_len);    }    else    {        CCLOG("错误了!");        return 0;    }

3,接收到服务器数据的时候进行解压,当然在这时,接受的到包是压缩后的包,而且直接接收到的压缩包直接输出是看不到值的,但包的大小

是可以通过服务器获取,所以解包的时候和上面是相反的;

lzo_uint old_len;                    lzo_uint new_len;                                        char *strbuff_cc = new char[REC_BUFSIZE];                    memset(strbuff_cc, 0, REC_BUFSIZE);                    old_len = allsize;                                        if (lzo1x_decompress((lzo_bytep)buffer_all,allsize,(lzo_bytep)strbuff_cc,&new_len,NULL) == LZO_E_OK)                    {                        printf("decompressed %lu bytes back into %lu bytes\n",                               (unsigned long) new_len, (unsigned long) old_len);                    }                    else                    {                        CCLOG("解压err!");                    }                                        strbuff = string(strbuff_cc);                                        if(strbuff.length()>0)                    {                        SocketThread::paserBody(strbuff);                        int num = strlen(strbuff.c_str());                        CCLOG("all package >>>>>%s,and size:%d",strbuff.c_str(),num);                        CCLOG("package size:%d",num);                                            }

 

Ok,我们来看一些效果,将使你会大吃一惊的!

已将包大小为16567 的解压出来为123768 ,12K的东西压缩为1K,通讯质量以及速度将会快很多,以及流量都会节省不少。

 

我将这个压缩工具分享一下:

 

转载于:https://www.cnblogs.com/zisou/p/cocos2dxJQ-8.html

你可能感兴趣的文章
Console命令详解,让调试js代码变得更简单
查看>>
hdu4908 & BestCoder Round #3 BestCoder Sequence(组合数学)
查看>>
Excel 导出
查看>>
拉登是我罩的队_第三周_需求改进&原型设计
查看>>
数据库got error 28 from storage engine问题
查看>>
RMQ 总结
查看>>
手撸ORM
查看>>
POJ---2406 Power Strings[求最长重复字串]
查看>>
linux搭建haproxy
查看>>
Oracle update 日期
查看>>
【t088】倒水
查看>>
【t016】邮递员
查看>>
EasyUI 树形菜单tree 定义图标
查看>>
android 从系统相册获取一张图片
查看>>
JS动态构建一棵目录树
查看>>
JS判断只能是数字和小数点
查看>>
SSL 2289——庆功会
查看>>
Linux命令--su与sudo
查看>>
python课堂练习
查看>>
区块链资料高清PDF合集
查看>>