举个简单的例子,我们要显示一个背包中的道具,需要道具数据库保存ID、类型ID、图片地址、名称、大类别、子类别、质量、说明、是否出售、是否锁
定、道具创建时间、道具持续时间、使用效果定义字符串、可使用等级、堆叠数量、最大堆叠数、出售单价等等,如果按传统做法,就是返回一个二维数组,将所有
信息加载进来,然后直接填充列表,依次填写各项内容。这个做法很很简单,初级程序员就能完成,但代价是,传输数据量会非常大。
下面介绍的内容就是为了缩小数据量,较少传输时间及降低服务器压力。
传输数据格式
现在常见的传输数据格式有三种:XML,JSON,AMF。
XML是通用数据格式,在保存数据方面有明显优势,在传输数据方面,对Flash而言,数据传输的双方都是确定的,并不需要通用,所以XML这点优
势不突出。因此,实际可用的就是体积较小的JSON和AMF这两种格式。前者可以用Firebug直接查看数据,后者目前也有很多方法可以查看数据了。同
样数据内容,JSON即使压缩也应该比AMF的体积大,但AMF由于协议负责会有固定额外体积,如果只传一个数据JSON反而会比较小。
一般情况下,选AMF更好,不过即使用JSON应该也不会有太多性能问题,旧项目无需强求。
存储数据格式
在游戏中通常可以看到,道具栏可能会有同种道具多次出现。这时候重复加载数据是一种浪费。通常一款游戏道具数量不过数百个,即使包含大量描述信息,
全部用XML保存,最多也就几百KB(千字节),用G-ZIP(即ByteArray的compress()方法)压缩后可达几十KB,这不过相当于一张
大图而已,与整体资源体积相比只是个零头。所以即使作为资源一次加载也是没问题的。
这样我们可以将所有道具固定信息保存在一个文件中,开始便加载,在加载完后取出所有数据。这些数据是道具定义,包含类型ID、图片地址、名称、大类
别、子类别、质量、说明、是否出售、是否锁定、使用效果定义字符串、可使用等级、最大堆叠数量、出售单价。这些信息的保存形式可以是XML、JSON、
AMF,具体形式无所谓。服务端只需要返回数据库中保存的唯一标识ID、类型ID、堆叠数量这三个值就可以,然后通过类型ID找到道具定义中其他需要的数
据。
显然这笔之前传输的数据量要少很多。
三种存储形式各有特点:XML优点在于格式通用,很多软件都能修改及输出,且容易被Flash解析;JSONG也容易被Flash解析,体积较
XML小,但支持的软件少,需要自己写编辑工具或转换工具;AMF体积更小,但因为不是文本形式,不用专门工具无法修改,是最依赖工具的格式。
由于这部分分数据体积不大,不需要过于纠结保存的格式。个人比较推荐XML格式,这样完全不依赖特殊工具,数据库也容易自动生成,是目前网页游戏及客户端游戏广发使用的。(星际争霸2就包含了大量XML)
文本文件压缩方法
上面提到的G-ZIP压缩指的是ByteArray的compress()方法,将文本写入ByteArray,执行compress()方法保存成文档,读取时获得ByteArray,执行uncompress()获得文本。
一般一个有格式描述的XML文件可以压缩到1/10,所以文本文件体积不是问题。可以用这个工具来实现压缩及解压文本文件:
http://code.google.com/p/ghostcat/source/browse/trunk/tools/GhostCatTool.swf
这里有个小技巧,当ByteArray未被压缩时,执行uncompress()会出错但不会改变ByteArray的内容,因此可以用try捕获
uncompress()方法引发的错误,无论成功与否都获得数据。这样如果加载未压缩文件也可以正常使用,在调试时使用未压缩文件也方便修改,发布时再
生成压缩版本以减小体积。
仅更新修改
当你使用了一个道具后,该如何更新物品列表呢?发出使用请求后重新加载道具列表?这是最简单也最浪费的做法,原因应该无需说明。
这就要求我们应用模型和视图分离的思想。获得整个道具列表后将数据保存在他处,即使关闭面板数据也还存在。之后直接操作这个保存的数据。使用道具就
减少道具堆叠数量,数量为0时就删除这个道具,同时发送给服务端使用道具请求。不重复获取整个列表,而是与服务端一直同时修改列表。虽然出现Bug时会造
成前后端不一致,但这种做法是值得推荐的。
获得道具也是同样原理,应该获取新道具信息,并将数据添加到道具模型中。每次都重新加载列表确实很简单很稳定,但做法过于粗糙和暴力。
减少键值数据
当传送大量数据(诸如500个好友)时,即使只传输必要数据,数据量也可能会很大。当然这要看采用哪种传输数据格式,不管用哪种格式都会有数据冗余
——那就是对象的键。当传输的数据是数组时,数组里是同样类型的对象,但即使都是同样类型,序列化时依然要在每个对象里重复传递对象的每个键字符串。如果
有500条数据,这些键字符串就会重复500次。
把对象转换成数组,就可以不传递这个键值,数据体积将会大大减小,也可以单独将键值传过去,方便完成传输后重新组合成对象。
二进制协议
最彻底的解决方案是采用规定的二进制协议来传输数据。将数据根据特定的格式和顺序依次存入ByteArray中,定长数据直接保存,而不定长数据则
先保存长度再保存数据(数组也是不定长数据的一种),这样生成BytesArray,直接发送到另一边,再用同样的方法将数据取出来。这样做数据量最少,
但是二进制协议的开发成本相对比较高,也容易出错,因此只在对即时通讯要求较高的情况下使用。
分享到:
相关推荐
【标题】"毕业设计——多点无线数据传输系统论文资料.zip"揭示了这是一个关于毕业设计项目的资源集合,主要探讨的是多点无线数据传输系统。在IT领域,无线数据传输系统是一个重要的研究方向,特别是在物联网(IoT)...
本实验——“rdt可靠传输实验”旨在深入理解和实践这一概念,通过模拟实现rdt3.0协议和Go-Back-N (GBN)协议,使学生能够亲身体验并理解这些协议的工作原理。 rdt( Reliable Data Transfer)协议是一种理论上的抽象...
2. **无线数据传输**:无线数据传输是通过无线信道(如射频RF、蓝牙或Wi-Fi)进行数据交换。在这个项目中,可能采用了射频通信技术,如NRF24L01或者蓝牙模块,来实现设备间的无线数据发送和接收。 3. **硬件设计**...
本文将围绕“论医疗数据权利配置——医疗数据开放利用法律框架”这一主题,深入探讨医疗数据的权利归属、开放利用的法律边界以及相关实践中的挑战与对策。 首先,医疗数据的权利配置涉及到数据的生成者、持有者和...
《网络流量数据集——Moore:深度解析与应用》 网络流量数据集是研究网络安全、网络性能优化以及网络行为分析的重要资源。Moore网络流量数据集,由Moore等人在剑桥大学进行采集,是此类数据集中的一颗璀璨明珠,为...
详细的红外数据传输方案,包括源码,详细设计。。。。。。。。。。
《基于CORBA的分布式应用软件网络性能初探——单次调用传输的数据量大小对有效吞吐量的影响》 本文探讨了在分布式应用软件中,尤其是针对导航系统,基于CORBA(Common Object Request Broker Architecture)的...
《毕业设计——MCGS数据采集单片机数据传送的设计资料》 在现代电子技术领域,数据采集与传输是至关重要的环节,特别是在自动化系统、工业控制以及物联网应用中。本毕业设计聚焦于利用MCGS(Magic Control Graphic ...
单片机毕业设计——毕业设计——nRF905的无线数据传输系统.zip
人工智能自主性的行为主义路径与问题——以布鲁克斯的行为主义为例 一、行为主义与人工智能自主性 行为主义在人工智能领域是一种研究方法论,主张将智能行为的产生归因于机器与外部环境的交互作用。行为主义的基本...
《CPU设计——数据通路的设计与实现》是四川大学计算机组成原理课程的一份高分实验报告,旨在通过设计和实现CPU中的数据通路,让学生深入理解计算机内部的工作机制。实验内容涉及了CPU的核心组成部分,包括数据通路...
【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输-附件资源
计算机网络课程设计——IP数据报流量统计 本课程设计主要是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示...
本文将深入探讨一个使用C#编程语言实现的P2P数据传输软件——飞鸽传书.net,同时也会涉及TCP、UDP协议以及Socket编程等关键知识点。 首先,我们来看飞鸽传书.net的基本原理。P2P网络架构下,每个节点既是客户端也是...
"计算机网络——数据链路层" 计算机网络的数据链路层是计算机网络的低层,主要负责在网络中的数据传输。数据链路层使⽤的信道主要有两种类型:点对点信道和⼴播信道。 点对点信道是一种点对点的连接方式,每个结点...
单片机毕业设计——毕业设计——AT89C51单片机在无线数据传输中的应用.zip
计算机网络——传输层
PC主机为了能下达命令,或是传输数据给外围设各,基本上,就必须有一套标准的USB通信协议来实现这个目的。如图所示,为PC主机与设备执行通信协议的整体结构。这个结构相当重要。图中显示了一个通信协议所需包含的...
通信控制篇——SD卡数据传输(一) 1.简介 利用FPGA实现SD卡数据传输——SPI模式。 2.原理 SD卡简介 SD卡——Secure Digital Memory Card。最早的SD卡是从MMC卡发展而来的,目前SD卡有三种规范——SD1.0、SD2.0和SD...
Qt入门(七)——TCP传输协议(利用多线程实现多个客户机与服务器连接)