性能分析
入门 程序员
你可以分析项目的运行时性能并找出问题。使用 Stride 的 Game Profiler 脚本或外部性能分析工具,例如 Visual Studio 中的性能分析器(Performance Profiler)。

使用 Stride Game Profiler 脚本进行分析
Game Profiler 脚本会显示性能开销在运行时的变化。这有助于隔离瓶颈并找出其原因。

要使用该脚本:
在资产视图中,单击
并选择 Scripts > Game Profiler。
新建脚本对话框随即打开。保留默认信息并单击创建脚本。

Game Studio 会将 GameProfiler 脚本添加到你的项目中。
将脚本添加到实体。有关说明,请参阅使用脚本。
选择包含 GameProfiler 的实体。
在属性网格(默认位于右侧)中,启用 Game Profiler 组件。

Tip
你也可以在运行时使用 Left Ctrl + Left Shift + P 启用和禁用分析器。
运行游戏。
Game Profiler 会在游戏运行时显示分析结果。
Note
Game Profiler 会禁用垂直同步(VSync)。这能为你提供真实的分析数值,排除同步时间的影响。
Game Profiler 属性
要更改 Game Profiler 属性,请选择 GameProfiler 实体并使用属性网格。

| 属性 | 说明 |
|---|---|
| Filter | 分析器显示的信息类型(仅 FPS、CPU 或 GPU)。在运行时,使用 F1 更改。 |
| Sort by | 结果页面的排序方式: Name:分析键(被分析的对象) Time:耗时最多的键 在运行时,使用 F2 切换。 |
| Refresh interval (ms) | 分析器获取并显示新结果的频率。在运行时,使用 - / + 控制。 |
| Display page | 显示的结果页面。在运行时,使用数字键跳转到某个页面,或使用 F3 和 F4 前后翻页。 |
| Text color | 分析器文本的颜色 |
| Priority | 参见调度和优先级 |
理解 Game Profiler 的结果
顶部一行显示基本性能信息。

Displaying:分析器显示的信息类型(仅 FPS、CPU 或 GPU)Frame:当前帧Update:自分析器上次刷新以来更新游戏所花费的平均时间(毫秒)Draw:自分析器上次刷新以来渲染该帧所花费的平均时间(毫秒)FPS:每秒渲染的平均帧数
如果你选择 CPU 作为显示模式,分析器将显示:

Total:当前使用的内存量Peak:游戏启动以来的内存使用峰值Allocations:自分析器上次刷新以来分配或释放的内存量Gen0、Gen1、Gen1:每代对象的垃圾回收次数(Gen0是最新的代)
如果你选择 GPU 作为显示模式,分析器将显示:

Device:图形设备(制造商描述)Platform:当前使用的后端(Direct3D 或 Vulkan)Profile:游戏的特性级别,在游戏设置 > 渲染中设置(参见游戏设置)Resolution:游戏分辨率Drawn triangles:每帧绘制的三角形数量Draw calls:每帧的绘制调用数量Buffer memory:分配给缓冲区的内存量Texture memory:分配给纹理的内存量
在 GPU 和 CPU 模式下,分析器会显示被分析的代码部分的信息,包括活动脚本。

