适用于数据小且量多的场景
- 数据最好是静态的,需要一次性或者更新性加载
- 单个tile的数据体积较小,比如只有类型,等级等简单枚举性的数据
- 数据量庞大
典型的比如游戏中的 大地图
结构如下,只有简单的类型和等级数据
"l_16_t_1": {
"xCoord": "16",
"yCoord": "1",
"tileType": "10",
"tileLevel": "7",
},
"l_16_t_2": {
"xCoord": "16",
"yCoord": "2",
"tileType": "10",
"tileLevel": "7",
},
...
设计思路
数据结构设计图- 首先,我们先吧
x
,y
放开,先看下里面的type
lv
如何处理
type:类型不超过16个
lv:等级不超过10个
我们知道一个 byte 的大小是 8 位,我们这里把一个byte分成两个 4 位数据,然后通过位运算进行填充,解数据,每一个 4 位都可盛放小于等于16大于等于0的值类型,所以满足 type 和 lv 的数据结构。
由于数据类型比较小,我们才能把他两个数据放到一个byte里面去,这个是关键。以此类推,我们可以把其他类型的数据进行拆分,以盛放更多的数据,核心思想就是尽量让每一位都物尽其用,尽可能的压缩数据大
info
是byte数据
$lv = $info >> 4;
$type = $info - ($lv << 4);
- 我们再看
x
y
因为地图的 x,y是有序的,所以下个上图描述的那样,我们可以根据顺序获取 x ,y
index
是 byte的位置
n
是行数或者列数
index = ((x - 1) * n) + (y - 1);
- 从上面两步我们可看出,我们是把多有的地图数据转换成了 byte 数据,每一个 byte 代表一个tile
实际在我们开发中,我们可以将byte数组转换成字符串传输
我们的测验结果
单纯json传输的话,800*800 tile的大地图大概需要20s,这显然是不行的
位运算传的话只需要2s,效果还是很显著的
网友评论