Table of Contents

性能分析

入门 程序员

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

性能分析

使用 Stride Game Profiler 脚本进行分析

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

运行时的分析器

要使用该脚本:

  1. 在资产视图中,单击 添加新资产按钮 并选择 Scripts > Game Profiler。

    添加 Game Profiler 脚本

  2. 新建脚本对话框随即打开。保留默认信息并单击创建脚本。

    新建脚本

    Game Studio 会将 GameProfiler 脚本添加到你的项目中。

  3. 将脚本添加到实体。有关说明,请参阅使用脚本。

  4. 选择包含 GameProfiler 的实体。

  5. 在属性网格(默认位于右侧)中,启用 Game Profiler 组件。

    启用组件

    Tip

    你也可以在运行时使用 Left Ctrl + Left Shift + P 启用和禁用分析器。

  6. 运行游戏。

    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 的结果

顶部一行显示基本性能信息。

FPS 性能分析

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

如果你选择 CPU 作为显示模式,分析器将显示:

CPU 性能分析

  • Total:当前使用的内存量
  • Peak:游戏启动以来的内存使用峰值
  • Allocations:自分析器上次刷新以来分配或释放的内存量
  • Gen0、Gen1、Gen1:每代对象的垃圾回收次数(Gen0 是最新的代)

如果你选择 GPU 作为显示模式,分析器将显示:

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 具有强大的内置性能分析工具,可以识别常见的性能问题。

  1. 在 Visual Studio 中,打开你的项目解决方案(.slnx/.sln)文件。

  2. 要打开分析器,请按 Alt + F2,或在任务栏中单击分析 > 性能分析器(Analyze > Performance Profiler)。

    启动 Visual Studio 分析器

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

    启动 Visual Studio 分析器

    你可以同时运行多个性能分析工具。

  4. 要启动分析器,请在性能分析器选项卡底部单击 Start。

    分析器 Start 按钮

    Visual Studio 将运行你的应用程序并开始分析。

有关 Visual Studio 分析器的更多信息,请参阅 MSDN 文档。

使用 RenderDoc

RenderDoc 是一款免费的 MIT 许可独立图形调试器,支持在 Windows、Linux、Android 或 Nintendo Switch™ 上对任何使用 Vulkan、D3D11、OpenGL & OpenGL ES 或 D3D12 的应用程序进行快速便捷的单帧捕获和详细检查。

  1. 下载 RenderDoc。

  2. 可选:此步骤是可选的,仅当你要让渲染通道(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();
    
  3. 可选:添加对 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),而不是独立的纹理

另请参阅