Note
每个值描述的是自上次分析器刷新以来每帧的事件。
| 列 | 说明 |
|---|---|
TOTAL |
执行一帧中代码所花费的总时间 |
AVG/CALL |
执行单次代码调用所花费的平均时间 |
MIN/CALL |
执行单次代码调用所花费的最短时间 |
MAX/CALL |
执行单次代码调用所花费的最长时间 |
CALLS |
一帧中代码被执行的次数 |
MARKS |
每帧中被标记的代码被执行的次数。仅当被标记的代码被执行时才显示此列 |
PROFILE KEY / EXTRA INFO |
被分析的代码部分(如函数或脚本)。此列还显示附加信息,例如受影响的实体数量。 |
Game Profiler 运行时控制
你可以使用键盘快捷键在运行时更改 Game Profiler 设置。
| 操作 | 控制方式 |
|---|---|
| Left Ctrl + Left Shift + P | 启用/禁用分析器 |
| F1 | 在 CPU、GPU 和仅 FPS 结果之间切换 |
| F2 | 在按分析键排序和按时间排序之间切换 |
- / + | 减慢/加快刷新时间 F3 / F4 | 向后翻页 / 向前翻页 数字键 | 跳转到某个页面
在代码中使用 Game Profiler
启用分析:
GameProfiler.EnableProfiling();仅对指定的分析键启用分析:
GameProfiler.EnableProfiling(true, {mykey1,mykey2});除指定的分析键外都启用分析:
GameProfiler.EnableProfiling(false, {mykey1,mykey2});要访问脚本的分析键,请使用 ProfilingKey。
使用外部性能分析工具
除了使用 Stride Game Profiler,你还可以使用外部性能分析工具来分析项目。
| 分析器 | 类型 | 平台 |
|---|---|---|
| Visual Studio profiler | Visual Studio 功能 | 桌面和移动 |
| Xamarin Profiler | 随 Xamarin Studio 分发的独立工具 | 移动 |
| RenderDoc | 独立工具 | 桌面和移动 |
使用 Visual Studio 分析器
Visual Studio 具有强大的内置性能分析工具,可以识别常见的性能问题。
在 Visual Studio 中,打开你的项目解决方案(
.slnx/.sln)文件。要打开分析器,请按 Alt + F2,或在任务栏中单击分析 > 性能分析器(Analyze > Performance Profiler)。

在 Profiler 窗口中,选择要运行的性能分析工具。

你可以同时运行多个性能分析工具。
要启动分析器,请在性能分析器选项卡底部单击 Start。

Visual Studio 将运行你的应用程序并开始分析。
有关 Visual Studio 分析器的更多信息,请参阅 MSDN 文档。
使用 RenderDoc
RenderDoc 是一款免费的 MIT 许可独立图形调试器,支持在 Windows、Linux、Android 或 Nintendo Switch™ 上对任何使用 Vulkan、D3D11、OpenGL & OpenGL ES 或 D3D12 的应用程序进行快速便捷的单帧捕获和详细检查。
下载 RenderDoc。
可选:此步骤是可选的,仅当你要让渲染通道(render pass)标记的名称与图形合成器保持一致时才需要执行:
2.1. 在你的可执行项目(Windows)中,找到
game.Run();并在之前插入以下代码:game.GraphicsDeviceManager.DeviceCreationFlags |= DeviceCreationFlags.Debug;Note
如果你遇到类型为
DXGI_ERROR_SDK_COMPONENT_MISSING的SharpDXException,请按照 https://docs.microsoft.com/en-us/windows/uwp/gaming/use-the-directx-runtime-and-visual-studio-graphics-diagnostic-features 中的说明操作2.2. 同时,通过在任意游戏脚本中调用以下代码来确保分析器已启用:
GameProfiler.EnableProfiling();可选:添加对
Stride.Graphics.RenderDocPlugin的包引用。然后你可以使用 @'Stride.Graphics.RenderDocManager' 类来触发捕获:
var renderDocManager = new RenderDocManager(); renderDocManager.StartFrameCapture(GraphicsDevice, IntPtr.Zero); // 一些渲染代码…… renderDocManager.EndFrameCapture(GraphicsDevice, IntPtr.Zero);
常见瓶颈
由于 CPU 和 GPU 处理不同类型的数据,通常很容易确定是哪一部分导致了瓶颈。
大多数 GPU 问题都出现在应用程序使用开销较大的渲染技术时,例如后期效果、光照、阴影和曲面细分。要识别问题,请禁用渲染特性。
如果问题似乎出在 CPU 瓶颈上,请降低场景的复杂度。
对于图形:
对于纹理:
- 在较慢的设备上使用压缩纹理
- 使用精灵表(sprite sheet),而不是单独的图像
- 使用纹理图集(texture atlas),而不是独立的纹理