MMORPG的大规模团战中,需要经常判断两个单位之间的阵营关系,从而为技能生效提供判断依据(往往分为敌方、我方、友方、中立方等)。如果N个人同时使用技能,这个判断函数的调用次数将会是N**2的量级。
而随着游戏的生命周期的延长,这种判断会变得越来越繁杂(不加东西怎么做社交?怎么坑钱^_^)。这时候,这个判断函数就有可能会(肯定会)成为战斗系统的瓶颈。
优化方案:
建立cache缓存阵营关系
实现细节:
1. 在某个量级上建立一个cache,这个cache用来存储未来的阵营关系,初始为空
2. 在战斗单位上新增一个属性ver,这个属性用来标记战斗单位的所有阵营关系参数集合的版本,一旦其中任何一个参数发生改变,ver+=1
3. 一旦发生某次判断得到结果ret,就以当时的(src_id, tgt_id)作为key,存入(src_ver, tgt_ver, ret)
4. 下次发生判断时,就先去cache里查询,如果命中,就得到上一次的src_ver, tgt_ver, ret,将ver做对比,如果没有发生改变,就直接读取ret,否则就重新进行判断并重复3中操作(切记阵营关系只是单向的,不一定是双向的,所以src-tgt跟tgt-src不一定结果相同)
此时只是功能上实现了优化,随着时间的推移,cache的大小会越来越大,而其中很多单位已经离开这个管理量级的管理范围了,他们的阵营关系已经无用。因此:
5. 加入定时器,定时clear此cache。由于业务上特点,这种判断是集中在某段时间内的频繁调用,因此不需要加入时间戳来保证“xx时间内不用的cache才被清除”这种优化。