大型多人在线游戏服务器模型
前言
mmoprg,即大型多人在线角色扮演游戏,其典型的游戏有:UO :《网络创世纪》、传奇、奇迹MU、WOW、剑侠、天堂2,
这里游戏还是有一定的市场。本文主要是有关MMORPG游戏服务器框架大致结构。
网络通信
客户端和服务端主要建立的是TCP/IP连接,在玩家登陆后,会与服务器创建一个Session回话。
而且现在采用的都是NIO(非阻塞模型),如果是用Java开发,那么netty是一个优秀的NIO模型
框架。消息编码协议,可以采用Protobuf,这个加快数据额传输和转换。
netty中 handler代码块
//服务类
ServerBootstrap b = new ServerBootstrap();
try{
b.group(boss,worker)
.channel(NioServerSocketChannel.class) //指定所使用的NIO传输Channel
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("IdleStateHandler",new IdleStateHandler(0,0,180));
pipeline.addLast("WriteTimeoutHandler",new WriteTimeoutHandler(60));
pipeline.addLast("reqDecoder",new RequestDecoder());
pipeline.addLast("serverHandler",new GameServerHandler());
pipeline.addLast("respEncoder",new ResponseEncoder());
}
}).option(ChannelOption.SO_BACKLOG,128)
.childOption(ChannelOption.SO_KEEPALIVE,true);
ChannelFuture f = b.bind(port).sync(); //异步的绑定服务器
线程模型
1:所有的Scene都是继承一个抽象类(场景线程基础类),该类是一个继承了Runnable的线程
2:该基础类重写run方法,在run方法中循环的执行其本身的一个excute()抽象方法,其实对于每个线程来说,就是定时的执行其方法,等于该场景的入口。在excuet()方法中,执行一个tick()方法,在这个方法中,传入的是最后执行时间。 也就是每帧会执行一次,33秒为一贞。在tick()方法中,就可以业务处理。处理场景消息,玩家消息,怪物,地图,NPC等。
3:如果要在该场景线程中,加入其他消息处理,如何操作呢,定义一个同步队列,队列中为一个场景方法执行接口,每次put进去就行,然后同样在tick中调用该队列,拿出一个sceneMessage出来执行。
4:玩家消息如何处理呢,在处理玩家消息的时候,其实是调用玩家心跳,玩家心跳中有各种逻辑处理,处理各种请求包和消息包,消息包和场景消息包一样,设置一个同步队列
存储
- 1:缓存
用的是Google的Cache作为缓存机制,使用泛型Cache cache = CacheBuilder.newBuilder().softValues().build().软引用,在gc的时候会被回收。
其中K为索引,V为继承了基础的DBEntity的实例,现在比较主流的缓存为Caffeine 。
- 2:DB
当进行DB操作时,进行异步存储,异步执行会调用submit方法,异步执行器中有一个DB实体的阻塞队列和一个线程池。
当submit后,会把entity放入到阻塞队列中。然后用线程去执行run方法,在run方法中,启动线程池,调用execute()方法,把从队列中获得的DBEntity进行db操作。
战斗模块
技能(主动)
在战斗对象中(GObject),设置一个技能收集器,castSkillRequests集合,当客户端请求使用技能或者其他怪物AI(在心跳中),
都会执行reqCastSkill()方法,该方法中,就会把技能转化为SkillCastRequest对象,然后add到castSkillRequests集合中。
然后在GObject的心跳中,会执行procesSkill()方法,在这个方法中,会循环的将集合中收集的技能执行,调用caskSkill()方法释放技能。
然后获取技能模型,并获取技能的处理器,再调用process.execue()方法,做完各种逻辑判断后,
调用真正技能处理器对象的process()方法。可能是添加步buff或者伤害。
伤害的话会调用fight()方法,或者直接根据技能参数计算出hurt值,fight方法中进行各种伤害计算,最终计算一个hurt值。
最后就是扣血操作,并同步到客户端。
AI
AI是要做在GObject心跳中去执行,并设置好AI状态,扫描对象。
具体战斗实现,参考mmorpg战斗
热更
对于热更是必不可少的,线上难免会可能会出现问题,通常要去修复,最好的方式就是修复后再热更上去。若使用C++开发,一般会嵌入脚本(lua)语言,做为支持动态编译热更。如果使用Java开发,
Groovy脚本应该是比较好的选择,Spring对Groovy有着良好的支持,能把Groovy实现累,做为Bean来使用和管理。
参考Spring+Groovy热更
GitHub:代码[图片上传失败...(image-d72df0-1551867714221)]
上一篇: 传奇开服教程完整版GOM引擎超详细单机设置图文教程(小白一看就会)
下一篇: 传奇服务端
推荐阅读
-
在线游戏 "服务器向客户端分发信息[21]。
-
go语言Socket编程-Socket编程 什么是Socket Socket,英文含义是插座、插孔,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket,该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 套接字的内核实现较为复杂,不宜在学习初期深入学习,了解到如下结构足矣。 套接字通讯原理示意 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 网络应用程序设计模式 C/S模式 传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。 B/S模式 浏览器(Browser)/服务器(Server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。 优缺点 对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯所采用的通信协议,即为ftp协议的修改剪裁版。 因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。 C/S模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多用户不愿使用C/S模式应用程序的重要原因。 B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的偷菜游戏,在各个平台上都可以完美运行。 B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。 因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。 简单的C/S模型通信 Server端:Listen函数 func Listen(network, address string) (Listener, error) network:选用的协议:TCP、UDP, 如:“tcp”或 “udp” address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:8000” Listener 接口: type Listener interface { Accept (Conn, error) Close error Addr Addr } Conn 接口: type Conn interface { Read(b byte) (n int, err error) Write(b byte) (n int, err error) Close error LocalAddr Addr RemoteAddr Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error } 参看 [<u>https://studygolang.com/pkgdoc</u>](https://studygolang.com/pkgdoc) 中文帮助文档中的demo: 示例代码:TCP服务器.go package main import ( "net" "fmt" ) func main { // 创建监听 listener, err:= net.Listen("tcp", ":8000") if err != nil { fmt.Println("listen err:", err) return } defer listener.Close // 主协程结束时,关闭listener fmt.Println("服务器等待客户端建立连接...") // 等待客户端连接请求 conn, err := listener.Accept if err != nil { fmt.Println("accept err:", err) return } defer conn.Close // 使用结束,断开与客户端链接 fmt.Println("客户端与服务器连接建立成功...") // 接收客户端数据 buf := make(byte, 1024) // 创建1024大小的缓冲区,用于read n, err := conn.Read(buf) if err != nil { fmt.Println("read err:", err) return } fmt.Println("服务器读到:", string(buf[:n])) // 读多少,打印多少。 }
-
大型多人在线游戏服务器模型
-
游戏服务器的高并发性和高可用性,如何支持数百万玩家同时在线而不出现问题
-
如何搭建《迷锁王国》多人在线服务器,搭建教程分享
-
游戏人工智能:大型模型在游戏内容生成和交互体验优化中的应用
-
风暴服务器 X7740 助力大型模型培训
-
小红书大产品部架构 小红书产品概览--经过性能、稳定性、成本等多个维度的详细评估,小红书最终决定选择基于腾讯云星海自研硬件的SA2云服务器作为主力机型使用。结合其秒级的快速扩缩、超强兼容和平滑迁移能力,小红书在抵御上亿次用户访问、保证系统稳定运行的同时,也实现了成本的大幅降低。 星海SA2云服务器是基于腾讯云星海的首款自研服务器。腾讯云星海作为自研硬件品牌,通过创新的高兼容性架构、简洁可靠的自主设计,结合腾讯自身业务以及百万客户上云需求的特点,致力于为云计算时代提供安全、稳定、性能领先的基础架构产品和服务。如今,星海SA2云服务器也正在为越来越多的企业提供低成本、高效率、更安全的弹性计算服务。 以下是与小红书SRE总监陈敖翔的对话实录。 问:请您介绍一下小红书及其主要商业模式? 小红书是一个面向年轻人的生活方式平台,在这里,他们发现了向上、多元的真实世界。小红书日活超过 3500 万,月活跃用户超过 1 亿,日均笔记曝光量达 80 亿。小红书由社交平台和在线购物两大部分组成。与其他线上平台相比,小红书的内容基于真实的口碑分享,播种不止于线上,还为线下实体店赋能。 问:围绕业务发展,小红书的系统架构经历了怎样的变革和演进? 系统架构变化不大,影响最深的是资源开销。过去三年,资源开销大幅增加,同比增长约 10 倍。在此背景下,我们努力进行优化,包括很早就开始使用 K8S 进行资源调度。到 18 年年中,绝大多数服务已经完全实现了容器化。 问:目前小红书系统架构中的计算基础设施建设和布局是怎样的? 我们目前的建设方式可以简单描述为星型结构。腾讯云在上海的一个区是我们的计算中心,承载着我们的核心数据和在线业务。在外围,我们还有两个数据中心进行计算分流,同时承担灾备和线上业务双活的角色。 与其他新兴电子商务互联网公司类似,小红书的大部分计算能力主要用于线下数据分析、模型训练和在线推荐等平台。随着业务的发展,对算力的需求也在加速增长。
-
首位脑机患者直播游戏玩创意;赛车手自研大型模型有信心半年内达到GPT4级水平 丨《RTE开发者日报》第169期
-
方舟服务器在线人数查询软件,Steam游戏应该如何保持在线人数?方舟生存进化》告诉你答案!...