View a markdown version of this page

着色器缓存 - 亚马逊 GameLift 直播

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

着色器缓存

借助着色器缓存,您的应用程序可以在未来的流会话中跳过昂贵的着色器重新编译。如果您的应用程序出现卡顿或加载时间缓慢的问题,捕获着色器缓存可以显著改善最终用户的体验。

使用 Amazon GameLift Streams,您可以从特别指定的流会话中捕获着色器缓存。所有兼容流组中应用程序的后续流会话将自动使用捕获的着色器缓存。使用着色器缓存功能无需对应用程序进行任何代码或其他更改。

先决条件

要使用着色器缓存,必须满足以下要求:

  • 直播群组必须在 2026 年 7 月 31 日当天或之后创建。在此日期之前创建的流组不支持着色器缓存。

着色器缓存的工作原理

游戏等图形应用程序受益于着色器缓存。缓存可避免重复的与图形相关的处理和编译工作。为了从指定的流会话中捕获着色器缓存,Amazon GameLift Streams 会收集为您的应用程序自动生成的系统着色器缓存文件。该服务存储此缓存,并自动将其应用于兼容流组的未来会话。这减少了未来会话中处理着色器所花费的时间。生成或使用着色器缓存不需要对应用程序进行任何更改。

着色器缓存生命周期分为三个阶段:

  1. 捕获 -在启用着色器缓存捕获的情况下运行流会话。在此会话中,系统会将应用程序使用的着色器程序自动编译到本地文件系统缓存中。当您正常退出应用程序时,Amazon GameLift Streams 会打包并上传此本地缓存。

  2. 复制 — Amazon GameLift Streams 将着色器缓存复制到流组的所有流媒体位置。您可以使用 ListApplicationShaderCaches API 操作监控复制状态。

  3. 消耗 — Amazon GameLift Streams 自动下载着色器缓存并将其应用于同一应用程序的所有后续流会话。着色器缓存用于所有兼容的关联流组和流媒体位置。默认情况下,此行为处于启用状态。

捕获着色器缓存

要捕获着色器缓存,请执行以下步骤:

  1. 使用 StartStreamSession API 操作启动直播会话。在请求中,在调用时将GAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_CAPTURE设置为1作为附加环境变量包括在内 StartStreamSession

    { "AdditionalEnvironmentVariables": { "GAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_CAPTURE": "1" } }
  2. 像往常一样在会话期间使用应用程序。

  3. 完成后,从应用程序的内置菜单中优雅地退出应用程序,或者使用其他内置退出命令退出。这可确保着色器缓存已准备就绪,可供收集。

  4. 终止后,Amazon GameLift Streams 打包已编译的着色器缓存,并开始复制到所有兼容的关联流组中的所有流媒体位置。

提示

在游戏应用程序中,浏览不同的环境、内容和关卡会生成额外的着色器数据。在捕获期间覆盖的应用程序越多,着色器缓存覆盖范围就越全面。覆盖范围的改善可以进一步缩短未来会话中的着色器处理时间。

重要

避免使用 TerminateStreamSession API 操作终止会话。如果您的应用程序没有内置退出功能,请使用该直播会话管理外壳功能远程登录。然后,在确保应用程序处于空闲状态且未呈现新内容后,停止应用程序进程。

生成着色器缓存后,可以通过将GAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_CAPTURE设置为启动更多会话来对其进行改进。1这些会话从现有的着色器缓存开始,并生成更新版本。

着色器缓存大小限制

小于 10 KB 或大于 4 GB(未压缩)的着色器缓存将被拒绝。

着色器缓存工作流程

当您为现有 Amazon GameLift Streams 应用程序生成着色器缓存时,所有兼容的关联流组都会自动开始使用它。

要在着色器缓存影响生产会话之前对其进行测试,我们建议使用以下方法:

  1. 创建单独的应用程序。

  2. 收集该应用程序的着色器缓存。

  3. 使用新的直播会话验证结果。

  4. 在生产设置中使用该应用程序。

着色器缓存复制

成功捕获后,Amazon GameLift Streams 会自动使着色器缓存可在应用程序兼容关联流组中的每个活跃流式传输位置使用。此复制过程通常在几分钟内完成。

