「位运算」在小数据的中的运用

2019-06-17  本文已影响0人  FCLoveShare

适用于数据小且量多的场景


典型的比如游戏中的 大地图

结构如下,只有简单的类型和等级数据

        "l_16_t_1": {
            "xCoord": "16",
            "yCoord": "1",
            "tileType": "10",
            "tileLevel": "7",
        },
        "l_16_t_2": {
            "xCoord": "16",
            "yCoord": "2",
            "tileType": "10",
            "tileLevel": "7",
        },
        ...

设计思路

数据结构设计图
  1. 首先,我们先吧 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);
  1. 我们再看 x y
    因为地图的 x,y是有序的,所以下个上图描述的那样,我们可以根据顺序获取 x ,y
    index 是 byte的位置
    n 是行数或者列数
index = ((x - 1) * n) + (y - 1);
  1. 从上面两步我们可看出,我们是把多有的地图数据转换成了 byte 数据,每一个 byte 代表一个tile
    实际在我们开发中,我们可以将byte数组转换成字符串传输

我们的测验结果
单纯json传输的话,800*800 tile的大地图大概需要20s,这显然是不行的
位运算传的话只需要2s,效果还是很显著的

上一篇 下一篇

猜你喜欢

热点阅读