对亚马逊 GameLift 直播进行故障排除 - 亚马逊 GameLift 直播

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对亚马逊 GameLift 直播进行故障排除

连接问题

在设置 Amazon GameLift Streams 后端服务时,请检查以下内容:

  • 选择 AWS 区域 尽可能接近最终用户的。从您的客户到托管直播的区域的高延迟会影响直播质量。您可以 ping 该区域的 AWS 控制台终端节点,以获得近似的延迟测量结果。

  • 确认您的直播组是否有容纳新直播的容量。

  • 请确认ConnectionTimeoutSeconds设置合理。增加它,让客户在超时之前有更多时间进行连接。

建议您的客户检查以下内容:

  • 打开 UDP 端口 33435-33465,允许从 Amazon Streams 进行直播。 GameLift 如果 Amazon GameLift Streams 无法到达这些端口,则可能导致直播问题,例如黑屏或灰屏。

  • 验证您的互联网连接是否可以将 1080p 直播的连接速度维持在至少 10 Mbps。如果您在 Amazon GameLift Streams 上玩游戏时检测到网络问题,则您的网速可能会波动,并且可能无法持续获得至少 10 Mbps 的速度。运行互联网速度测试并继续完成故障排除步骤。

  • 如果可能,请使用有线网络。使用 Wi-Fi 时,请将设备靠近路由器,以增强信号强度。

  • 如果您使用的是 2.4 GHz 和 5 GHz 频段的 Wi-Fi 路由器,请尝试连接其他频段。如果您不确定如何将路由器切换到其他频段,请访问 Wi-Fi 路由器制造商或提供商的支持页面。您也可以联系他们的客户服务。

  • 确定同一网络上的其他人(尤其是在使用家庭 Wi-Fi 时)是否正在运行高带宽应用程序,例如视频流、下载、在线游戏或备份。

  • 关闭设备上其他占用带宽的应用程序。

  • 直播时请勿使用 VPN 或代理。它们可能会导致更高的延迟并阻止游戏玩法。

  • 在 iPad 或 iPhone 上玩游戏时,请确认你使用的是无线网络,而不是蜂窝网络。使用蜂窝网络可能会导致连接问题。

  • macOS 用户应禁用 “定位服务”,因为这会导致 Wi-Fi 不时暂停,从而导致直播体验不佳。

性能问题

本部分确定了游戏直播性能不佳的潜在原因,并提供了使用 Amazon Streams 优化 GameLift 直播的建议。

在 Amazon GameLift Streams 上直播时游戏性能会降低

如果您的游戏在自己的机器上运行良好,但在 Amazon Stream GameLift s 上直播时遇到性能问题,请考虑以下几点:

  • 您的计算机可能拥有比 Amazon GameLift Streams 更强大的硬件。请务必在性能与 Amazon GameLift Streams 使用的硬件相似的计算机上测试应用程序。对于第 4n 代直播类别,这与配备 NVIDIA RTX 2060 GPU 的计算机相当。对于第 5n 代直播类别,这与配备 NVIDIA RTX 3080 GPU 的计算机相当。

  • 问题可能是由于您的网络连接或 Amazon GameLift Streams 的设置造成的。请尝试本连接问题节中的疑难解答提示。

如果您的游戏即使在本地运行也很慢,则需要优化其性能。最佳优化方法将取决于您使用的特定引擎或框架。

Windows 应用程序遇到加载时间慢或卡顿问题

如果您的游戏加载时间过长或出现卡顿现象,我们建议您采取以下措施:

  1. 根据引擎供应商关于优化内容和着色器性能的指导,确保对应用程序进行打包和优化,以提高加载性能。

  2. 确保将您的应用程序设置为直播组中的默认应用程序

  3. 将着色器作为应用程序打包的一部分进行缓存,从而优化首次在服务上启动的应用程序。

