一个不分服的游戏服务器设计问题?

本文深入探讨了设计一个可承载1000万玩家上线,同时在线10万人的大规模在线游戏服务器的关键技术挑战与实现策略。通过采用分布式服务器架构,确保了系统的扩展性和性能。重点介绍了如何实现玩家感觉不分服的体验,通过唯一入口设计、高效数据通信机制以及优化的服务器组通信,确保玩家间的交互流畅。此外,文章还详细阐述了资源管理、消息广播、服务器负载平衡以及单点故障处理等核心问题的解决方案。
一个不分服的游戏服务器设计问题?
最近自己想设计一个游戏,类似coc或者海盗骑兵,玩家不用选择服务器。
游戏主要需求:
整个游戏世界有很多村落组成,村落里是若干玩家(比如上线10人)组成,若干村落组成国家。
战斗包括整个村落和村落打,及玩家和玩家打,还有玩家和系统设定的npc打,玩家之间可以相互组队去打副本。
所有玩家之间都可以加好友,聊天,组队聊天,世界聊天等。
游戏中没有场景的概念,不是mmorpg。
玩家之间的战斗可以在双方同时在线下进行,不像海盗骑兵只能打离线玩家。

由于玩家可能比较多,单服的架构不合适,要做到较强的扩展(不需要理论上的无限扩展)。设计上玩家上线是1000万,同时在线是10w。
语言可以先不考虑(本人熟悉java,nodejs以及lua也可以考虑)


其实没有你想的那么难,现在日本的大多数手游都不分服了(对玩家而言),国内迟早也是这个趋势。因为手游的用户行为不适合做强在线交互,所以不分服在玩法设计上能提供很大的空间。

那么具体怎么做?具体的你得自己去研究。我说一个大致的思路。

实现上其实是分布式的服务器,不分布计算的话就谈不上可扩展性了。当然结构搭好了,要不要扩展完全可以根据产品的实际运营情况来定
那么既然游戏服务器是分布式的话,怎么让玩家感觉不分服呢?很简单,入口是唯一的就可以了。这个唯一的意思可以是唯一的登录服务器,也可以是唯一的游戏服务器连接机制。
那么既然玩家散落在各个游戏服务器里面,怎么能够让他们象在一个世界里那样产生交互呢?这个是实现里面比较难的地方。在规模有限的情况下,只要保持有一个高效的数据持久层通信机制(在小规模下 redis 就够了)就可以解决90% 的问题。当规模上去了以后,可以考虑 阿里云 或者 腾讯云提供的服务。


需求层面先要确定的一个事情,
是否需要显示地图版面资源占用情况,这个涉及到全局数据,如果存在,对于版面的信息更新频度问题,如果说存在,那么显然一个全局服务器可能不太好适应,如果没有,一切都好解决。
1.设计是否靠谱,需要测试你的各类服务器对于承载是否能够达到预期。全局服务器不可忽视的一个问题就是广播消息,拿你的聊天服来说,如果说,全服共用一个聊天服,考虑下在用户同时在线峰值时消息转发会带来多大的压力,虽然消息转发的逻辑处理简单,承载也高,但是更多是些无意义的需求,所以还是基于有效需求做一些划分,比如以国家为基础单位加载至聊天服,保证国家内成员处于同一聊天服。
2.当你的所有服务器组都处于内网之中时,服务器组的通信的效率基本上不需要担心。
3. 建议还是添加网关服,用于管理客户端连接,而你的游戏服,可以看做是业务逻辑计算结点,世界服就是一个中心服务器,管理一些状态,不做过多的逻辑计算。至于玩家对网关的选择,先让玩家请求网关负载均衡服(可以是一个web页面),然后告之玩家可连接的网关,至于分配方式粗略的可以直接基于网关的承载(如果你的业务逻辑计算结点所有数据都是从数据中心拉取)。通信消耗,游戏的类型及需求决定了游戏不是需要高响应的,同时手游通信环境的影响,这点内网通信消耗我觉得还是能够容忍的。
4.同3所说,世界服不做过多的逻辑,减少单点故障可能性,国家之类的,根据具体情况分析了,尽量是放在逻辑计算结点上来进行。始终会存在不可抗因素,所以单点故障的可能性始终存在,如果真的需要,那么粗略的考虑就是做主从,主服务器挂了,立马转接到从服务器。
5.基本上是这样,已修改数据定时回写。玩家离线不清除,主要解决在大量玩家重复上下线操作的问题。
6.资源争夺这里麻烦最多,最好的办法是任何会改变共享资源的操作都为同步操作,这样保证数据不会出现问题,我记得COC里面好像是不能攻击在线玩家,这样就从根源上解决了问题,如果需求执意要对在线玩家也可做操作,那么只好把操作理清楚了根据情况做限制。

