美文网首页
「位运算」在小数据的中的运用

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

作者: FCLoveShare | 来源:发表于2019-06-17 16:29 被阅读0次

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

    • 数据最好是静态的,需要一次性或者更新性加载
    • 单个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",
            },
            ...
    

    设计思路

    数据结构设计图
    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,效果还是很显著的

    相关文章

      网友评论

          本文标题:「位运算」在小数据的中的运用

          本文链接:https://www.haomeiwen.com/subject/fqnafctx.html