启用着色器缓存有两种方法:

  • 基于驱动程序的缓存-此方法特定于运行时环境 GPU 和驱动程序版本。此选项可以应用于所有应用程序,因此是默认推荐的方法。每种 GPU/driver 组合都需要复制这种方法的步骤。

  • 基于引擎的缓存 — 此方法允许通过游戏引擎(如果可用)进行着色器缓存。它将创建预先烘焙的管道状态对象 (PSO) 缓存的负担交给了开发人员。它还假设引擎能够在同一 GPU 硬件上处理对不同驱动程序的缓存支持。

作为最佳实践,我们建议首先实现基于驱动程序的缓存,因为它不需要深入了解如何为给定引擎实现 PSO 缓存。

通过这些实现,可以将着色器文件导出并与应用程序一起打包,这样就不必在每次新的流启动时都生成着色器文件。

为 Windows 运行时应用程序实现基于驱动程序的缓存修复
  1. 开始流式传输您的默认应用程序,并对其进行广泛播放,以便为该应用程序生成着色器。

    重要

    请务必访问环境的所有区域或关卡,以生成尽可能多的着色器。

  2. 在关闭直播之前,请在当前直播会话中启用导出功能。有关更多信息,请参阅 导出直播会话文件

  3. 从您在上一步中指定的 Amazon S3 存储桶下载直播会话导出.zip 文件。您可以在 Amazon GameLift Streams 控制台的 “会话” 页面上找到下载链接。

  4. 在直播会话导出中找到着色器文件夹。它通常保存到这个位置:AppData\Local\NVIDIA\DXCache. 将生成的着色器文件 (*.nvph) 上传到应用程序的 Amazon S3 存储桶。

  5. 创建一个.bat文件,该文件将在运行时将着色器文件复制到 NVIDIA 缓存文件夹。此文件夹通常位于:C:\Users\Administrator\AppData\Local\NVIDIA\DXCache. 将.bat文件上传到 Amazon S3 应用程序存储桶。

  6. 使用该.bat文件作为可执行路径创建一个新的 Amazon GameLift Streams 应用程序。

当您的应用程序开始流式传输时,您的.bat文件将在启动应用程序之前将预生成的着色器复制到着色器缓存中,从而提高流加载性能。

注意

每当更新应用程序或将 Amazon GameLift Streams 应用程序链接到新的直播组时,您可能需要重复这些步骤。较新的直播组可以包含服务中更新的 GPU 驱动程序。

以下示例.bat文件假设着色器文件存储在 Amazon S3 存储桶前缀Shaders\下。您可以使用不同的文件夹结构。

@echo off set CURRENT_PATH=%cd% set DXCACHE_DIR=%CURRENT_PATH%\Shaders set NVIDIA_DXCACHE_DIR=C:\Users\Administrator\AppData\Local\NVIDIA\DXCache if not exist "%NVIDIA_DXCACHE_DIR%" ( mkdir "%NVIDIA_DXCACHE_DIR%" ) xcopy /s /f "%DXCACHE_DIR%" "%NVIDIA_DXCACHE_DIR%" start %CURRENT_PATH%\app.exe
使用虚幻引擎为应用程序实现基于引擎的缓存修复

