您的位置:首页 > 其它

高效的成就系统实现简介

2011-02-18 16:49 337 查看
什么是成就

成就系统可以理解为对某个角色成长过程重大事件的记录;玩家通过查看成就跟踪角色涉及的重大事件。

成就的策划模版数据

ID, 这个成就的唯一标识;

Name, 命名;

EventCategroy, 完成的事件对应的类型,类型是对各种事件大一个范围的分类;

EventCategroy2, 实际需求中可能有多种类型;

EventID1, 完成的事件ID,事件是指游戏中自定义各种事件,比如升级事件、完成多少任务事件等;

EventValue1, 上面的事件ID对应的值, 如升到20级,完成了1000次任务等;

。。。

EventIDN

EventValueN, 有些成就要完成多个事件才能完成;

其他各种限制参数,比如成就次数是否可累积等。

成就初步实现方法

1. 成就模版管理

将上面的模版生成一个简单list。

2. 判断成就完成的触发点

游戏过程中,存在很多地方会触发判断成就完成逻辑,比如,完成某个任务之后、升级之后、从某个副本出来之后等等。

3. 记录和成就相关的数据

游戏过程中,将成就相关的数据记录下来;如果其他模块已经记录的,成就模块无须记录。这些记录的数据供4使用。

4. 确定哪些成就完成

当某个模块触发了判断成就完成的逻辑时,会传入事件集合给成就模块。

成就模块拿这些事件ID&Value和1中list比较,事件满足模版要求,说明这个成就就完成了。

性能优化

如果一个游戏成就数目50个以内,上面的实现方法性能上是可接受的。成就如果再多一些,有必要做优化。下面介绍另外一种处理时间和成就个数不成线关系的方法,效率是O(1)。

1. 生成模版时要做一些额外的小动作

生成 EventCategory + EventID->AchivementID 的一个映射表, EventCategory, EventID做为组合key。

table1:

EventCategory1 EventID1 -> AchievementID1, AchievementID2

EventCategory2 EventID2 -> AchievementID2, AchievementID3

以成就ID为key,生成一个成就hash表,根据成就ID可以得到对应成就的内容, 并且EventCategory与EventID要顺序。

table2:

AchievementID1 -> EventCategory1 EventID1 EventValue1 EventCategory2 EventID2 EventValue2

上面两个映射表在系统初始化时生成1次。

2. 触发时处理

触发时,某个模块会传进来事件集合,根据table1, 得到所有事件所对应的成就IDs,最后形成类似下面一个以成就ID为key的临时表:

table3:

AchievementID1 -> EventCategory1 EventID1 EventValue1, ........

AchievementIDn -> ..........

注意,EventCategory&EventID排序规则和table2相同。

生成上面的table3时, 我们还要记录哪些成就须要去判断是否完成,这个非常关键!所以我还要弄个表保存这些成就IDs。

table4:

1 2 3 9 2 1

table4中有重复的ID,想个效率是O(1)的办法避免他重复。

最后,先拿table4中的各个成就ID,从table3定位到对应的触发事件集合,用这个集合和table2比较一下,就知道哪些成就完成了。

经过优化,策划弄个10个或10000个成就模版,成就模块运行的效率是一样的。有兴趣的同学可以体会一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