Steamworks 文献库
上传至 Steam
SteamPipe 是 Valve 的工具,用于向 Steam 交付内容,以下是其使用指南。 若要了解更新您游戏的最佳实践的更多信息,请参见更新您的游戏——最佳实践

SteamPipe 内容系统简介

SteamPipe 是驱动 Steam 的游戏/应用程序内容系统。 SteamPipe 包括以下功能:
  • 高效且快捷的内容交付。
  • 公开及私密“测试版”分支,允许测试多个生成版本。
  • 以网页为基础的生成版本管理简单易用——只需点击几次,即可推出新的生成版本或回滚至旧的生成版本。
  • 将生成版本设置上线前能够看到其更新大小。
  • 能够在多个应用程序之间分享内容。
  • 能够从公开或测试版内容生成安装光盘
  • 即使更新下载已经开始,游戏/应用也离线可用。
  • 所有内容永远加密,且未激活版本不会对顾客可见。
  • 可以在开发过程中使用的 SteamPipe 本地内容服务器
注意:有数个概念和 SteamPipe 是不可分割的,在开始之前,您应当熟悉一下应用程序文档中描述的所有概念。 就算只是大概了解各部分如何协调运作,也会对上传您的产品至 Steam 大有帮助。

游戏内容结构 - 最佳实践


SteamPipe 是为高效下载初始游戏安装文件和高效修补更新而设计的。 总体而言,它在多种游戏内容结构上都运行良好。 然而,在优化和避免可能导致无效的情况方面,有一些重要事项要了解。

注意: 如果您的游戏使用虚幻引擎,请查看本节末尾针对包文件的注意事项。

SteamPipe 会初步把每个文件划分为大约 1 兆(MB)的区块。 随后每个区块被压缩并加密,再上传至 Steam 内容交付系统。 它们会保持压缩和加密状态,直到被客户端下载、解密、扩展并放置到必要的文件位置。

SteamPipe 在处理现有游戏的更新时,会搜索查找与该游戏之前的生成版本匹配的区块。 这样,理想状态下,任意文件中只有新的或修改过的部分才会转换成“新”区块,而客户端只需下载这些新区块即可更新游戏。

许多游戏引擎使用“包”文件来合并游戏资产,并通过更高效的磁盘访问来改善加载时间。 总体而言,此方法在 SteamPipe 上运行良好。 然而,一些包文件系统的使用行为可能会导致问题。 这些问题带来的结果往往是更新远大于所必需的大小; 还有可能导致下载迅速,但更新过程缓慢,因为需要大量的本地磁盘 IO。

如果您的游戏使用包文件,以下是一些通用指南。

  • 确保包文件内的资产变更尽量在本地进行
  • 避免更改包文件中的资产排列顺序。
  • 限制包文件大小。
  • 按关卡/区域/功能将资产分组至自己的包文件中,并考虑为更新添加新的包文件,而不是修改现有的包文件。
  • 切勿纳入每个资产的任何原始文件名或文件/生成版本时间戳

上述第一点指的是单一资产被修改时文件内字节变更的范围。 在包文件的同一个位置对资产数据进行修改和/或增减,这是最理想的。 SteamPipe 只会为文件中包含资产数据的部分创建新的区块。 但是,所有的包文件也都需要某种类型的目录(TOC),以便引擎可以对资产数据的进行定位。 这个 TOC 的结构对 SteamPipe 修补的效率影响极大。 理想状态下,在文件起始或末尾附近有一个 TOC 或 TOC 树。 因为其他资产可能会在文件内移动字节位置,而其 TOC 条目也会随之变更。 在这种情况下,SteamPipe 会为修改后的资产数据及 TOC 部分创建新的区块。

但是,我们发现有些游戏引擎中的 TOC 信息分布在整个文件中。 更糟糕的是,它们使用的是字节偏移量的绝对值。 因此,如果字节 3450 上的一个资产大小增加了 8 个字节,则文件中其后所有资产的偏移量值都会发生改变。 即便每个偏移量值仅为 4 或 8 个字节大小,8 字节数字的变化也会导致 SteamPipe 创建 1MB 的新区块。 这将会带来灾难性的后果:只要修改包文件中几个很小的资产,就会导致客户端需要下载一半以上的文件以进行更新。 如果您知道或怀疑自己的包文件结构会导致此问题,请尽快联系您的 Valve 代表。 我们有替用的生成版本算法可以帮助减轻这个问题,虽然也会有一定的弊端。