对于这种方法,你可以使用虚幻引擎的功能为你的Amazon GameLift Streams应用程序创建管道状态对象 (PSO) 缓存。PSO 缓存允许您在缩短运行时编译时间的情况下提供预编译的图形管道状态,从而减少加载和渲染过程中的故障。这需要虚幻引擎的高级知识,因此我们不会在这里介绍所有引擎特定的细节。有关其他说明,请参阅虚幻引擎在 “Collection Flow” 部分创建捆绑PSO缓存中的指南。

  1. 为启用了 PSO 日志记录的应用程序生成着色器。

    1. 使用带有支持 PSO 的应用程序的打包版本创建一个新的 Amazon GameLift Streams 应用程序。

    2. 在 PSO 日志应用程序中使用-logPSO命令开始直播。您可以在 Ama GameLift zon Streams 控制台的测试流配置页面上使用命令行参数选项。

      重要

      请务必访问环境的所有区域或关卡,以生成尽可能多的着色器。

    3. 在关闭直播之前,请在当前直播会话中启用导出功能。有关更多信息,请参阅 导出直播会话文件

    4. 从菜单或使用虚幻关闭命令退出应用程序。如果直接关闭直播,则不会生成虚幻着色器管道文件。

    5. 从您在导出步骤中指定的 Amazon S3 存储桶下载直播会话导出.zip 文件。您可以在 Amazon GameLift Streams 控制台的 “会话” 页面上找到下载链接。

  2. 将虚幻着色器管道文件打包到你的 Amazon GameLift Streams 应用程序中。

    1. 在直播会话导出下Saved/CollectedPSOs方找到录制的 PSO 文件 (rec.pipelinecache)。使用虚幻命令解压PSO文件。

    2. Package 使用解压时生成的输出打包一个新的虚幻版本。按照虚幻引导中的转换 PSO 缓存和在应用程序中包含 PSO 缓部分进行操作。

      重要

      在 “转换PSO缓存” 部分运行虚幻命令时,请确保使用相同的驱动程序版本输入文件。例如:对于 DX12,仅使用 SM6 文件作为输入。否则,在打包新应用程序时会出现错误。

    3. 使用 PSO 文件为新的打包版本创建一个新的 Amazon GameLift Streams 应用程序。

    4. 启动和测试直播时,请确认正在加载 PSO 缓存。查看游戏日志中是否有以下几行:

      Opened FPipelineCacheFile: ../../...
注意

每当更新应用程序或将 Amazon GameLift Streams 应用程序链接到新的直播组时,您可能需要重复这些步骤。较新的直播组可以包含服务中更新的 GPU 驱动程序。

应用程序问题

初步检查

  • 在另一台计算机上运行您的应用程序,以验证其是否已正确打包。这可以确认您的应用程序内容不包含任何可能无法在其他设备上运行的硬编码路径、缺失的资产、库或二进制文件。

  • (可选)在配备与 Amazon Streams GameLift 流媒体类相当的 GPU 的计算机上运行您的应用程序。这可以验证应用程序的渲染设置是否与 GPU 兼容,以及性能是否符合您的预期。

  • 打开 UDP 端口 33435-33465,允许从 Amazon Streams 进行直播。 GameLift 如果 Amazon GameLift Streams 无法到达这些端口,则可能导致直播问题,例如黑屏或灰屏。

应用程序不适用于 Proton 上的 Amazon GameLift Streams

屏幕分辨率导致的应用程序问题

如果您尝试使用不是 1920x1080 的全屏分辨率,则应用程序可能会冻结、崩溃或渲染不正确。我们建议您使用无边框全屏窗口来运行应用程序,并且不要尝试更改分辨率。

按键输入在 macOS 客户端上显示卡住了

在 macOS 客户端上,当同时按下 C ommand 修改键和另一个按键时,按键可能会突然出现卡住的情况,从而重复按键事件。例如,当同时按下 C ommand 键时,箭头键可能会卡住。在游戏中,如果使用箭头键旋转相机,这将使相机无休止地旋转。

  • 问题:macOS 上的命令键映射到密钥事件,该事件映射到微软 Windows 上的 Windows 密钥。问题是同时按下 C om mand 键和另一个键时会影响 macOS 浏览器的错误,其中键在释放时会重置,但箭头键没有重置,因为浏览器没有捕获箭头键的按键事件,因此 Web SDK 客户端不会向服务器发送 keyup 事件,流媒体应用程序仍会认为该键被按下。

  • 解决方案:如果您不使用命令键,则可以使用 Web SDK InputConfiguration 界面中的 Web SDK 键盘筛选机制 (keyboardFilter) 将其过滤掉。

在 Amazon GameLift Streams 上,鼠标移动的行为有所不同

如果使用 Amazon GameLift Streams 进行流式传输时鼠标移动的行为有所不同,例如移动速度快于预期,则可能需要调整应用程序中的鼠标处理和光标管理逻辑。

  • 问题:Amazon GameLift Streams 使用启发式方法来选择是以 “相对” 还是 “绝对” 模式传输鼠标事件。在相对模式下,新的鼠标更新是以与先前更新相比的微小增量差异提供的。在绝对模式下,将鼠标光标持续强制到与客户端同步的屏幕位置。当操作系统光标在流媒体内容上方可见时,启发式方法始终会选择绝对坐标。如果您的应用程序期望相对较小的更新,这可能会导致意想不到的大幅移动增量。

  • 解决方案:如果您的应用程序需要相对的鼠标移动(例如 FPS 风格的摄像机控件或基于拖动的交互),请在鼠标交互期间隐藏操作系统光标。例如,在鼠标向下移动时隐藏光标,在鼠标向上移动时再次显示光标。这样可以确保拖动动作使用相对坐标,只有在松开按钮时才会同步绝对位置。

