Table of Contents

编译着色器

入门 程序员

Stride 会将 Stride 着色器(sdsl 和 .sdfx 文件)转换为图形平台所使用的着色器语言。

平台 着色器语言
Direct3D HLSL
Vulkan SPIR-V

Stride 可以在运行时(游戏运行时)或构建时(编辑器构建游戏资产时)转换着色器。当 Stride 在运行时生成着色器时,渲染会停止,直到着色器编译完成。在发布版本中,你通常希望避免这种情况——尤其是在 CPU 资源较少的移动平台上,停顿会更加明显。

Stride 如何在运行时转换着色器

Stride 无法预先知道运行时会使用哪些着色器。这是因为用户可能通过更改材质参数或从脚本修改后处理效果参数等方式生成新的着色器变体。此外,最终的着色器还取决于执行平台的图形特性。

  1. 当 Stride 在运行时需要新的着色器时,它会检查数据库,查看该着色器是否已经转换过。如果数据库中已有该着色器,Stride 就直接使用它。

  2. 如果该着色器尚未转换,Stride 会编译它——在本地(设备上)或远程(在 Game Studio 中)进行,具体取决于包的 User Settings(见下文)。

  3. 如果包的 User Settings 中启用了 Record used effects(见下文),Stride 会通知 Game Studio 它需要一个新的着色器。

  4. Game Studio 会通知你有新的着色器需要导入。

    新效果

    在 Asset View 中,Import effects 按钮变为可用。

    导入效果

  5. 如果你点击 Import effects,Game Studio 会更新 Effect Log(如果不存在则创建它),并将它们添加到游戏数据库中,供下次构建时使用(见步骤 1)。

    效果日志

更改 Stride 编译着色器的方式

  1. 在 Game Studio 的 Solution Explorer 中,选择包并点击 Package properties。

    包属性按钮

  2. 在 Property Grid 中设置属性。

    包属性

Effect compiler 属性指定如何编译着色器。

  • Local:在设备上转换着色器。推荐用于游戏的发布版本。

  • Remote:在开发者机器上转换着色器。发布版本不应使用此方式,因为它无法连接到开发者机器。

  • LocalOrRemote:在开发者机器上转换着色器;如果失败,则尝试在设备上转换。与 Remote 设置一样,它对发布版本没有用处。

  • None:不转换着色器。注意,如果应用需要数据库中没有的着色器,程序将会崩溃。目前,使用此功能并不会为应用节省任何空间,因此没有使用优势。不过,它可用于确保数据库中包含每一个着色器;如果游戏崩溃,你就知道数据库至少缺少一个着色器。

如果你启用了 Record used effects,Game Studio 会在需要时立即将新着色器添加到 Effect Log 中。我们建议在游戏的发布版本中禁用它,因为它无法连接到开发者机器。

为 iOS 开发时远程编译着色器

由于 iOS 设备无法直接连接到 PC,要为 iOS 开发时远程转换 Stride 着色器,你需要使用一个 Python 脚本作为设备、Mac 和开发者 PC 之间的中继。

  1. 确保你的 PC 和 Mac 连接到同一网络。

  2. 在 Mac 上安装 Python。你可以从 Python 官网下载 Python。

  3. 下载并解压 ios-tcreplay.zip。

  4. 打开 Terminal,导航到解压文件所在的文件夹,然后执行 stride-ios-relay.py MyPcName,其中 MyPcName 是你的开发者 PC 的名称。

    Tip

    要查找开发者 PC 的名称,在 PC 上按 Windows 键,输入 About,然后按 Enter。PC 名称列在 PC name 下方。

现在 iOS 设备应该可以通过你的 Mac 与 PC 通信,从而远程构建着色器了。

错误信息

在运行游戏时,你可能会在 Visual Studio 的输出窗格中看到以下错误:

[RouterClient]: Error: Could not connect to connection router using mode Connect. System.AggregateException: One or more errors occurred. ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:31254