您可以使用 ListApplicationShaderCaches API 操作监控复制进度。着色器缓存Status字段表示流组所有位置的聚合状态。可能的状态包括以下内容。

Status 说明
INITIALIZED Amazon GameLift Streams 收到了请求并正在准备着色器缓存。
PROCESSING Amazon GameLift Streams 正在将着色器缓存复制到关联流组中的流媒体位置。
READY 着色器缓存已复制,可在流会话中使用。
ERROR 处理着色器缓存时出错。创建一个新的着色器缓存以重试。
DELETING Amazon GameLift Streams 正在删除着色器缓存。

当状态为时READY,着色器缓存将自动应用于应用程序的所有新流会话。

新配置的流容量会立即接收着色器缓存。现有流组容量最多可能需要一小时才能获得新的着色器缓存。

禁用着色器缓存消耗

默认情况下,Amazon GameLift Streams 会在启动应用程序之前下载并应用着色器缓存。要禁用特定会话的此行为,请设置以下环境变量:

{ "AdditionalEnvironmentVariables": { "GAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_IGNORE": "1" } }

要改进现有着色器缓存,请仅GAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_CAPTURE提供。要丢弃现有缓存并收集全新的缓存,请同时提供GAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_IGNOREGAMELIFT_STREAMS_PACKAGED_SHADER_CACHE_CAPTURE

着色器缓存兼容性

您可以将一个应用程序与多个流组关联起来。要了解您的应用程序当前与哪些直播群组相关联,请使用 GetApplication API 操作并查看该AssociatedStreamGroups字段。

并非所有关联的流组都必须与收集的着色器缓存兼容。您可以使用 ListApplicationShaderCaches API 操作来确定哪些关联的直播组兼容。在其响应中,该AssociatedStreamGroups字段仅包含那些与着色器缓存兼容的关联流组。

显卡硬件和驱动程序决定系统如何编译着色器程序。因此,缓存不能在不同的硬件和软件配置之间传输。对于 Amazon GameLift Streams,着色器缓存兼容性由捕获期间使用的流组的属性决定:

  • 底层图形硬件 (GPU) 的精确模型

  • 已安装的 GPU 驱动程序版本

实际上,这意味着 Amazon GameLift Streams 着色器缓存具有以下兼容性限制。

  • 着色器缓存与使用不同 GPU 硬件的流类不兼容,这意味着不同的生成流类别。例如,gen5n_highgen6n_high流类不兼容,但gen6n_highgen6n_ultra是。同样gen6n_progen6e_pro也不兼容。

  • 安装了不同 GPU 驱动程序版本的流组之间的着色器缓存不兼容。直播组在其生命周期内使用相同的 GPU 驱动程序版本,但新创建的流组可能会收到更新的版本。有关目前在 Amazon Streams 上为新 GameLift 直播组提供的 GPU 驱动程序版本的更多信息,请参阅GPU 驱动程序版本

  • 着色器缓存在WindowsLinux、和Proton运行时之间不兼容。

Amazon GameLift Streams 会自动确定这种兼容性,并且仅将收集的着色器缓存用于兼容会话。

示例:不同的生成流类别

您的应用程序与两个直播组相关联:

  • 第一个直播组使用直播类 gen5n_high

  • 第二个直播组使用直播类 gen6n_high

同一个着色器缓存在这两个不同的世代流组中不兼容。要支持这两个流组,请为每个流类生成单独的着色器缓存。

示例:不同的 GPU 驱动程序版本

您有一个使用流类的gen6n_high流组,并已为其生成了着色器缓存。稍后您创建了另一个直播组,但仍使用相同的直播类gen6n_high

这个新的直播组现在使用不同的、最新的 GPU 驱动程序版本。通过使用 ListApplicationShaderCaches,您会发现您的新直播群组未列在下面AssociatedStreamGroups。因此,现有的着色器缓存与新的流组不兼容。使用新的流组生成新的着色器缓存。

解决着色器缓存问题

  • ListApplicationShaderCaches 显示状态错误 -着色器缓存处理期间出现错误。创建一个新的着色器缓存以重试。

  • ListApplicationShaderCaches 未列出新的着色器缓存

    • 着色器缓存太小或太大,无法收集。

    • 应用程序未正常退出。

    • 收集期间出错。

    创建一个新的着色器缓存以重试。