视野同步AOI
- 1.视窗同步(独立镜头)
- 2.九宫格
- 3.灯塔(九宫格的优化版)
- 4.四叉树
- 5.十字链表
1.视窗同步(独立镜头)
SLG或RTS类型游戏一般用这种方法来实现。
两者还有细微的区别:
RTS
对于即时性的要求很高,选手会经常切屏来观看游戏信息。所以通常会直接采样全图广播
,就是任何单位数据发生变化时,都会通知所有的客户端。不做视野裁剪。
SLG
一般地图都很大,且对即时性要求不是那么的高。所以在同步方案上,会做视野裁剪
。如下图:
-
每个客户端都拥有一个青色的视窗,视窗可以在大地图上滑动。
-
通过坐标计算,为视窗维护每次滑动后,视窗的可见格子列表。例如这里的
(1.3) (1.4) (1.5) (1.6) (2.3)(2.4) (2.5) (2.6) (3.3) (3.4) (3.5) (3.6)
-
客户端只加载渲染可见格子列表内的物件,其它格子内的单位全部忽视。
当视窗滑动以后呢,计算更新可见格子列表:
(2.6) (2.7) (2.8) (2.9) (3.6) (3.7) (3.8) (3.9) (4.6) (4.7) (4.8) (4.9)
变为不可见的格子:(1.3) (1.4) (1.5) (1.6) (2.3)(2.4) (2.5) (3.3) (3.4) (3.5)
保持不变格子:(2.6) (3.6)
新增可见的格子:(2.7) (2.8) (2.9) (3.7) (3.8) (3.9) (4.6) (4.7) (4.8) (4.9)
2.九宫格
视野对 pair<unit1, uint2>
以玩家为视野中心,在玩家身上维护可见的单位列表。
假设服务器来了1000个玩家,就有1000个九宫格视野。
会随着玩家数量的增加,计算量线性增加。
3.灯塔(九宫格的优化版)
在初始化地图的时候,就预设了灯塔的数量。灯塔会维护进入该区域的玩家列表。
九宫格视野的数量,不会随着玩家数量增加而增加。
4.四叉树
5.十字链表
云风的blog https://blog.codingnow.com/2012/03/dev_note_13.html