前言:
本章主要讲述 游戏逻辑中_垂直拆分_增量更新 的优化
把数据库内用到放到游戏的AOI上用
基于MMORPG讲述,温故而知新
1: 人物/宠物/其他对象 属性
最小6件装备 外加时装 可能还有宠物,武魂,翅膀 变身卡 坐骑 称号 BUFF等等
这里所谓的垂直拆分_增量更新 就是 更新了 某装备,先减去这装备的属性,再增加新的 装备的 属性,这样更换/脱下 某装备 只需要更新这件 装备属性就行,有百分比 基本的算完了,再计算一次。
也可以说是也空间换时间。拆的越细,计算效率越高,但是空间需求越大;
2:AOI
一般AOI 的基本接口如下
enter:对象进入地图;
leave:对象离开地图;
move:对象在地图内移动。
这里以一般的MMORPG为例,一般 分主城与野外
先可以想象下,现在是一张世界地图,就是主城与野外 本来就是一张大地图,不过垂直拆分后,才有了主城与野外 2张地图,传送点相当于 从一个 九宫格的 一格 跑到 另外一格(灯塔也差不多,一个灯塔到另外一个 )

这里以 传送点1 与传送点2 可以相互传送为例 讲述
垂直 拆分后,如果有对象(玩家) 来回跑,2个传送点附近还有大量可视对象,
按enter leave 流程 ,
1 >进入 ,把自己广播给其他对象,同时把其他可视的对象 发送给自己,
2>离开 ,告诉其它玩家,自己消失
从后端来说,消息量太大 (出现的消息 体量大,消失还好 体量很小)
从前端来说,如果加载 再删除,再加载地图及其他对象,耗时,卡
如果在一张大地图里呢,玩家进入与离开不过是 类试于 从一大格 瞬移到另外 一大格里,
结合 延迟 消失 的策略,后端的消息量会大大减少,前端的也不需要加载,释放,反复来回,
以九宫格讲述 一般来说 九宫格 G = V ,再跨 1、2G(有飞行速度快的,可以3G,根据实际来) 就可以通知消失了
具体可以根据配置表 配置

两张图里怎么搞呢,简单,(假如设定,延迟删除为跨2G )
从传送点1 传送 到 出现点1,相当于 移动到 缓冲带,根据后面的移动情况再决定是否删除,
1> 记录上格地图ID
2>到 出现点1 再跨2个G,再删除 (到野外 后,跨到黑色框外再删除)
3>到出现点1后,直接进入传送点2,又回来了,可以当移动处理
优化enter/move 消息,主要是优化 出现的消息(这个消息量大,一般包含 对象外观 状态 特效,宠物 等等)
怎么优化呢,增量更新
对象 有1 件装备 1 个坐骑 一个出战宠物(简化版,根据实际情况自行扩展)
当前装备(坐骑,宠物类试) 版本号 当装备有更新时,更新属性的同时,更新版本号
1>在视野范围内,自己更换了,广播给其他对象时,只广播 更新的及其影响的可视属性
2>在视野范围内,
1>>自己更换了, 某对象从缓冲列表里重新回来视野时,对比装备版本号,如果什么也没变,只更新坐标,如果版本号 不相同,更新位置时,同时更新 装备及其影响的可视属性
其他的坐骑 宠物 同样如此
2>> 别的对象换装备后,别的对象的 装备版本号 与自己缓冲区里的这个对象的 装备版本号 对象,有差异,更新,没差异,只更新位置
3>可以增加一总版本号,先对比总版本号,有差异,再比较具体的 版本号,再增量更新
3:其他的垂直拆分
可以把玩家数据保存到单独的一个子进程/线程里 ,跟场景分开,还可以拆分到 计算 线程(CPU密集型)
专用用于计算任务,比如 对象更新装备,重新计算属性,可以分派 到计算 计算线程 去处理,数据进程 只等结果出来后更新,越单一职责,效率越高,
4:水平拆分
场景多线,副本等等都是水平拆分了,这里就不介绍了
5:如果觉得有用,麻烦点个赞,加个收藏
游戏逻辑的拆分上 可以 参考下 数据库 ,毕竟数据库 很成熟了,有各种解决方案