此外,SteamPipe 并不知道包文件内资产的边界。 如果大小不到 1 兆字节的资产被重新排序,这种重新排序极有可能不会被检测到,因为之前确定的 1MB 区块不再于文件中显示。 因此,在创建游戏更新的过程中,如果您想通过把包文件内的资产重新排序来优化加载时间,请注意这可能导致更新的下载量非常大。 我们建议仅在能显著提高性能时才这样做。

下一步 - 要在客户端设备上更新包文件,SteamPipe 会在旧版本以外创建新版本。 创建完所有新文件后,SteamPipe 会通过删除旧文件并件移入新文来“提交”更新。 这意味着,要更新一个 25GB 的包文件,SteamPipe 始终会创建一个新的 25GB 的文件。 即使更新只是对该文件进行了 10 字节的修改,SteamPipe 也需要将几乎全部 25GB 的数据从旧文件复制到新文件。 视客户端所使用的存储硬件不同,这个过程可能会非常缓慢。 因此,我们做出以下两个建议。

首先,限制包文件的大小。 可能 1 或 2 千兆字节(GB)就已经够大了,完全足以在载入游戏时有效读取磁盘。

其次,将单一包文件中的资产保持在相当有限的范围内, 可以是单个游戏关卡,或是单个可解锁功能。 这样,着重于游戏特定部分的更新不会导致将其他部分的数据复制到客户端电脑。 此外,在添加新功能/关卡/其他内容时,这些更新可以,也很有可能应该放置在自己的新包文件内。 下载更新的客户端会单纯下载新文件,避免上文提到的包文件修改带来的任何问题。

如有疑问,可以用类似 Beyond Compare 的本地二进制差异工具来比较各版本的包文件。 确认所显示的差异是您预料中已更改资产的大小,而且文件各处并没有散落着数十上百个小型更改。 如果您所看到的不在意料之中,检查您包文件工具的设置。

压缩:因为 Steam 会为了上传/存储/下载而压缩所有数据,所以我们一般不建议对包文件进行常规压缩。 但是,如果您担心游戏占用磁盘空间太大,可能还是需要进行包文件压缩。 只要满足上方所列条件,压缩对于 SteamPipe 而言是可行的。 具体来说,您应该确保尽可能地按资产进行压缩。 任何跨资产边界进行的压缩都会使变更分散开来,导致客户端不得不下载过多的数据。

加密:与压缩类似,极有可能没有必要,也会带来上述的风险。

如果您按照这些规则进行,则会将补丁大小降到最低,只需下载新内容即可。 您的顾客会因此对您多加感谢,而您也可以通过发布更多更新来提高产品质量。

如果您觉得自己游戏的打包与 SteamPipe 更新流程交互不畅,请联系您的 Valve 代表,我们可以调查启用高级功能是否会对此有所帮助。

虚幻引擎 - 特别注意事项

某些版本的虚幻引擎会在包文件中使用资产“填充对齐”,这会极大地影响 SteamPipe 更新的大小。 这种对齐会在创建新版本时导致级联资产移动,特别是启用了包文件压缩的情况下。 使用 1MB(1048576)的填充对齐将有助于确保重新对齐会按 SteamPipe 用来计算增量的相同块大小的倍数来移动资产。

例如,如果要在“烘焙”游戏包文件时更改或指定填充对齐,您需要更改 UnrealEngine/Engine/Source/Programs/AutomationTool/Win/WinPlatform.Automation.cs 文件中的一行。 该文件包含一个 GetPlatformPakCommandLine 函数——在该函数中,更改下面这行:

string PakParams = " -patchpaddingalign=2048";

更改为:

string PakParams = " -patchpaddingalign=1048576 -blocksize=1048576";

更改后,您应该可以启用包文件压缩,且仍然可以获得优化后的 SteamPipe 更新行为。

虚幻引擎是 Epic 在美国及其他地方的商标或注册商标。

Steamworks 视频教程:在 SteamPipe 中创建您的游戏

此教程对 SteamPipe 进行了介绍,并逐步讲解了如何通过 Steamworks 工具为 Steam 创建样本应用程序。
https://www.youtube.com/watch?v=SoNH-v6aU9Q

Steamworks 视频教程 – 添加新平台与语言

此教程带您了解如何通过为应用添加 Depot,使游戏支持新的平台和语言。
https://www.youtube.com/watch?v=PShS32hcing

SteamPipe 技术详情

