大型网络游戏任务系统的架构与设计

Posted 博毅创为游戏圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大型网络游戏任务系统的架构与设计相关的知识,希望对你有一定的参考价值。

  在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:

  (1)  任务配置表设计与管理;

  (2)  游戏任务的解锁与生成;

  (3)  任务完成判定;

  (4)  任务完成后的奖励生成;

  (5)  奖励的领取;

  (6)  客户端的界面展示;

对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。

任务配置表设计与管理

 

  任务配置表主要是给策划来编辑游戏任务的具体内容,同时程序根据策划编辑的任务配置来生成游戏的任务,获取任务描述, 获取奖励描述, 任务完成判定,游戏奖励领取。对于程序而言,要充分的调研游戏任务系统的功能需求,并设计出管理代码+策划编辑游戏任务的工作方式。我们拿一个比较通用的任务配置表的需求来进行分析,将一个任务配置设计下列字段:

  任务ID:唯一代表该任务类型的ID号;

  任务解锁的条件: 解锁该任务的条件(这里有N种完全不同的规则)

  任务的文字描述: 描述改任务的内容,主要用于客户端UI界面的显示;

  任务完成达成的条件: 完成该任务要达成的条件(这里有N种不同的规则);

  任务完成获得的奖励: 完成该任务可获的奖励(这里有N种不同的奖励规则);

  任务奖励描述: 完成任务后可获得哪些奖励的文字描述,主要用户客户端UI展示;

 

任务解锁条件,任务达成条件,任务奖励,不同任务都有不同的规则,那么这个如何设计呢?这里就需要充分的调查任务系统的需求,然后总结出规则,做一个规则描述表给策划,方便策划填写数据,同时方便程序按照规则解析条件表达式,例如解锁任务A,需要达到10等级。解锁任务B,需要收集10张卡, 这里解锁任务就有2种不同的规则,就需要定规则给策划填写,给程序解析,就可以生成一个这样的解锁条件表:

解锁方式ID  解锁条件描述,                          解锁参数解析模板,如

  10000      策划填写ulevel=10, 达到等级10后解锁,    type=10000,ulevel=%d

  20000      策划填写cards=10, 收集10张卡后解锁,   type=20000, ucards = %d  

  …

在策划的任务配置表里面就可以按照这个规则来填写,程序根据type类型来对应解析规则,解析解锁条件。如下:

 任务ID   任务解锁条件           任务文字描述       任务完成条件, 达成奖励

 10001   type=10000,ulevel=10    挖10个宝石,       …

 10002   type=10000,ulevel=20    挖10个水晶,        …

 10003   type=10000,uelvel=30    挖10个金币,       …

 20001   type=20000,ucards=10   合成初级战衣       …

 20002   type=20000,ucards=20   合成中级战衣       …

任务完成条件与达成奖励条件也可以按照解锁条件类似的方式来编写和制定规则。所以这里在设计的时候一定要充分的调研任务系统的需求,程序根据type类型来解析规则的参数获得对应的条件规则。

 

 

游戏任务的解锁与生成


  任务配置表的设计完成后,策划就会给游戏编辑好任务配置表,在游戏运行中要给每个玩家来解锁对应的任务并生成任务,这个时候还需要有一个玩家任务表,这个表描述了所有玩家的所有任务,这个表的设计如下:

ID: 任务的唯一ID号

uid: 这个任务对应的玩家ID号

tid: 标识玩家正在进行的任务,根据tid可在任务配置表里面找到对应的任务和描述;

status: 当前任务的状态:

未解锁【0】

已解锁,待执行【1】

进行中【2】

已结束【3】

奖励未领取【4】

奖励已领取【5】

例如:

ID   uid     tid  status

1      玩家A  10001  1

2      玩家B  10001  1

3      玩家C  20001  2

玩家任务表定义好后,任务系统监听与任务解锁触发相关的游戏事件,比如玩家升级了,升级的同时通过事件订阅模块抛出一个事件出来,任务系统监听到这个事件后根据事件类型,玩家的游戏数据,以及策划编辑的任务配置表看是否有新任务被触发解锁(根据解锁规则表里面配置的判定),如果有,就往任务表里面插入一条记录,这样该玩家解锁了某个任务。当玩家打开任务列表的时候,就从这个表里面检索出来属于这个玩家的所有正在进行中的任务。

 

任务进行中与任务完成判定

  玩家解锁了任务以后,在任务表里面就有这个玩家所对应的任务记录了,状态也改成了正在进行中,当玩家触发一个游戏事件后抛出一个事件,任务系统监听对任务判定有影响的事件。当有这样的事件抛出后,就去看下是哪个玩家触发的,然后根据任务配置表中任务的完成判断条件规则进行判断,如果条件成立,修改任务的状态。

 

任务完成后的奖励生成

  达到任务的判定条件后, 如果这个任务的类型是有奖励的,这个时候根据任务类型的描述配置表的奖励规则来生成对应的奖励。任务配置表里面有奖励的类型,以及奖励的数据,程序根据奖励规则表中奖励的类型来解析对应的奖励数据生成奖励。如果是直接给奖励,根据任务的奖励内容给玩家的数据加上对应的奖励即可,并通知前端来播放奖励动画。并标记任务已完成。如果奖励需要玩家自己去领取,可以将任务的状态改成”奖励未领取”,这样玩家拉去任务列表的时候,就可以根据这个”奖励未领取”状态来显示还有奖励可以领取,客户端显示领取按钮。

 

 

