简单优化下AOI模块
前言
当游戏开启活动让大量玩家聚集在指定地图范围内时,给服务器和客户端带来最直接的麻烦就是:
- 服务器带宽占用率高
假设同屏有1000个玩家,那么任意一个玩家移动一次需要同步其他999个玩家。这导致服务器消息数量指数级增长,带宽承受压力极高。
- 客户端渲染卡顿
因为同屏人数越多,客户端需要渲染的模型就越多。这样在一些普通的硬件设备下会直接导致卡顿、发热。
思路
除了升级硬件,还可以在以下两个方面进行优化:
服务器控制AOI消息频率
客户端裁剪同屏人数
实现逻辑
AOI同步被动推送改成主动推送,原来的设计是玩家移动后(Move消息),然后向该玩家推送周围玩家的信息。新的方式是地图AOI模块固定频率同步信息(比如1s发送一次),把需要同步的信息分类:
- 移除
不在视野范围内的物体,不需要显示在屏幕内
- 新增
新增的物体,需要显示在屏幕内
- 需要更新
原来在屏幕内的物体,需要更新信息
(如果原来在屏幕内的物体,不需要更新信息则不会发送)
同时设置同屏人数上限,超过的数量裁剪掉。不过这里面也有些坑需要注意,比如:NPC不能被裁剪、队友不能被裁剪及被裁剪的物体尽量分散避免“秃头”。
实现:
1 | func (r *Map) Init() { |
1 | type aoiNode struct { |