=================================================================


可以统一出口网关,用LVS做TCP端口均衡负载,这样可以扩展足够多的接口服务器去满足在线人数需求。(技术人员少的话可以直接用青云、阿里云的均衡负载服务)

一些热数据或者经常更改的数据,例如你说的“我战胜了玩家A,我会抢他资源”:全部写入redis集群,定期将redis数据同步到数据库中。为了避免单点可以在架构和后台服务编写上“标记服务某个用户的reds服务器”并记录到数据库中,并且做到可用脚本热切换。
优化游戏房间务器性能的方法如下: - **分层处理与分区裁剪**:分层处理关键逻辑与低优先级任务,同时进行空间分区与视野裁剪,以此减少计算量。例如在FPS游戏中,提升DS(专用战斗)的TickRate能优化竞技体验,但会导致务器性能压力剧增,通过这种方式可缓解压力,实现高Tick与性能平衡,核心在于“资源分层、并发优化、动态调度”,而非单纯依赖硬件升级[^1]。 - **多线程与网络包处理**:采用多线程并行与网络包聚合的方式,提升务器处理效率,应对高TickRate带来的性能挑战,如在FPS游戏服务器中可使用此方法[^1]。 - **动态调整TickRate**:可动态调整TickRate或采用混合Tick模式,根据实际情况平衡务器性能和游戏体验,避免因高TickRate导致务器性能消耗过大[^1]。 - **状态同步与消息处理优化**:对状态同步和消息处理进行细粒度优化,提升系统表现,如在Colyseus的多房间务架构设计中采用此策略[^2]。 - **分布式架构扩展**:使用分布式架构实现水平扩展,增强务器的扩展性,以应对更多玩家和房间的需求,适用于复杂应用场景下的游戏房间务器[^2]。 - **房间生命周期管理**:加强房间生命周期管理和资源清理,确保务器资源的有效利用,避免资源浪费,在Colyseus架构中有相关应用[^2]。 - **跨房间通信优化**:利用Redis等工具优化跨房间和跨节点的通信,提高通信效率,提升务器整体性能,如在Colyseus系统中可采用此方法[^2]。 - **务器基础设置优化**:以IIS网站务器为例,启用HTTP Keep - Alive(保持连接)可提升约15 - 20%速度;关闭网站访问日志可提升约5 - 8%速度;避免使用“高(独立)”应用模式,防止损失约20%速度;增加ASP脚本缓存数量可让动态网页响应更快;避免使用CGI程序,选择更高效的替代方案;增加CPU数量(IIS 5.0有效)可获得接近线性的性能提升;关闭ASP调试功能可释放宝贵的CPU资源;启用静态文件HTTP压缩可减少约20%的网页传输量,这些方法也可借鉴到游戏房间务器性能优化中[^3]。 ```python # 以下是一个简单的模拟多线程处理任务的示例代码 import threading def task(): print("处理任务...") # 创建多个线程 threads = [] for _ in range(5): t = threading.Thread(target=task) threads.append(t) t.start() # 等待所有线程完成 for t in threads: t.join() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值