好的,BigWorld 服务端的 Cell 架构是其最核心和经典的设计,它成功解决了大型多人在线游戏(MMO)中“大世界”和“海量玩家同屏”的技术难题。其设计思想深刻影响了后来许多著名的游戏引擎。
这个架构的核心是 “空间分区” 和 “负载分离”。
一、核心设计思想
BigWorld 将游戏世界划分为一个个连续的区域,每个区域由一个 Cell 来管理。整个服务端由三种不同类型的进程(进程)组成,分别处理不同类型的负载:
- 逻辑负载:玩家的行为、战斗、技能、任务等。
- 空间负载:玩家的移动、视野(AOI)、碰撞等。
- 数据与公共负载:登录、拍卖行、邮件、聊天等无空间属性的功能。
这三种负载被分离到不同的服务进程上,使得每种服务都可以独立地横向扩展(Scale Out)。
二、三种核心进程(Server Components)
BigWorld 服务端主要由三种进程构成:
1. CellApp (Cell Application)
- 职责:负责游戏世界的空间逻辑和实时运算。这是“Cell”概念的物理体现。
- 工作方式:
- 整个游戏世界被划分为一个巨大的网格,每个格子就是一个 Cell。
- 每个
CellApp进程可以负责一个或多个 Cell。一个 Cell 在同一时间只能由一个CellApp负责,以保证数据一致性。 - 它处理所有发生在其负责的 Cell 内的事情:玩家的移动、战斗、技能的实时计算、NPC 的 AI、视野管理(AOI)等。
- 当玩家从一个 Cell 移动到另一个相邻的 Cell 时,其控制权会在
CellApp进程之间(甚至同一进程的不同线程之间)无缝转移,这个过程对玩家是透明的。
2. BaseApp (Base Application)
- 职责:负责玩家的非空间逻辑和离线数据。
- 工作方式:
- 每个玩家实体(Entity)在
BaseApp上都有一个影子对象(Base Entity),代表其“存在”和“所有权”。 - 它处理不依赖于位置的功能,例如:登录验证、背包管理、技能树、任务进度、社交关系(好友、工会)、邮件、离线计时等。
- 即使玩家下线,其 Base Entity 依然存在,直到数据被持久化。这为“离线邮件”、“上线提醒”等功能提供了便利。
BaseApp是玩家数据的写入者,负责将数据定期写入数据库。
- 每个玩家实体(Entity)在
3. LoginApp 和 DB
- LoginApp:负责客户端的接入、认证、选择角色,并将玩家分配到一个合适的
BaseApp上。 - Database:一个简化的数据库抽象层,负责将
BaseApp提交的玩家数据持久化到后端的数据库(如 MySQL)中。BigWorld 自带了一个简单的数据库系统,但也可以对接其他数据库。
三、实体(Entity)的双重性
这是理解 BigWorld 架构的关键。一个玩家实体(Player Entity)被拆分到两个进程中:
-
Cell Entity:存在于
CellApp上。- 拥有空间属性:位置、方向、速度等。
- 处理实时交互:
move,attack,useSkill等 Cell 相关的方法在这里执行。
-
Base Entity:存在于
BaseApp上。- 拥有非空间属性:账号信息、等级、经验、物品等。
- 处理非实时业务:
sendMail,addFriend,saveToDB等 Base 相关的方法在这里执行。
当一个客户端需要执行一个操作时,请求的路径通常是:
Client -> BaseApp (验证权限、参数) -> CellApp (执行实时逻辑) -> BaseApp (更新结果、可能存盘)。
四、架构工作原理与流程(以玩家移动为例)
- 客户端:玩家按下W键向前移动,客户端发送一个移动请求。
- BaseApp:请求首先到达玩家的
Base Entity。BaseApp进行基础验证(例如角色是否被冻结)。 - 路由转发:
BaseApp知道这个玩家的Cell Entity在哪个CellApp上,它将请求转发给对应的CellApp。 - CellApp:目标
CellApp上的Cell Entity接收到移动请求。- 执行移动逻辑:计算新的位置。
- 检查碰撞。
- 最重要的:进行视野管理(AOI)。
- 计算哪些其他玩家进入了我的视野,我需要通知他们我的存在(Witness 机制)。
- 计算我进入了谁的视野,我需要接收谁的数据。
- 计算哪些玩家离开了我的视野。
- 将位置更新广播给所有能看见我的客户端。
- 跨Cell移动:如果移动导致玩家跨越了 Cell 的边界:
- 当前
CellApp会通知CellMgr(一个管理组件)。 CellMgr会协调,将玩家的Cell Entity及其状态数据整体转移到负责目标 Cell 的CellApp上。- 转移过程中,玩家的连接不会中断,体验是无缝的。
- 当前
五、其他重要组件
- CellMgr:管理 Cell 的分配和负载均衡。它监控所有
CellApp的负载,动态地将 Cell 从一个CellApp迁移到另一个CellApp,以保证服务器压力均匀。 - Space:一个 Space 是一个独立的游戏空间(例如一个副本、一个地下城),它由一组 Cell 构成。多个 Space 可以同时存在,互不干扰。
- Witness:一个代理对象,挂在
Cell Entity上,负责管理这个实体对世界的观察(看到什么)以及如何向它的客户端同步数据(同步什么,以什么频率同步)。这是优化带宽的关键机制。
总结:BigWorld Cell 架构的优点
- 横向扩展(Scalability):通过动态增减
CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。 - 负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。
- 高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。
- 容错性:某个
CellApp崩溃只会影响它负责的几个 Cell 中的玩家,而不会导致全服宕机。BaseApp 也可以做容灾备份。
潜在的挑战与复杂性
- 高复杂性:开发需要时刻理解实体的双重性,通信模式(远程调用)比单进程开发更复杂。
- 调试困难:问题可能出现在 CellApp、BaseApp 或它们的通信过程中,定位问题需要更全面的工具链。
- 网络延迟:
BaseApp和CellApp之间的频繁通信会引入内部网络延迟,对实时性要求极高的操作需要精心设计。
总而言之,BigWorld 的 Cell 架构是一个经典的、为大型MMO量身定制的分布式服务器架构,其设计思想至今仍在游戏服务器领域享有崇高地位。
–
Java的参考实现方案
1. 进程/服务划分
在 Java 中,我们可以用多个独立的 JVM 进程 来模拟 BigWorld 的各种 App,它们之间通过 RPC 进行通信。一个典型的集群可能包含以下服务:
| 服务名 | 对应 BigWorld 组件 | 职责 | 推荐技术选型 |
|---|---|---|---|
| Login-Gateway | LoginApp + 一部分网关 | 用户认证、协议解析、流量路由 | Netty (TCP/UDP WebSocket) |
| Base-App | BaseApp | 玩家实体管理、非空间逻辑(背包、任务、邮件)、数据持久化 | Spring Boot + MyBatis/JPA + RPC Framework |
| Cell-App | CellApp | 空间逻辑(移动、战斗、AOI)、管理一个或多个 Cell | Netty (高性能) 或 Akka (Actor模型) |
| Cell-Manager | CellMgr | 全局 Cell 管理、负载均衡、协调 Cell 迁移 | Spring Boot + RPC Framework |
| World-Manager | (无直接对应) | 全局副本、活动管理 | Spring Boot |
| Database | Database | 数据持久化 | MySQL, MongoDB, Redis |
2. 核心概念实现
a) Entity (实体)
实体是游戏世界的对象,如玩家、怪物、NPC。
// 所有实体的基类,包含唯一ID和基础属性
public abstract class GameEntity {
protected long id; // 全局唯一ID,通常由雪花算法生成
protected String entityType;
// ... 其他基础属性
}
// Base实体 (存在于Base-App)
public class BaseEntity extends GameEntity {
// 非空间属性:账号、金币、背包、任务列表、好友
private String account;
private long gold;
private List<Item> inventory;
// ... BaseApp上处理的业务逻辑方法
public void addGold(long amount) {
... }
}
// Cell实体 (存在于Cell-App)
public class CellEntity extends GameEntity {
// 空间属性:位置、方向、速度、所在Space和Cell的ID
private Vector3 position;
private Vector3 direction;
private int spaceId;
private int cellId;
// ... 当前视野内的其他实体 (AOI核心)
private Map<Long, CellEntity<

最低0.47元/天 解锁文章

725

被折叠的 条评论
为什么被折叠?



