前言

游戏服务器与客户端的数据同步,各家有各家的秘籍。下面我就分享一下http服务器和客户端基于JSON文件的数据同步的思路。

何时同步

http短连接,就是每次返回客户端消息时,包同步数据带回去。同步数据放到消息返回前。

Json文件制作和格式剖析

card.json
{
    TagName: card //此为json标识,前后端解析识别
    keys: [ //keys为Json具体数据键值
        {
            keyName: 'GUID',
            comment: '唯一ID', //同步数据时用户标识此OBj,全局唯一
            type: 'String',
            value: ''
        },
        {
            keyName: 'uid', 
            comment: '玩家UID', //基本说明,利于维护
            type: 'Number', //数据类型,可做基本校验
            value: 10000, //初始数据默认值,
        },
        {
            keyName: 'level',
            comment: '等级',
            type: 'Number',
            value: 0
        },
        {
            keyName: 'ctSkin',
            comment: '皮肤',
            type: 'Array',
            value: []
        }
    ]
}

Json文件设计对应Obj格式

简单描述下,JSON文件对应的Obj对象怎么设计

{
    tagName: card, //obj对应JSON文件名字
    keyIndex: { //同步时需要记录变更的数据位置,比直接传keyName要好
        GUID:0,
        uid:1,
        level: 2,
        ctSkin: 3,
    },
    keyValue: ['10001@10000', 10000,  5, []] //本地保存,此OBj所有数据
    changeKeys: [2] //变更了那些Key
    function syncChangeToClient () {
        //简单的算法对应完毕
        [变更的JSON原型对应怎么解析,[[变更的位置,变更后数据格式],[变更的位置,变更后数据格式]],全局索引GUID(用来和多个卡牌做区分)]
        //卡牌'10001@10000'索引的对象,数据1位置变更为10
        return ['card', [[1, 10]], '10001@10000'],
    }
    function syncToClient () {
        //简单的算法对应完毕
        [JSON原型名字,[当前所有数据]]
        return ['card', ['10001@10000', 10000,  5, []]],
    }
}

同步的类型

同步需要只要需要3个数据表示出,增加[1]、删除[2]、更新[3]

增加

这种增加,一般都是把新生成Obj全部同步给客户端。 eg:

{
    1:[ //数组,为了支持一次同步所有增加、删除、更新
        obj.syncToClient();//每一个增加的对象
        obj.syncToClient();//每一个增加的对象
        ...
    ]
}

删除

删除Obj一般只需要提供tagName外加GUID即可 eg:

{
    2:[ //数组,为了支持一次同步所有增加、删除、更新
        [
            card,'10001@10000'
        ],
        ...
    ]
}

更新

更新需要提供tagName,GUID,以及每个更新的Key索引和最后的值 eg:

{
    3:[ //数组,为了支持一次同步所有增加、删除、更新
        obj.syncChangeToClient();//每一个更新的对象
        obj.syncChangeToClient();//每一个更新的对象
    ]
}

同步的基础规则

1.更新后删除的,数据不同步更新的字段,只同步删除 2.单个Obj多次更新的,每个Key只同步最后值,一次同步完毕 3.增加后更新的,只同步增加全部属性 4.增加后删除的,不同步数据 5.删除又增加的,理论不出现,但要同步增加的数据 6.增加、同步、删除各个key内有数据才有,比如只有增加同步只需key1就行,都有的话,就是{1:[],2:[],3:[]} 7.每次同步完毕都要清除本书数据变更状态

结束语

思路还是比较乱,设计还是不是很成熟。终究是没有实际代码去验证,自己也很遗憾,等后续有成品东西出来,再接着验证去分享。