SteamPipe 使用 HTTP 协议进行内容交付。 由于下载属于常规的网页流量,因此客户与 Steam 服务器之间的任何第三方 HTTP 缓存都会提高下载速度。 内容可以由外部 CDN 提供商托管,而 CDN 提供商可轻松添加至我们的内容网络。 大多数消费者使用的防火墙都允许 HTTP 流量,不会阻止下载。

SteamPipe 具有基于二进制增量的高效补丁算法,仅更改现有内容文件的修改部分。 此内容更新时,只需要发送这些增量。 这意味着开发人员和用户的传输量都更小,速度都更快。 大多数合作伙伴会发现没必要使用SteamPipe 本地内容服务器,因为他们可以高效地在私密分支上给生成版本打补丁。

Steam 生成版本帐户

在 Steam 上创建任何生成版本之前,您的 Steamworks 帐户中必须有一个拥有“编辑应用元数据”和“在 Steam 上发布应用更改”权限的 Steam 帐户。 出于安全考虑,建议您持有一个仅具备这些权限的生成版本专用帐户。您可以在 https://store.steampowered.com/join 为此创建一个新的 Steam 帐户。

您 Steamworks 帐户的任何管理员都可以添加 Steam 帐户并授予必要的权限。 关于此流程的更多信息可在管理您的 Steamworks 帐户文档中找到。 此帐户的示例如下:

create_build_account.png
Note: If the Steam account will need to set a build live for a released app, it will need either a phone number attached to their account or have the Steam Mobile App attached to their account. Those methods will be used to confirm setting a build live for a released app. Additionally, if the Steam account has any security changes (email, phone number, etc), then you will need to wait 3 days before you can set a build live for a released app. This is to prevent compromised accounts from being able to manage your app's released builds.

新 SteamPipe 应用的初始设置

请按照以下步骤设置新的 SteamPipe 应用:
  1. 找到您应用程序的 app ID(可以通过在您的 Steamworks 主页上选择该应用程序来找到)。
  2. 前往您应用的通用安装设置页面。
  3. 定义至少一个启动选项,即路径以及启动游戏所需的任意参数(可选)。 将鼠标悬停在 (?) 上方,对每个字段了解更多。

    以下示例显示了 5 个启动选项,其中 2 个 用于 Windows,2 个用于 macOS,1 个用于 Linux 。
    只有在用户还拥有指定的 DLC,启动选项 3 才会在 Windows 上显示。

    updatedlaunchoptions_3.png
  4. 前往 Depot 页面,根据需要为此应用添加 depot。默认情况下,您的应用程序可能已经配置了一个 depot。
    1. 点击默认 depot,将其名称更改为合适且易于识别的名称(例如“基础内容”或“Windows 内容”)。
    2. 除非这是针对特定语言的 depot,否则保持语言设置为[所有语言]。
    3. 除非这是针对特定操作系统的 depot,否则保持操作系统设置为[所有操作系统](如果应用适用于所有系统,或仅适用于 PC 或者 Mac,则保持设置为[所有操作系统])。 仅指定针对特定操作系统的游戏 depot。
    4. 点击添加新 Depot 以创建更多 depot。
    5. 点击保存以保存所做的所有更改。
  5. 完成对 depot 的定义后,前往发布页面发布您所做的更改。
  6. 您新定义的 depot 需要纳入程序包中,才能授予您 depot 的所有权。 Steam 上的每款游戏都有一个 Developer Comp 程序包,会自动授予给您发行商组中列出的帐户。
    您可以在关联程序包与 DLC 页面将新的 depot 添加至该程序包(和/或其他应有这些 depot 的程序包)。
注意:如果可执行文件位于主安装文件夹的子文件夹中,请在“可执行文件”字段中添加子文件夹名称。 请勿使用前导斜杠或点。
平台备注:如上所示,macOS 应用程序可以通过指定应用程序包(Game.app)或脚本/二进制文件(Game.app/Contents/MacOS/Game)来启动。 一般而言,如果可能,首选应用捆绑包格式,因为如果是在 Steam 之外手动启动,这样就可以让 macOS 更为准确地确定启动参数。

这方面要注意的一个实例就是,当前,在搭载 Apple 芯片的设备上通过应用捆绑包启动的应用程序将会启动该应用程序的最佳可用架构,而用二进制文件直接启动将使用与 Steam 进程相同的架构(当前为 x86_64)。

为 SteamPipe 上传设置 SDK

在将要上传生成版本的计算机上下载并解压缩最新版本的 Steamworks SDK。

您可以在 SDK 的 tools 文件夹中找到 SteamPipe 工具,其中包含 2 个相关的子目录。

