Skip to content

KBEngine Nex 引擎介绍

KBEngine Nex 是一款面向网络游戏和实时交互业务的开源分布式服务端引擎。它将连接管理、远程调用、状态同步、空间与 AOI、数据库持久化、负载分配、进程管理等通用能力放在 C++ 运行时中,并使用 Python 3.12 编写可热更新的业务逻辑。

客户端通过引擎生成或提供的 SDK 接入服务端。开发者主要描述 Entity 的属性、远程方法和同步范围,再分别实现服务端 Base、Cell 以及客户端行为,不需要从头设计私有协议、对象路由和分布式进程通信。

Nex 3.x 的技术定位

Nex 3.x 以 KBEngine 1.x 作为唯一协议基线,在保持 1.x Entity、EntityDef 和客户端通信语义的基础上继续演进。项目不再沿用早期 Nex 基于 KBEngine 2.x 的协议分支,从基线上避免消息编号、数据布局和 SDK 解释不一致造成的协议问题。

这意味着 Nex 3.x 不是对原版代码的简单升级,而是由两部分共同组成:

  • 稳定的 1.x 协议模型:保留 Entity、Base/Cell/Client、EntityCall、Space、Witness 和 EntityDef 等核心概念。
  • 现代化工程能力:升级 Python、CMake、vcpkg、编译器、数据库驱动、跨平台网络模型、测试体系和配套工具。

服务端内部实现可以持续优化,但客户端兼容性由客户端可见协议单独约束。只修改 Base/Cell 的服务端 RPC 或内部属性,不会无故改变客户端 EntityDef MD5;只有客户端可见的属性、方法、类型或编号发生变化时,才需要更新客户端 SDK。

引擎解决什么问题

一个可长期运行的游戏服务端不仅要处理业务规则,还必须解决许多跨业务复用的基础问题:

问题KBEngine Nex 提供的能力
客户端连接与登录LoginApp 接入、会话验证、BaseApp 分配、断线与重连流程
跨进程对象调用EntityCall、远程方法描述、参数序列化和组件路由
世界状态同步Witness、View、AOI、属性同步级别和客户端事件
场景与位置逻辑Space、Cell、移动控制器、触发器、导航与空间数据
数据持久化Entity 属性映射、异步写库、MySQL、MongoDB、PostgreSQL
横向扩展多 BaseApp、多 CellApp、负载采样和创建位置分配
运行与诊断Logger、Watcher、性能指标、Bots 压测和管理工具
客户端接入C#、TypeScript、C++ 等 SDK 生成与协议校验

引擎负责这些能力的生命周期和数据流,业务代码则负责角色、战斗、房间、任务、社交和经济系统等领域逻辑。

以 Entity 为中心的编程模型

Entity 是引擎中的核心业务对象。玩家、怪物、NPC、房间、场景、道具或公会都可以根据生命周期、交互方式和持久化需求建模为 Entity。

一个 Entity 可以由三个逻辑部分组成:

  • Base 部分运行在 BaseApp,适合账户、背包、社交、匹配、排行榜、持久化和客户端会话等与空间位置无关的逻辑。
  • Cell 部分运行在 CellApp,适合场景、移动、战斗、AI、AOI、触发器和导航等实时空间逻辑。
  • Client 部分运行在客户端,接收服务端同步的数据和调用,并驱动显示、输入及客户端表现。

三部分不要求同时存在。例如,纯后台数据实体可以只有 Base;场景中的公共对象可以拥有 Cell 和 Client;连接玩家的 Proxy 则承担客户端与服务端之间的会话入口。

