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

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

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

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

如果您在调用 Amazon GameLift Streams APIs 或在控制台中使用资源时遇到 AccessDenied 异常,则您的 AWS Identity and Access Management (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"} } }
  • 有关更多信息,请参阅 “安全” 一章Amazon GameLift Streams 的 Identity and Access 管理中的,并查看 IAM 用户指南中的访问被拒绝错误消息故障排除

应用程序问题

本节列出了导致应用程序无法运行或导致应用程序在 Amazon GameLift Streams 上显示不同的问题的潜在原因。

初步检查

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

Proton 问题

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

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

应用程序在直播会话开始时终止

如果您的应用程序在直播会话开始时立即终止,请查看以下内容以了解潜在的原因和解决方案:

  • 验证运行时间。在 Amazon GameLift Streams 应用程序配置中,确认您在可执行文件启动路径中指定的文件是可执行文件或脚本,并且适用于您选择的运行时环境。Windows 应用程序的文件类型应为 “.exe”、“.bat” 或 “.cmd”,并以 Windows 或 Proton 运行时为目标。原生 Linux 应用程序应该是以 Ubuntu 22.04 LTS 运行时为目标的可执行文件。

  • 需要验证 DLLs。你的 Windows 应用程序可能缺少必填项 DLLs。例如,如果您的应用程序是调试版本,则它需要 Microsoft C 和 C++ (MSVC) 运行时库的调试版本。要解决这个问题,我们建议你打包你的版本和 DLLs side-by-side。有关说明,请参阅准备一台测试计算机以运行 Microsoft 提供的调试可执行文件

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

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

如果你的虚幻引擎应用程序无法启动、崩溃或需要你安装其他依赖项,例如Microsoft C和C++ (MSVC) 运行时,请尝试以下方法:

  • 使用正确的可执行文件。为了让您的应用程序在 Amazon GameLift Streams 中正常运行,请将应用程序路径设置为位于Binaries/Win64/(或类似)子文件夹中的完整可执行文件。虚幻引擎生成了两个可执行文件:一个位于文件夹根目录的小型引导程序可执行文件,另一个位于子文件夹中的平台目标可执行文件。Binaries/Win64/根目录下的引导程序可执行文件会尝试验证前提条件是否正确,并且可能会在 Amazon GameLift Streams 上创建误报,从而阻止应用程序启动。如果缺少平台目标可执行文件,则可能无法正确构建应用程序。例如,请参阅以下示例虚幻应用程序的文件夹结构:

    BuildApp |-> MyUnrealApp.exe |-> MyUnrealApp |-> Binaries |-> Win64 |-> MyUnrealApp.exe
  • 关闭虚幻引擎断言。禁用checkverify、和ensure宏。它们可以防止应用程序创建崩溃转储。如需了解更多信息,请参阅虚幻引擎文档中的断言

    • USE_CHECKS_IN_SHIPPING=0在你的版本中定义为禁用checkverify宏。

    • 使用-handleensurepercent=0命令行参数禁ensure用宏。

性能问题

本节指出了在 Amazon GameLift Streams 上运行时出现游戏性能问题的潜在原因,并提供了在服务上优化直播的建议。

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

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

  • 您的计算机可能拥有比 Amazon GameLift Streams 更强大的硬件。请务必在性能与 Amazon GameLift Streams 使用的硬件相似的计算机上测试应用程序:

    • gen4n:与 NVIDIA RTX 2060 GPU 相当

    • gen5n:与 NVIDIA RTX 3080 GPU 相当

    • gen6n:与 NVIDIA RTX 4060 GPU 相当

    这可以验证应用程序的渲染设置是否与 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
为 Proton 运行时应用程序实现基于驱动程序的缓存修复
  1. 使用以下环境变量覆盖开始流式传输您的默认应用程序:

    "__GL_SHADER_DISK_CACHE_PATH" : "/home/unpriv/games"
  2. 广泛播放应用程序以生成着色器。

    重要

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

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

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

  5. 在直播会话导出中找到着色器文件夹和文件:

    1. application\GLCache 文件夹

    2. 如果应用程序使用 DX11:application\path-to-exe\exe-name.dxvk-cachefile

    3. 如果应用程序使用 DX12:application\path-to-exe\vkd3d-proton.cache.writefile

  6. 将生成的着色器文件上传到应用程序的 Amazon S3 存储桶:

    1. 将该GLCache文件夹复制到应用程序的根目录中。

    2. 如果可用,请将.dxvk-cachevkd3d-proton.cache.write缓存文件复制到包含应用程序可执行文件的文件夹。

  7. 使用相同的 Proton 配置创建一个新的 Amazon GameLift Streams 应用程序。

  8. 使用相同的环境变量覆盖运行应用程序:

    "__GL_SHADER_DISK_CACHE_PATH" : "/home/unpriv/games"

当您的应用程序开始流式传输时,它将使用预生成的着色器,从而提高流加载性能。

注意

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

使用虚幻引擎为应用程序实现基于引擎的缓存修复

对于这种方法,你可以使用虚幻引擎的功能为你的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 GameLift Streams 后端服务时,请检查以下内容:

  • 选择 AWS 区域 尽可能接近最终用户的。从您的客户到托管直播的区域的高延迟会影响直播质量。有关AWS 区域 以及 Amazon GameLift Streams 支持的直播地点您可以从中直播的位置的列表,请参阅。您可以 ping 该区域的 AWS 控制台终端节点,以获得近似的延迟测量结果。

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

  • 请验证其设置ConnectionTimeoutSeconds是否合理,以便最终用户在 Web 客户端超时之前有足够的时间进行连接。

建议您的最终用户检查以下内容:

  • 确保防火墙允许访问 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 不时暂停,从而导致直播体验不佳。

直播输入问题

本节列出了与直播会话中用户输入相关的问题的潜在原因和解决方案。

一般输入疑难解答

  • 测试问题是否与浏览器有关。总体而言,我们建议使用谷歌浏览器、Microsoft Edge或基于Chromium的定制桌面应用程序,以获得最佳的最终用户体验和最大的兼容性,尤其是与游戏控制器的兼容性。

  • 记录从客户端发送并由应用程序接收的输入事件,以确定前端代码中存在输入不匹配的地方。

  • 请务必查看支持的浏览器和输入有关支持的浏览器和输入设备的更多信息,包括已知问题和限制。

游戏手柄和麦克风输入不适用于原生 Linux 应用程序

原生 Linux 应用程序不支持游戏手柄和麦克风输入。支持的浏览器和输入有关支持的输入设备的更多信息,包括已知问题和限制,请参阅。

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

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

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

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

打开操作系统界面元素时输入卡住

在桌面和移动浏览器客户端上,如果某些操作系统级用户界面元素具有优先级,则不会处理密钥发布等输入事件。这可能会导致角色移动或重复动作,就好像按住按键一样,即使你已经释放了按键。

  • 问题:当您打开某些操作系统级别的用户界面元素(例如桌面上的浏览器菜单栏或 iOS 上的 “控制中心” 和 “通知中心”)时,浏览器会停止触发输入事件,而不会触发模糊或焦点事件。这会导致服务器继续接收上次输入状态。这是浏览器级别的限制,无法可靠地检测到。

  • 解决方案:在桌面浏览器上使用全屏模式以防止访问浏览器菜单栏。对于连接了键盘的 iOS 用户,我们建议使用网络视图创建原生应用封装器,让原生应用可以更好地检测和处理焦点丢失,从而显式触发浏览器窗口焦点和模糊事件。或者,使用前端 HTML 或游戏内界面元素通知用户仍按下按键,并提供有关 iOS 限制的信息。

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

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

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

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

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

直播会话问题

本节列出了与直播会话意外开始或终止相关的问题的潜在原因和解决方案。

直播会话无法启动

潜在原因:

  • 应用程序挂起或崩溃。有关故障排除说明,请参阅应用程序问题部分。

  • 直播群组状态不是Active。验证直播组的状态。

  • 按需容量启动所需的时间超过 StartStreamSessionAPI ConnectionTimeoutSeconds 中指定的超时时间。在 Windows 运行时中,按需启动时间可能需要 5 分钟或更长时间。

  • 直播位置没有可用容量。验证您分配的容量是否大于正在使用的容量,或者您有未使用的按需容量(分配的容量小于始终开启的容量加上按需容量)。在控制台中,您可以在直播组列表或直播组详细信息页面上找到这些值。使用服务 API,您可以使用查找这些值GetStreamGroup。可用容量暂时为零的几种情况包括:

    • 如果您刚刚增加了直播位置的常开容量,请等待几分钟以分配容量。

    • 如果您的直播位置只有 1 个可用容量,并且您的客户端意外断开连接,则上一个会话可能仍处于断开连接状态。请等待几分钟,让会话超时,然后重试。

    • 如果您最近向直播组添加了一个位置,但该位置上不存在该应用程序,则该应用程序可能尚未在那里完成复制。在控制台的直播组详情页面上查看复制状态。或者,您可以使用 GetApplicationAPI 并检查该ReplicationStatuses值来验证所需的直播位置是否为COMPLETEDStatus

  • 网络条件非常差,以至于无法发送帧,尤其是第一帧。检查客户端和直播位置之间的网络状况,然后调整或尝试其他位置。

直播会话已终止

当应用程序崩溃或退出或客户端连接中断时,直播会话会自动终止。会话也可能由于以下超时值而终止:

  • 放置超时:Amazon GameLift Streams 查找用于托管直播会话的计算资源的超时值。

  • 连接超时:客户端连接或重新连接到直播会话的超时值。

  • 空闲超时:在没有用户输入的情况下,直播会话可以处于空闲状态的最长时间。

  • 会话长度超时:直播会话的最长时间。

有关每个超时及其可能值的详细说明,请参阅影响直播会话的超时值