ContentBuilder 目录是您的游戏内容和 SteamPipe 生成版本工具所在的目录。 此目录包含以下子目录:
  • builder - 此目录最初仅包含 steamcmd.exe,即 Steam 的命令行版。
  • builder_linux - steamcmd 的 Linux 版。
  • builder_osx - steamcmd 的 macOS 版。
  • content - 此目录包含所有将生成到 depot 中的游戏文件。
  • output - 此目录将是生成版本日志、区块缓存和中间输出所在的位置。 注意:此文件夹可以随时删除或清空,但是删除后,下一次上传将花费更长的时间。
  • scripts - 在此目录中,您将放置用于生成游戏 depot 的所有生成版本脚本。
steampipebuilddir.png

建议您直接在 builder 文件夹中为您的平台运行一次 steamcmd.exe,以启动您的生成版本系统。 这应能在您的 builder 目录中填充生成 depot 所需的所有文件。

如果您选择运行自己的 SteamPipe 本地内容服务器ContentServer 目录中包含所需的工具。

macOS 上的 SteamCmd

要在 macOS 上启用 SteamCmd,您必须完成以下步骤:
  1. 在终端上,找到 tools\ContentBuilder\builder_osx 文件夹。
  2. 运行 chmod +x steamcmd。
  3. 输入 bash ./steamcmd.sh。
  4. 然后,SteamCmd 将运行并更新到最新的生成版本,您将会看到 SteamCmd 提示。
  5. 输入“exit”并按下回车键以退出提示。
然后,您可以遵照此文档的余下部分(适当地替换路径),创建用于将您的内容上传到 Steam 的 depot 和应用配置文件。

创建 SteamPipe 生成版本配置文件

要使用 SteamPipe 为您的应用上传文件,您必须创建脚本来描述您的生成版本以及将包含在其中的每个 depot。 此处显示的示例脚本位于 Steamworks SDK 的 Tools\ContentBuilder\scripts 文件夹中。

SteamPipe GUI 工具

如果您是在 Windows 上运行,并且希望使用 GUI 工具来帮助创建这些配置文件并上传生成版本,则可以使用 Steamworks SDK 的 tools 文件夹中的 SteamPipeGUI。 zip 文件中包含更多入门说明。

即使您选择使用 GUI 工具,仍建议阅读以下部分,以帮助您更加熟悉 SteamPipe 系统的工作方式。

简单生成版本脚本


让我们从最基础的生成版本脚本开始。 在这个示例中,我们有一个游戏(AppID 1000),该游戏具有一个 depot(DepotID 1001),我们希望上传一个内容文件夹及其子文件夹中的所有文件。 为此,我们只需要一个生成版本脚本,请看 SDK 中包含的“simple_app_build.vdf”