Entity 的网络契约由 entities.xmlentity_defs/*.defentity_defs/types.xml 描述,包括:

  • Entity 由哪些部分组成;
  • 属性的数据类型、同步范围和持久化策略;
  • Base、Cell、Client 方法及其参数;
  • Interface、EntityComponent 和自定义数据类型;
  • 显式或自动分配的协议 UType。

引擎读取定义后建立统一协议表,服务端运行时和客户端 SDK 使用同一份模型进行序列化与反序列化。详见 EntityEntityCallEntityComponent

分布式运行架构

KBEngine Nex 由多个职责明确的进程协同运行。业务无需把所有玩家和场景塞进单个进程,也不需要手工维护每次跨进程调用的连接。

组件主要职责
Machine发现和管理本机组件,提供进程状态及机器资源信息
LoginApp处理客户端登录入口、鉴权和 BaseApp 地址分配
BaseAppMgr管理 BaseApp 集群并参与客户端及实体的负载分配
BaseApp承载客户端会话、Base Entity、持久化和非空间业务
CellAppMgr管理 CellApp 集群并参与 Space 创建位置分配
CellApp承载 Space、Cell Entity、AOI、移动、AI 和实时交互
DBMgr统一处理 Entity 数据模型、数据库任务和异步结果路由
Interfaces对接第三方账户、计费、运营或其他外部系统
Logger汇聚组件日志,供开发和运行诊断使用

典型连接过程如下:

  1. 客户端 SDK 连接 LoginApp 并完成登录验证。
  2. LoginApp 请求 BaseAppMgr 选择合适的 BaseApp。
  3. 客户端连接目标 BaseApp,服务端创建与该客户端关联的 Proxy Entity。
  4. 业务需要进入场景时,Base Entity 请求在 CellApp 中创建 Cell 部分或新的 Space。
  5. CellApp 维护空间状态、AOI 和实时逻辑,通过 Witness 将可见数据同步给客户端。
  6. EntityCall 负责 Base、Cell、Client 以及不同服务端进程之间的远程调用。
  7. 需要持久化时,BaseApp 或 CellApp 将 Entity 数据交给 DBMgr 异步写入数据库。

更完整的组件关系和流程见 引擎概览

Space、AOI 与实时世界

Space 是 CellApp 中的逻辑空间,可以表示一张世界地图、一个副本、一个战斗房间或一局牌桌。Space 将互不相关的实时对象隔离开,使移动、触发器和可见性计算只在必要范围内发生。

客户端控制的 Cell Entity 可以拥有 Witness。Witness 根据 View 范围维护该客户端当前可见的 Entity,并只同步进入视野、离开视野或状态发生变化的数据。高密度场景中,AOI 的 Entity 数量、属性变化频率和客户端可见范围会直接影响 Cell Tick、CPU 与网络包量,因此业务仍需合理设计同步粒度。

对于大型或复杂场景,引擎还提供移动控制器、导航网格、Detour 寻路、触发器、DetailLevel 和易变属性同步策略。相关内容见 SpaceView 与 Witness导航网格

Python 3.12 业务运行时

Nex 将原版 Python 3.7 升级到 Python 3.12。Python 用于业务逻辑而不是替代 C++ 网络核心:连接收发、消息解析、调度、Entity 管理和空间系统由底层负责,业务回调在对应组件的主线程中执行。

当前运行时具有以下约定:

  • Windows、Linux 和 macOS 均使用动态 Python 运行时;
  • 引擎 Debug/Release 配置统一链接 Release Python;
  • Windows 支持加载 .pyd,Linux/macOS 支持对应的原生动态扩展;
  • 支持 VENV 和第三方 Python 包;
  • asyncio 由底层 Dispatcher 定时推进,不额外创建独立 Python 调度线程;
  • Python 运行库与服务端一起部署,服务器目录整体移动后仍可按相对路径运行。

Python 提高了业务迭代速度,但不会消除 Tick 预算。耗时循环、同步 IO、大对象序列化和一次性处理过多 Entity 仍会阻塞所在 BaseApp 或 CellApp。异步接口适合等待 IO,不适合掩盖 CPU 密集型逻辑。详见 Python 介绍VENVasyncio

客户端协议与 SDK

客户端不直接解释服务端 Python 对象,而是依据生成的 EntityDef 和消息协议进行通信。SDK 生成器会输出客户端可见的 Entity、属性、Client 方法、暴露给客户端的 Base/Cell 方法及其数据类型,并嵌入协议摘要。

连接时,客户端与服务器会校验消息协议和客户端 EntityDef MD5。这样可以尽早拒绝使用错误 SDK 的客户端,避免数据已经按错误布局读取后才表现为随机逻辑错误。

下列修改通常需要重新生成 SDK:

  • 新增、删除或修改客户端可见属性;
  • 修改 Client 方法或暴露给客户端的 Base/Cell 方法;
  • 修改上述成员使用的数据类型或协议 UType;
  • 新增会进入客户端协议的 Entity 或组件。

纯服务端 Base/Cell 方法和内部实现的修改不应影响客户端摘要。SDK 生成与升级流程见 SDK 自动生成

数据持久化

EntityDef 可以声明需要持久化的属性。引擎将 Entity 数据转换为数据库任务,并由 DBMgr 负责执行和返回结果,业务脚本不需要为每个 Entity 重复实现基本的对象映射和异步回调路由。

Nex 支持 MySQL、MongoDB 和 PostgreSQL。数据库选择不能替代数据建模:高频实时状态不应每 Tick 写库,大型集合需要考虑序列化成本,跨 Entity 的强事务需求也应在业务层明确设计。

引擎同时保留原生数据库命令接口,供复杂查询、运营分析或既有数据系统使用。此类接口应进行参数化、权限和耗时控制,避免把数据库慢查询传导为 BaseApp、CellApp 或 DBMgr 的长尾。

性能与扩展方式

KBEngine Nex 采用多进程架构,可以增加 BaseApp 和 CellApp 分担连接、实体和 Space 压力。管理进程根据组件负载参与分配,但“能够横向扩展”不等于业务可以无限增长。

实际容量主要受以下因素影响:

  • 单个 Entity 每 Tick 执行的 Python 逻辑;
  • 单个 Space 的活跃 Entity 数量和 AOI 密度;
  • 属性同步频率、RPC 数量和单包大小;
  • 导航、AI、触发器和移动计算量;
  • 数据库 IO、外部接口延迟和日志量;
  • 跨 BaseApp/CellApp 调用和 Entity 迁移频率;
  • 单进程内存、网络带宽及操作系统调度能力。

正式项目应使用接近真实业务的数据量、移动模式和消息频率进行 Bots 压测,并观察 P50、P95、P99、P99.9 延迟、Cell Tick、消息队列、Witness/AOI、CPU、内存和网络指标,而不是只以“在线连接数”判断承载能力。参见 使用 Bots 进行压力测试

适用场景

KBEngine Nex 更适合具有长期在线状态、服务端权威逻辑和多实体交互的项目,例如:

  • MMORPG、ARPG、MOBA 和多人开放世界;
  • 房间制战斗、棋牌、休闲竞技和多人副本;
  • 带账户、角色、社交、匹配和持久化的在线游戏;
  • 需要 Space、AOI、移动同步或服务端 AI 的实时交互应用;
  • 希望以 Python 快速开发业务,同时保留 C++ 底层性能和分布式能力的团队。

对于只有少量无状态 HTTP 接口、完全依赖数据库事务的传统后台,或所有逻辑都由第三方托管服务完成的项目,使用常规 Web 框架可能更加直接。选择引擎前,应判断项目是否真正需要 Entity 生命周期、长连接、实时状态同步和分布式场景计算。

开发与部署平台

Nex 使用 CMake Preset、Ninja 和 vcpkg 统一 Windows、Linux 与 macOS 的构建流程,并支持 x64、ARM64 和 Apple Silicon。Windows 适合开发调试,Linux 通常用于正式服务器部署,macOS 可用于本地开发和原生工具链验证。

第三方依赖和 Python 版本由 vcpkg manifest 与固定 baseline 管理,使 CI 与开发机能够恢复一致的依赖集合。发布目录包含服务端程序、Python 运行库和必要动态库,可以整体复制或移动,不依赖构建机上的绝对路径。

具体环境要求和编译入口见 安装和启动

从哪里开始

建议按以下顺序继续阅读:

  1. 引擎特性:快速了解引擎能力范围。
  2. 引擎概览:认识各服务端组件和完整连接流程。
  3. 创建项目:建立第一个可运行的 Assets 工程。
  4. Entity 的配置:定义属性和远程方法。
  5. Entity 的 Python 实现:编写 Base/Cell 业务逻辑。
  6. SDK 自动生成:让客户端使用与服务器一致的协议定义。