亚马逊AWS官方博客

基于 SimSpace Weaver 来构建超大规模游戏或应用的研究

前言

在 2022 年的 AWS Re:Invent 大会上,发布了一项令人振奋的服务 AWS SimSpace Weaver。这项技术借鉴了 AWS 多年来在云端的深入研究经验,解决了很多开发者面对大规模场景时面临的最大困难:如何搭建一个后端系统,实现对世界(计算力)的拆分和状态同步?通常情况下,如果从零开始构建这样的系统,需要多位资深工程师数月甚至数年的努力才能完成。

SimSpace Weaver 是一项主要解决大规模高密度情况下虚拟世界模拟的服务。它通过将庞大的世界划分为相等大小的区域来实现该目标。这项服务的发布,展示了 AWS 在更多场景中的潜力:

  1. 可以用于一些大规模的模拟仿真应用程序,如元宇宙,数字城市,运动会,甚至是军事领域。
  2. 在游戏领域,将来的一些超大型的 MMORPG(如魔兽世界)可以在云端进行托管。

概述

本文会涵盖以下内容:

  1. 介绍 AWS SimSpace Weaver 服务 (基础知识,对 SimSpace Weaver 有个基本了解)
  2. 熟悉 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 之前,确保您有以下依赖:

  • AWS 账号和必要权限,具体可以参考链接
  • 本地的开发环境,参考链接

SDK 介绍

作为一项托管的服务,我们先需要获取到 SDK 文件。如果想要获取到最新版本可以参考链接

aws s3 cp s3://aws-simspace-weaver-sdk-us-west-2-prod/1.12.0/SimSpaceWeaverAppSdkDistributable.zip .
  • 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 做如下修改:

#ifndef UE4_DO_ROOT_PRIVILEGE_CHECK
  #if defined(_M_X64) || defined(__x86_64__) || defined (__amd64__)
    #define UE4_DO_ROOT_PRIVILEGE_CHECK  0
  #else
    #define UE4_DO_ROOT_PRIVILEGE_CHECK  0
  #endif // defined(_M_X64) || defined(__x86_64__) || defined (__amd64__)
#endif // ifndef UE4_DO_ROOT_PRIVILEGE_CHECK

本地工作流

  • 可以在编辑器中跑起来,需要注意 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
  • 云端工作流:
    • 云端构建 SimSpace Weaver 应用程序
    • 将本地调试通过的游戏打包专用服务器,然后调用启动命令即可
    • # 通过引擎命令生成专用服务器
      .\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun -
      project="${PATH}\${PROJECT_NAME\src\PathfindingSampleUnrealSpatial\Pathfindi
      ngUnrealproject\PathfindingSample.uproject" -noP4 -clientconfig=Development
      -serverconfig=Development -utf8output -server -game -log -
      serverplatform=Linux -noclient -build -unversionedcookedcontent -cook -
      compressed -stage -package -compile -allmaps
    • #将专用服务器打包成 weaver 所需服务器格式
      .\package-unreal-${PROJECT_NAME}.bat
    • #上传到服务器和 schema 到 S3,并且启动模拟
      .\quick-start-${PROJECT_NAME}-cli.bat

Unity 项目(Preview 阶段)

通过 SDK 的 download-unity-package 安装,会提供基本的文档,支持 2021.3.7 版本以后,需要通过 package manager 安装。

Unity 的版本实际上是在 C++ 的 SDK 做了一层 C# 的封装,具体接口可以参考插件的 Runtime 目录下面的 API 接口。

云端工作流:

主要通过 Unity 来设置,并且提供了 AWS 自定窗口完成创建项目,配置文件和打包上传等工作。可以参考下面项目的例子。

本地工作流:

  1. 通过 unity 打包,每次选择对应的场景打包,而不是 all in one。
  2. 所以打包完毕后我们会有 spatial,custom 或 servcie 的可执行文件。
  3. 然后根据 schema 配置的 grid 数目来按照顺序启动 spatial, 然后再 custom 或者 service,最后再启动客户端即可。
  4. 可以参考下面项目的例子。

配置文件 (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

参考

本篇作者

万曦

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案的咨询和架构设计。坚实的 AWS Builder 文化拥抱者。拥有超过 12 年的游戏研发经验,参与过数个游戏项目的管理和开发,对于游戏行业有深度理解和见解。