"AppBuild" { "AppID" "1000" // 您的 AppID "Desc" "This is a simple build script" // 此生成版本的内部描述 "ContentRoot" "..\content\" // 相对于此文件位置的根内容文件夹 "BuildOutput" "..\output\" // 生成版本日志和生成版本缓存文件的生成版本输出文件夹 "Depots" { "1001" // 您的 DepotID { "FileMapping" { "LocalPath" "*" // 来自内容根文件夹的所有文件 "DepotPath" "." // 映射到 depot 的根目录 "recursive" "1" // 包含所有子文件夹 } } } }

根据需要调整您游戏的 AppID 和 DepotID。 要开始构建,您需要运行 steamcmd 并传递几个参数:
tools\ContentBuilder\builder\steamcmd.exe +login <account_name> <password> +run_app_build ..\scripts\simple_app_build.vdf +quit

在创建 SteamPipe 生成版本的过程中将发生以下步骤:
  1. steamcmd.exe 会自我更新至最新版本。
  2. steamcmd.exe 使用给定的用于创建生成版本的 Steam 帐户登录到 Steam 后端。
  3. 应用生成版本起始注册于 MDS(主 Depot 服务器),这将确保用户具有正确的权限来修改此应用。
  4. 对于应用生成版本中包含的每个 depot,会基于内容文件夹中的文件以及 depot 生成版本配置文件中定义的筛选规则,生成一个文件列表。
  5. 每个文件都经过扫描,并分割成约 1MB 的小型区块。 如果 depot 之前已经生成过,此分区将尽可能保留最多的区块不变。
  6. 对新的文件区块进行压缩、加密,然后上传到 MDS。
  7. 为此 depot 版本生成最终清单。每个清单由唯一的 64 位清单 ID 识别。
  8. 处理完所有 depot 后,MDS 会完成此应用生成版本的创建,并为其分配一个全局 BuildID。
  9. 生成版本完成后,生成版本输出文件夹中可能有 *.csm 和 *.csd 文件。 这些是临时文件,可以删除,但是它们可以缩短后续版本生成所用的时间。


生成版本完成后,您可以在应用的生成版本页面上看到它,在此示例中则位于 https://partner.steamgames.com/apps/builds/1000。 在该页面上,您可以为默认分支或任何测试版分支将该生成版本设置上线,而用户几分钟内即可下载此更新。

高级生成版本脚本


如果您的应用有许多文件映射规则复杂的 depot,您可以为每个 depot 创建一个 depot 生成版本脚本,供应用生成版本脚本引用。 首先让我们来看看应用生成版本脚本中可用的参数:

  • AppID - 您游戏的 AppID。 进行上传的 Steam 合作伙伴帐户需要有“编辑应用元数据”权限。
  • Desc - 描述仅在应用管理员面板的“您的生成版本”栏目中对您可见, 在上传生成版本至“您的生成版本”页面后可以随时修改。
  • ContentRoot - 您游戏文件的根文件夹,可以是生成版本脚本文件的绝对或相对路径。
  • BuildOutput - 此目录将是生成版本日志、depot 清单、区块缓存以及中间输出所在的位置。 为获得最佳性能,请为您的生成脚本输出使用不同磁盘。 此举将拆分磁盘的 IO 工作负载,让您的内容根磁盘处理读取请求,而您的输出磁盘处理写入请求。
  • Preview - 此类型的生成脚本仅将日志和文件清单输出至生成版本输出文件夹。 创建预览生成版本是对您的上传脚本进行循环访问的好方法,可以确保您的文件映射、筛选器及属性按预期工作。
  • Local - 将此参数设置进您的 SteamPipe 本地内容服务器(LCS)htdocs 路径中。 LCS 生成版本仅将内容放入您自己的 HTTP 服务器,并允许您用 Steam 客户端测试您游戏的安装情况。
  • SetLive - 生成版本发布成功后,测试版分支名称将自动设置为上线,如为空,则无生成版本。 请注意,“默认”分支无法设置为自动上线, 必须通过应用管理员面板进行。
  • Depots - 此栏目包含每个 depot 的所有文件映射、筛选器以及文件属性,或是为每个 depot 引用单独的脚本文件。

示例应用生成版本脚本“app_build_1000.vdf”使用了所有选项:
"AppBuild" { "AppID" "1000" // 您的 AppID "Desc" "Your build description here" // 此生成版本的内部描述 "Preview" "1" // 只将此作为一个预览生成版本,未上传任何内容 "Local" "..\..\ContentServer\htdocs" // 将内容放入本地内容服务器,而不是上传至 Steam "SetLive" "AlphaTest" // 将此生成版本设置为在测试版分支上线 "ContentRoot" "..\content\" // 相对于此脚本文件的内容根文件夹 "BuildOutput" "D:\build_output\" // 将生成版本缓存和日志文件放入另一个驱动器,以获得更佳性能 "Depots" { // 每个 depot 的文件映射说明位于单独的脚本文件中 "1001" "depot_build_1001.vdf" "1002" "depot_build_1002.vdf" } }

此应用生成版本脚本引用了指定所有文件映射及文件属性的两个 depot 生成版本脚本文件。 可在 depot 生成版本脚本中获得以下说明(如果该栏目直接纳入应用生成版本脚本,则也可获得)。

  • DepotID - 此栏目的 DepotID。
  • ContentRoot - 让您按 depot 从应用生成版本脚本覆盖 ContentRoot 文件夹(可选)。
  • FileMapping - 将单个文件或一组文件从本地内容根映射至您的 depot。 可以有多个将文件添加至 depot 的文件映射。 LocalPath 参数是内容根文件夹的相对路径,可能包含像是“?”或“*”的通配符。 如果启用 Recursive,也会在子文件夹里映射文件时应用。 DepotPath 参数指定了选定的文件应该在 depot 中何处显示(无特殊映射则只使用“.”)。
  • FileExclusion - 会再次排除已映射的文件,也可以包含像是“?”或“*”的通配符。
  • InstallScript - 会将文件标记为安装脚本,并在生成版本过程中签署文件。 Steam 客户端知晓要为任何装载了此 depot 的应用程序运行这些文件。
  • FileProperties - 会用特殊标志对文件进行标记:
    • userconfig - 此文件由用户或游戏修改, 无法用更新覆盖;而且如果与文件此前版本不同,也不会触发验证错误。
    • versionedconfig - 与 userconfig 相似,但是如果文件在 depot 中已更新,则会在用户游戏更新时被本地覆盖。 在进行必须的格式更改或漏洞修复时,只更新 depot 中的文件。

示例 depot 生成版本脚本 depot_build_1002.vdf 使用了所有选项:
"DepotBuild" { "DepotID" "1002" "ContentRoot" "C:\content\depot1002" // 从应用生成版本脚本覆盖 ContentRoot "FileMapping" { // “.\bin”中的所有源文件和文件夹将会被映射至 depot 中的“.\executables” "LocalPath" "bin\*" "DepotPath" "executables\" "Recursive" "1" // 包含所有子文件夹 } "FileMapping" { // 用德语版本覆盖 \\audio 中的音频文件 "LocalPath" "localization\german\audio\*" "DepotPath" "audio\" } "FileMapping" { // 复制德语版本的安装脚本至 depot 根文件夹 "LocalPath" "localization\german\german_installscript.vdf" "DepotPath" "." } "FileExclusion" "bin\server.exe" // 排除此文件 "FileExclusion" "*.pdb" // 在所有地方排除所有 .PDB 文件 "FileExclusion" "bin\tools*" // 排除 bin\tools\ 下的所有文件 "InstallScript" "localization\german\german_installscript.vdf" "FileProperties" { "LocalPath" "bin\setup.cfg" "Attributes" "userconfig" // 此文件会在运行时中被修改 } }

注意: 您可以任意对这些脚本进行命名,但我们使用 app_build_<AppID>depot_build_<DepotID> 的名称,以保持一致性。 如果您知道自己会在此计算机上创建应用,最好在您的脚本目录中为每个应用程序创建子目录,有助于整理每个应用程序的生成版本脚本。

在 CI/CD(持续集成 / 持续交付)环境中使用 SteamPipe


要设置 steamcmd 以进行持续集成,或者仅在将经常重新映像的计算机或虚拟机上设置,您需要纳入包含登录令牌的配置文件。 请遵循以下步骤,以便您的初始登录令牌可以正确保存:

  1. 在将创建生成版本的计算机上运行“steamcmd.exe +login <username>”;
  2. 输入密码,以及 Steam 令牌;
  3. 键入“info”,然后您应该会看到自己的帐户显示为已连接;
  4. 键入“quit”;
  5. 此后每次运行时,无需输入密码, 只需运行“steamcmd.exe +login <用户名>”即可;
  6. 确保存储在 <Steam>\config\config.vdf 的配置文件每次运行后均保存且保留,因为每次成功登录后此文件都可能会更新。

注意: 如果您再次登录并提供了密码,则系统会发放新的 Steam 令牌并要求提供令牌方可登录。

管理更新

应用向顾客发布后,他们就会收到标记为“默认”生成版本的版本。 上传新的生成版本时,最好在将生成版本向顾客发布前进行测试。请参见在 Steam 上进行测试,了解如何成功进行测试的更多信息。

调试生成版本问题

如果生成失败,您应该在输出目录中——而不是在生成版本脚本运行的控制台中——查看错误信息。 大部分错误信息可以在 *.log 文件中找到。
您可以用以下 Steam 客户端命令及客户端文件来调试问题:
  • “app_status [appid]” - 显示此客户端上应用的当前状态。
  • “app_info_print [appid]” - 显示此游戏当前的 Steamworks 配置(depot、启动选项,等等)。
  • “app_info_print [appid]” - 显示此游戏当前的用户配置(当前语言、安装目录,等等)。
  • 文件“logs\content_log.txt” - 列出所有已记录的 SteamPipe 操作和错误。
  • 文件:teamapps\appmanifest_[appid].acf” - 显示此应用当前的安装状态(KeyValues)。

创建零售安装光盘

要为 SteamPipe 游戏创建零售安装光盘,您必须首先设置一个生成版本项目文件。
在此示例中,SKU 文件称为“sku_goldmaster.txt”:
"sku" { "name" "Test Game Installer" "appid" "202930" "disk_size_mb" "640" "included_depots" { "1" "202931" "2" "202932" } }
以下是一些需要注意的提示:
  • 创建一个可将零售光盘映像写入其中的新文件夹,例如:“D:\retail_disks”。 仅添加 included_depots 部分中的 depot,排除部分不再存在。
  • 您可以使用(带有 -dev 与 -console 命令行参数的)Steam.exe 或是使用 steamcmd.exe 生成安装映像。 在这两种情况下,使用“ build_installer”命令。
  • 登录所用 Steam 帐户应已拥有您要放入零售光盘的游戏和所有 depot。 在其他情况下,该帐户不需要特殊权限,因此任何人都可以创建安装光盘。
  • 如果您使用 Steam.exe,请停止所有其他下载。
  • 前往控制台页面并运行 build_installer 命令:
    build_installer sku_goldmaster.txt "D:\retail_disks"
    由于所有的 depot 都是首次重新下载,因此创建可能需要一段时间。
  • 要使用本地内容服务器创建 GM,请运行:
    @localcontentserver "webserver"
    build_installer sku_goldmaster.txt "D:\retail_disks" local
    因为“零售安装光盘”和本地游戏备份基本相同,因此请参考“备份”。
  • 看到“Backup finished for AppID...”后,说明安装磁盘映像已准备就绪。 您可以在 logs\backup_log.txt 中找到有关备份生成版本的更多详情。
  • 在“D:\retail_disks”中会建立新文件夹(Disk_1、Disk_2 等)。每个文件夹大小由“disk_size_mb”指定,不会大于 640 MB。 每个磁盘文件夹都包含了每个 depot 的“sku.sis”文件以及 .csd 和 .csm 文件。 较大的 depot 会跨越多个磁盘。 与本地游戏备份文件不同,所有零售安装磁盘内容始终被加密。 将 SDK GM 的设置文件(setup.exe、setup.ini 等)复制到第一个磁盘上的文件夹中,零售光盘安装程序即可完成。
  • 为 macOS 创建 GM 时,请确保在 Mac 上打开 goldmaster/disk_assets/SteamRetailInstaller.dmg 映像。 然后,将其中的应用复制到您媒体的根中。 我们还建议重命名已安装的应用、为图标加上品牌元素并使窗口仅显示安装程序。
  • 为 macOS 创建多盘 GM 时,请确保每张光盘的卷名都匹配。 卷名是安装路径的一部分,因此,如果名称不匹配,安装程序将无法找到下一张光盘。

(可选)从测试版分支创建零售安装程序

上面的过程将基于默认分支创建零售安装程序。 如果需要基于测试版分支创建安装程序,则首先需要创建一个名为“基线”的测试版分支。 然后,使用以下命令从基线分支进行创建:
build_installer <project file> <target folder> <beta key> <beta pwd> steamcmd ex: build_installer sku_goldmaster.txt "D:\retail_disks" baseline superSecret script ex: steamcmd.exe +login user_name password +build_installer "..\Build\GameDataSku.txt" c:\destination beta_key beta_password +exit

从零售安装程序安装 DLC

在某些情况下,您也许需要创建包含 DLC 程序包的零售安装程序。 在这种情况下,创建安装程序的过程只需要进行少量更改。
在“sku_goldmaster.txt”的“included_depots”部分下纳入 DLC AppID。 运行“build_installer”进程后,找到为安装程序生成的 sku.sis 文件,并用文本编辑器将其打开。
将 DLC AppID 添加到“apps”部分。 例如,如果我的游戏具有 AppID 1000 和 DLC AppID 1010,则会按如下所示调整“apps”部分:
"apps" { "0" "1000" "1" "1010" }
这将确保 Steam 检查 DLC 的所有权,并在用户登录 Steam 的帐户不拥有 DLC 时向用户提示输入序列号。

在单张光盘/单个安装程序包上为多个 App ID 创建零售安装程序

要创建包含多个 SteamPipe 应用的 GM, 则应逐个创建应用安装程序,但将它们都指向同一个输出文件夹。 每个生成版本都将与现有的安装映像合并到一起。

自定义零售安装磁盘

有关自定义零售安装磁盘的更多详情,请参见创建零售及“Gold Master”磁盘

发行前预载游戏

默认情况下,所有零售光盘和所有内容服务器上的所有内容始终被加密。 当游戏切换到预载模式时,所有者可以下载内容,但内容会在用户磁盘上保持加密状态且无法游玩。 游戏正式发行后,Steam 将解密预载的内容,而用户也可以玩游戏了。

在以下情况下,建议将游戏切换到预载模式:
  • 在游戏实际可用之前,将带有产品密钥的零售光盘发货(零日盗版)。
  • 进行了预购且大小超过 20GB 的游戏。

如果您认为自己的游戏需要预载,请向 Steam 发行团队提交案件。

创建 DLC

DLC 作为基础游戏的 depot 而创建。 参见可下载内容(DLC),了解更多信息。

SteamPipe 故障排除

通过 steamcmd 登录时显示“Login Failure: Account Logon Denied Failed”

原因:可能是 Steam 令牌阻止了登录。 解決方法:
  • 检查与您尝试登录时使用的帐户关联的电子邮件,并查看是否有来自 Steam 客服的电子邮件。 复制该电子邮件中的代码。
  • 运行以下 steamcmd:set_steam_guard_code <code>
  • 重新尝试从 steamcmd 登录:Steam>logon <buildaccount> <password>

下载问题一般故障排除

  • 重启计算机、调制解调器、路由器等。
  • 验证防火墙设置。 新系统需要此处列出的 80 端口(HTTP)以及所有其他 Steam 端口。
  • 暂时禁用本地杀毒或垃圾邮件拦截程序。
  • 设置->下载中检查 Steam 下载地区。 它应该与您所在位置一致。
  • 停止下载、卸载并重新安装游戏(清除清单缓存)。
  • 退出 Steam,并删除 Steam 安装文件夹中的两个文件夹 appcache 和 depotcache。
  • 尝试将您的 Steam 下载地区设置到较远的其他位置。 如果您附近的内容服务器在提供错误的数据,这可能会起作用。

我的 Mac 和/或 Linux 生成版本未安装任何文件。 为什么?

如果通过 Steam 在多个平台上测试游戏或应用程序的安装,可能会遇到生成版本会在 Windows 上部署,但即使已将 SteamPipe 进程设置为上传 Mac 和/或 Linux depot,也不会在 Mac 或 Linux 上部署任何文件的情况。 在将替用 Depot 添加到正在部署的程序包中时,有一个步骤很容易遗漏。 您可以通过以下步骤检查程序包中包含哪些 depot:
  1. 导航至您的应用管理员页面。
  2. 在“查看关联项目”栏目,点击“所有关联程序包、DLC、试用版及工具 ”。
  3. 点击您尝试下载的程序包的名称。
  4. 查看已包含 Depot 栏目。
  5. 使用添加/移除 Depot 以确保分配到该程序包的 Depot 集是正确的集。
许多关于此话题的讨论串也可能会有帮助:

steamcmd.exe 运行时,出现以下错误:“SteamUpdater: Error: Steam needs to be online to update。 Please confirm your network connection and try again.”(Steam 需要在线进行更新。请确认您的网络连接正常,然后重试。)

解决方法:前往 Internet 选项->连接->局域网设置,然后检查自动检测设置

运行应用生成版本会导致以下错误:“ERROR! Failed 'DepotBuild for scriptname.vdf' - status = 6.”(错误!DepotBuild for scriptname.vdf 失败。- 状态 = 6。)

可能原因:
  • 帐户没有该应用的权限。
    • 在 app_build.vdf 中检查 app ID 是否正确。
    • 检查生成版本帐户是否拥有该 app ID 的适当权限
  • Steamcmd 找不到 depot 内容。
    • 检查 app_build 脚本中的值“contentroot”是否是相对于脚本文件位置的有效路径。
    • 检查 depot_build 脚本中的值“LocalPath”是否是相对于 app_build 文件位置的有效路径。 检查该路径是否包含实际内容。

运行应用生成版本会导致以下错误:“ERROR! Failed to get application info for app NNNNN (check login and subscription)”(错误!获取应用 NNNNN 的应用程序信息(检查登录和订阅)失败)

这意味着 Steam 无法获取有关该应用的信息,因为它不存在或用户没有访问该应用的权限。
  • 检查 NNNNN 是否为您分配到的该应用的 app ID。
  • 在 app_build.vdf 中检查 app ID 是否正确。
  • 对于全新的 app ID,请检查 Steamworks 中的应用管理员配置是否已发布。 新应用应具有 Steam Pipe 安装目录和 depot,二者均可在“编辑 Steamworks 设置”下找到。安装目录在“安装”选项卡下的“通用安装”中,而 Depot 在“SteamPipe”选项卡下。 所有已发布的更改均通过“发布”选项卡发布。
  • 如果一切看起来都正确,请确保您的帐户已拥有该 app ID。

在启动时出现:“An error occurred while installing [AppName] (Invalid content configuration)”(安装 [AppName] 时发生错误(无效的内容配置))

可能原因:

我不记得 steamcmd 命令是什么或它是如何运作的

可以在 steamcmd 中使用“find”命令来搜索任何 steamcmd 命令。 该命令会对命令名进行部分匹配,并列出命令语法。
Steam>find build_installer ConVars: Commands: build_installer : <project file> <target folder> <beta key> <beta pwd>