亚马逊AWS官方博客
基于 SimSpace Weaver 来构建超大规模游戏或应用的研究
前言
在 2022 年的 AWS Re:Invent 大会上,发布了一项令人振奋的服务 AWS SimSpace Weaver。这项技术借鉴了 AWS 多年来在云端的深入研究经验,解决了很多开发者面对大规模场景时面临的最大困难:如何搭建一个后端系统,实现对世界(计算力)的拆分和状态同步?通常情况下,如果从零开始构建这样的系统,需要多位资深工程师数月甚至数年的努力才能完成。
SimSpace Weaver 是一项主要解决大规模高密度情况下虚拟世界模拟的服务。它通过将庞大的世界划分为相等大小的区域来实现该目标。这项服务的发布,展示了 AWS 在更多场景中的潜力:
- 可以用于一些大规模的模拟仿真应用程序,如元宇宙,数字城市,运动会,甚至是军事领域。
- 在游戏领域,将来的一些超大型的 MMORPG(如魔兽世界)可以在云端进行托管。
概述
本文会涵盖以下内容:
- 介绍 AWS SimSpace Weaver 服务 (基础知识,对 SimSpace Weaver 有个基本了解)
- 熟悉 SimSpace 的工作流 (中级知识,介绍 SimSpace Weaver 在不同引擎的工作流)
注意:本文不会介绍代码层面如何做集成,作者会后续另开一篇文章从 0 开始讲述游戏代码接入的步骤,欢迎关注。
服务介绍
本节主要会介绍一些重要的概念以及架构图,让大家快速的了解 SimSpace Weaver 服务。
概念介绍
- Schema:游戏的核心配置文件, JSON 格式。本地环境一般在项目根目录下的 yaml 文件。线上环境一般在 build 或者 tools 目录下 yaml 文件。
- Partition:世界算力的分区,通常使用基于地理位置的范围来切分。 分区最大范围规定为左上右下。
- Resource Unit:代表每个 Partition 后面所需的 CPU 和 memory 的资源,类似容器。
- Worker:EC2 实例,由 SimSpace 托管,包含多个 Partition。
- Clock:时钟频率,每秒钟模拟实体的次数,通常是 Hz 表示。数值越大越平滑。
- Apps:应用程序,分为以下三种:
- Spatial App:必须,由 SimSpace 托管;每个 Partition 都要有一个 spatial app 支撑;负责实体的生命周期管理。
- Custom App:非必需,自己管理;可以自己来创建实体,但所有权需要转移给 Spatial App;通过订阅方式获得事件和实体信息;会暴露端点给客户端连接。
- Service App:非必需,由 SimSpace 托管;通过订阅方式获得事件和实体信息;会暴露端点给客户端连接。
- State Fabric:一个全局共享的内存数据库,类似 redis,里面存放各个实体的实时数据。一般会用空间位置来做实体索引。
- Entities:实体,任意可以在世界中移动的物体。unreal 中 actor, unity 中的 gameObject。
- Domain:一组逻辑上相同的 apps,包括代码、可执行文件、配置,等等。
- Authority Transfer:指实体在不同服务器之间的权限交割。
- Replication:同步没有权限的实体的数据。
- Subscription:游戏内获取各种系统事件以实体状态更新的方式。
- 订阅通常会比实际的范围更大点,来获得更好的实体跨服体验效果。
- 因为实体会提前进入下一个 Partition 的兴趣范围,从而提前在那个 Partition 生成一个 remote replication。
架构图
- 每个 Worker 可以有多个 Partition, Partition 内托管着 Spatial App 的应用程序,他们会消耗 Resource Unit 对应的资源。
- 每一个 Worker 代表了一个节点,整个系统最多可以管理 10 台 EC2。
- State Fabric 记录着所有需要同步实体的重要信息:位置。
- Service/Custom App 只关心自己对应的 Worker 内以及兴趣范围内的实体。它们的区别主要是 Service App 只有只读,没有交互;而 Custom App 可以负责生成实体接受客户端的交互。
工具介绍
在使用 AWS SimSpace Weaver 之前,确保您有以下依赖:
SDK 介绍
作为一项托管的服务,我们先需要获取到 SDK 文件。如果想要获取到最新版本可以参考链接。
- create-project: 创建 unreal 项目,提供了两个模板
- PathfindingSample 单 Worker
- MultiWorkerPathfindingSample 多 Worker
- docker-create-image: 生成本地的 docker 环境
- dowload-unity-package: 获取 unity 项目
- packaging-tool:容器配置,打包编译,模板项目
项目结构
通过上面的 create-project 命令创建的项目的基本结构如下:
- build:打出来的包存放目录
- cloudformation:上云的模板文件
- dependencies (unreal):demoframework
- App 流程模版代码
- Utility 代码
- Call back 事件驱动代码
- src (unreal):项目源代码
- tools:不同环境的工具脚本,schema 等等
CLI 命令
生成的项目在 tools 目录下,有一个 weaver-{projectname}-cli.bat,提供了很多 console 命令,常用的命令有如下几个:
- Control
- Start-simulation/Delete-simulation
- Start-app/Stop-app
- Start-clock/Stop-clock
- Info
- List-simulations/Describe-simulation
- List-apps/Describe-app
引擎工作流
本节会介绍 SimSpace Weaver 在不同游戏引擎下的开发工作流。
生命周期
如果我们要做 BOYE(自研引擎)的集成,需要关注几个 App 的生命周期,其生命周期如何调用 SDK,可以参考链接。
Unreal 项目
解压 SDK 后就会有 unreal 项目,提供基本文档,项目目前只支持 UE5。不能直接用客户端来做,需要获取 UE5 的源码,具体如何操作可以参考官方文档。
在编译源码前,需要将 ${UE_FOLDER}\UnrealEngine\Engine\Source\Runtime\Core\Private\Unix\UnixPlatformMemory.cpp
做如下修改:
本地工作流
- 可以在编辑器中跑起来,需要注意 Client 数目和 Partition 数目匹配。
云端工作流
- 通过命令行完成,所有的包和配置文件都会放置在 S3 目录。
- SimSpace 后台会根据 CLI 命令启动后台,然后我们可以客户端通过 endpoint 连接上去即可。
- Console 上面也提供了已经编译好的客户端,这个部分可以参考云端构建 SimSpace Weaver 应用程序。
配置文件:
- 本地:项目根目录下
- 云端:build 或者 tools 目录下
SDK 项目:
- 简介:通过不同颜色属性来表示不同 Worker,其中随机运动的小球会在跨区成功后改变对应的颜色。
- 本地工作流:直接可以在编辑器中以 Standalone 模式运行。
- 在 Play in Standalone Game 区域中,加入参数
-WeaverServerType=Spatial
- 在
schema.yaml
中如果设定了 2×2 的区域,则 Player Number of Client=4
- 在 Play in Standalone Game 区域中,加入参数
- 云端工作流:
- 云端构建 SimSpace Weaver 应用程序
- 将本地调试通过的游戏打包专用服务器,然后调用启动命令即可
- # 通过引擎命令生成专用服务器
- #将专用服务器打包成 weaver 所需服务器格式
- #上传到服务器和 schema 到 S3,并且启动模拟
Unity 项目(Preview 阶段)
通过 SDK 的 download-unity-package 安装,会提供基本的文档,支持 2021.3.7 版本以后,需要通过 package manager 安装。
Unity 的版本实际上是在 C++ 的 SDK 做了一层 C# 的封装,具体接口可以参考插件的 Runtime 目录下面的 API 接口。
云端工作流:
主要通过 Unity 来设置,并且提供了 AWS 自定窗口完成创建项目,配置文件和打包上传等工作。可以参考下面项目的例子。
本地工作流:
- 通过 unity 打包,每次选择对应的场景打包,而不是 all in one。
- 所以打包完毕后我们会有 spatial,custom 或 servcie 的可执行文件。
- 然后根据 schema 配置的 grid 数目来按照顺序启动 spatial, 然后再 custom 或者 service,最后再启动客户端即可。
- 可以参考下面项目的例子。
配置文件 (Schema):
- 本地:项目根目录下
- 云端:build 或者 tools 目录下
SDK 项目:
- 简介:模拟蚁巢的游戏,可以设置不同的分区,配置蚂蚁的一些属性。
- 本地工作流:
- 分别在 unity 的 Building Setting 中打包对应环境的场景。比如 Spatial App 就只勾选 AntSpatialApp,Custom App 就只是勾选 ViewAgentApp。
- 生成好可执行文件后,在对应的 build 目录下,将 Assets 下的 yaml 文件拷贝过来,记得重命名为 schema。
- 按照如下顺序启动 Spatial *4 → Custom → Client Editor。
- 最终效果如下图:
- 云端工作流:
- 安装 SimSpace插件,点开 unity→windows→aws
- 创建一个 SimSpace 项目,非 unity 项目
-
- 设置好 schema 文件,并且上传到 S3,注意这里我们只设置了 Spatial, Custom 并没有 Service。
-
- 根据 schema 文件生成不同的 app 所需要的可执行文件,然后上传到 S3。
-
- 然后到 S3 下面确认文件是否都在,应该有一个 schema 和一个 app 的桶,如下图:
-
- 到 SimSpace Weaver 的控制面板创建一个 simulation,参考配置如下,确定好后,会有一个 cloudformation 来拉起相关的环境。
-
- 需要手动将 clock 启动,这样整个世界才会开始模拟。
-
- 一开始只是启动了的 Spatial App 服务 X4,需要自己手动启动 Custom App 服务,可以通过 cloudwatch 查看:
-
- 等 Custom App 启动好后,获取到对外的 endpoint,最后将客户端连接过去即可。
总结
相信通过本文的介绍,大家对于 AWS SimSpace Weaver 这款产品有了一定的了解。它非常适合于大规模的空间模拟,通过 AWS 独有的服务器调度算法,以及顺滑的实体权限管控和切换系统,帮助开发者不受技术的限制来设计应用或者游戏的规模和体量。利用托管的服务器管理技术,开发者可以支持几十到数百万体量的实体模拟。利用“丝滑”的权限交接,它还会带来无感知的边界切换,让游戏或者应用可以做到前所未有的一个体验。对于主流引擎的支持,也会进一步降低上手的层本。
当然,它也有一定的局限性。首先目前最多 10 台 EC2 的限制是无法做到无限量的模拟;第二在一些特精度要求很高的同步场景,FPS 游戏,动作类游戏,他们通常会需要前后台同步帧率到 60Hz,甚至上百 Hz,这个数值是 SimSpace 目前无法做到的。
但令人欣喜的是,当下很多应用和游戏,AWS SimSpace Weaver 已经足够优秀能够处理他们所需的场景了。比如在 Re:Invent 2022 大会上,已经有合作伙伴利用这项服务制作了一个真实城市,并且放置了 100w 个市民在中间生活,参考 AWS SimSpace Weaver and uCrowds City Demo。
参考
- Youtube 上介绍 SimSpace Weaver
- AWS SimSpace Weaver官方文档
- AWS App SDK
- SimSpace Weaver CLI命令
- 云端构建 SimSpace Weaver 应用程序
- 如何从源码编译 UE5
- AWS SimSpace Weaver and uCrowds City Demo