有关在 Amazon GameLift Streams 中移动鼠标的更多信息,请参阅鼠标移动处理

虚幻引擎应用程序崩溃或需要其他依赖项

如果你的虚幻引擎应用程序崩溃、停滞或需要你安装其他依赖项,例如 Microsoft Visual C++ 运行时,请尝试以下方法。

  • 使用正确的可执行文件。为了让您的应用程序在 Amazon GameLift Streams 中正常运行,请将应用程序路径设置为位于Binaries/Win64/子文件夹或类似文件夹中的完整可执行文件。虚幻引擎生成了两个可执行文件:一个位于文件夹根目录的小型可执行文件(快捷方式),另一个位于Binaries/Win64/子文件夹中的完整可执行文件。如果缺少完整的可执行文件,则可能无法正确构建应用程序。例如,有关虚幻应用的示例,请参阅以下文件夹结构:

    BuildApp |-> MyUnrealApp.exe |-> MyUnrealApp |-> Binaries |-> Win64 |-> MyUnrealApp.exe
  • 关闭虚幻引擎断言。禁用 “检查”、“验证” 和 “确保” 宏。这可以防止应用程序创建崩溃转储,否则会导致应用程序在 Amazon GameLift Streams 上停止。如果启用了 Asserts,则应该会有延迟。如需了解更多信息,请参阅虚幻引擎文档中的断言

    • 设置USE_CHECKS_IN_SHIPPING=0为禁用 “检查并验证” 宏。

    • 设置handleensurepercent=0为禁用 “确保使用宏”。

Windows 应用程序在启动时终止

如果您的 Windows 应用程序在启动时终止,则您的应用程序可能缺少必填项 DLLs。如果您的应用程序是调试版本,则它特别需要 Visual C++ 库的调试版本 DLLs。

要解决这个问题,我们建议你打包你的版本和 DLLs side-by-side。有关说明,请参阅准备一台测试计算机以运行 Microsoft 提供的调试可执行文件

使用打包的版本和 DLLs,在干净的机器( EC2 例如 Amazon 实例)上测试您的应用程序。当您准备好在 Amazon GameLift Streams 上试用时,请使用此软件包创建一个新应用程序。请务必选择正确的可执行文件来运行包含的编译版本 DLLs。

通常,我们建议您在试用 Amazon GameLift Streams 之前,先在干净的机器上测试您的版本。有关在 Amazon EC2 实例上进行测试的说明,请参阅设置一台远程机器

向 Amazon GameLift Streams 服务提出请求时访问被拒绝

如果您在尝试执行 Amazon GameLift Streams 操作或使用资源时遇到 “访问被拒绝” 异常,则您的 AWS Identity and Access Management (IAM) 角色可能没有足够的权限。这是由于向 Amazon GameLift Streams 服务发出请求(例如调用)引起的StartStreamSession

确保受影响的 IAM 角色的策略具有对 Amazon GameLift Streams 的适当权限。请检查以下事项:

  • 如果 IAM 角色有明确的 “全部拒绝” 政策,则必须通过添加"gameliftstreams:*"元素来明确将 Amazon GameLift Streams 列为该策略的例外情况。NotAction例如:

    { "Sid": "DenyAllExceptListedIfNoMFA", "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:GetUser", "iam:ListMFADevices", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice", "sts:GetSessionToken", "gameliftstreams:*" // Add this ], "Resource": "*", "Condition": { "BoolIfExists": {"aws:MultiFactorAuthPresent": "false"} } }
  • 有关其他疑难解答,请查看 IAM 用户指南中的故障排除访问被拒绝错误消息