奖励的领取

  奖励分为直接奖励与玩家主动领取的奖励,这个根据游戏的需求来就可以了,对于任务系统而言,如果是直接奖励,那么直接给玩家加上对应的数据属性就可以了,比如奖励金币,奖励宝石等,奖励的时候可以通知客户端,这样客户端可以播放一个奖励动画出来让玩家知道自己获得了奖励,如果奖励需要玩家主动领取,当玩家拉取任务列表的时候,可以根据任务的状态”奖励未领取”,把没有领取奖励的任务拉去下来,并展示一个”领取”按钮。当玩家点击领取的时候,服务器根据任务ID来获取任务数据,检查任务的状态是否为”奖励未领取”,如果是,再获取任务的ID号,根据任务的ID号获取具体的奖励数值,给对应的数值加上对应的奖励,并修改任务的状态未奖励已领取,并通知客户端展示动画。

 

 

客户端的界面展示

  任务系统的后台逻辑设计好了以后,剩下的就是任务系统的界面展示。客户端登录以后向服务器拉取这个玩家的所有任务,一般状态包含”已解锁待执行”,”正在进行中”与”奖励未领取”的任务。拉取下来,客户端显示的时候还需要显示任务的描述和奖励描述等,所以需要把策划的任务配置表从服务端拉取下来,或者通过资源更新的方式来更新下来,这样我们就能根据任务的tid来从描述表里面获取任务描述与奖励描述,这样客户端就完整的展现出任务来了。当有”领取奖励”,”领取任务”按钮的时候,通过向服务端发送对应的请求来做对应的处理,服务端来更新任务的状态即可。

 

 

以上就从6个维度详细的描述了一个大型网络游戏的任务系统应该如何设计,点击"阅读全文"可以学习这个系列的视频详解教程。

架构前生今世与流量负载架构设计

写在前面的话:

时间:2021.12.25

地点:陕西西安(居家办公)


人物:冷妆,刚入行的java小菜鸡

事件起因:在哪吒社区得到《亿级流量java高并发与网络编程实战》

事件经过:西安因为疫情居家办公,而我的电脑落在办公区域,大型社4现场

续前文:系统设计要点

引入正题之大型系统的演进

有图有真相

对于架构演变的认知,上图来自于dubbo官网:单一应用架构-垂直应用架构-分布式服务架构-流动计算架构

接下来所说的架构演进从不同类型的服务器-->集群服务和动静分离-->分布式系统-->提高数据的性能-->跨语言rpc组合

从不同类型服务器的选择(必需三台服务器)->集群服务和动静分离的优化-->并发增加,搭建分布式系统->完成之后就是提高数据的访问速度-->兼容一致性处理


不同类型的服务器

大型项目,高性能,至少三台服务器

1.应用服务器:处理业务逻辑(强大cpu支持)

2.数据库服务器:依赖磁盘检索的速度和数据缓存的容量(速度较快的硬盘的支持和大容量内存)

3.文件服务器:存储文件(大容量硬盘或内存)


集群服务与动静分离

以上搭建的只是单一应用服务器,能够处理的连接请求时有限的

集群的优势:1.负载均衡(分担服务器的压力)2:失败迁移(不会受到服务器宕机的影响)

这又让我想起西安一码通挂掉,修复了好久,难道。。。不敢想象

集群也相当于可以存放数据,处理请求,所以动静分离的优化是必然的

静:CDN一般将这些静态资源部署在各地边缘的服务器上,html,css这些资源可以缓存在反向代理服务器上,前端还有webpack打包工具,统一打包

动:crud动态请求访问到应用服务器


分布式系统

并发数增加,项目扩大,分布式来拆分

所谓分布式系统:拆分部署,网络整合模块

其实根据上面三个必需的服务器可以理解到分布式系统可以分为

分布式应用:

垂直拆分:将项目根据业务功能拆分成不同的模块,然后再整合各个模块

水平拆分:经典的三层架构(各层部署在不同的机器上)

分布式文件系统:所有文件分散存储到多台计算机上

分布式数据库:所有数据库分散存储在多台计算机上


提高数据的性能

1:在应用服务器上使用缓存

缓存分为本地缓存和远程缓存

本地缓存:访问速度块

远程缓存:无限制扩容,CPU能力

2.对数据进行读写分离,主从同步的热备份

处理海量数据的话(ES搜素引擎)-->(Hdoop,Spark,Storm进行大数据技术处理)

3.关系型数据库与非关系型数据库搭配使用


跨语言组合RPC整合(Thrift,gRPC)

这听着有点生硬,说白了就是编程语言不兼容,需要给系统加一层跨语言的中转结构来强制整合,所以这是不得已的选择


限流与多层负载

1)拦截非法的请求,从而进行一定的限流

2)通过Keepalived实现LVS多机部署,LVS进行客户请求分流

3)通过Nginx进行动静分离

4)集群的服务,通过Nginx进行整合

5)Maven进行依赖管理,GIt进行版本控制 


多级负载架构

相比较而言就是DNS绑定了多个LVS集群

Nginx将动态请求的路径转发到特定的服务器上

重点说明:

级联的层次越多,就会造成请求在系统中路径越长,系统性能有了很大影响

结合实际项目具体情况以及压力测试的结果权衡考虑


 

写在后面的话:

事件结果:现在的时间完全按照自己的规划走下去,所以写下了以上blog

碎碎念:欢迎大家指出blog中的问题,督促笔者进一步改善,你的建议是笔者坚持的动力

 

以上是关于大型网络游戏任务系统的架构与设计的主要内容,如果未能解决你的问题,请参考以下文章

云南航信组织开展“互联网大型高可用高并发微服务架构设计与最佳实践”培训

架构前生今世与流量负载架构设计

8.软件架构设计:大型网站技术架构与业务架构融合之道 --- 高并发问题

4.软件架构设计:大型网站技术架构与业务架构融合之道 --- 操作系统

中培专家 现场讲述 互联网大型高可用高并发微服务架构设计与最佳实践

大型分布式网站架构设计与实践 笔记