使用本主题查找核心旋转及没有做有用工作的区域。 旋转时间很短在某些情况下是有益的,比如只需等待很短时间就能得到的数据。 但是,当需要执行有用的操作时,长时间段的旋转是一种浪费。
Xbox 性能调查器 (PIX)
在所有可能旋转代码部分的周围创建一个Xbox的性能调查器 (PIX) 事件是很有用的。 可以通过在代码中使用PixBeginEvent 和 PixEndEvent来实现这一点。
使用以下步骤来研究PIX中的旋转线程。
从常用步骤主题中的信息入手,创建定时捕获。
聚焦在 范围详情 并确保 要显示的项目 设置为 PIX 事件(CPU)。
使用范围详情 顶部的搜索框以筛选出仅旋转事件。 在这种情况下,它的标签为
Spin
,如图 1 所示。图 1. 显示标题旋转时添加PIX标记后出现的事件列表
查看每个实例的 持续时间 和 执行 列。 选择列的标题,通过该值对事件进行排序。
在图1中,高亮事件的持续时间为219毫秒,执行时间为111微秒(μs)。
- 持续时间指事件活跃的总时间,包括线程停顿的时间。
- 执行是指该事件活跃的总时间,以及该线程在核心上执行的时间。
- 停止是另一种查看线程没有执行的事件持续时间的方法。
- 更糟糕的情况是图 1 顶部所示的
Spin
事件。 该事件执行了86毫秒,此外还有344毫秒的停顿。 CPU核心在旋转循环中执行了整整86毫秒。 这浪费了本可用于执行其他任务的时间。
Windows Performance Analyzer (WPA)
如果要确定游戏可能在 Windows 性能分析器(WPA)中旋转的区域,所有代码可能旋转的位置都应该放在一个非内联函数中,以便进行剖析构建。 这样就很容易判断旋转是否花费过多时间。 因为标题是旋转的,没有进行上下文切换,因此必须使用采样数据。 如果标题在使用 SwitchToThread在线程间快速切换,请按照主题 高上下文切换率。
从常见步骤主题中的信息开始,创建一个事件跟踪日志 (ETL) 文件。
如主题通用步骤中所述,使用 ThreadSpinning.wpaProfile WPA 配置文件。 图 2 显示新的分析选项卡的外观。
图 2. 显示
ThreadSpinning
WPA 配置文件的默认视图权重百分比%列显示数据表中每行样本的百分比。 这与函数所花费的总时间量高度相关,如图 3 所示。
图 3. 按“进程”、“堆栈窗口”显示CPU使用情况(采样)利用率,其中
FindingThreadingIssues
进程采样数据占83%使用数据表堆叠列的上下文菜单中的“在列中查找...”命令,通过右键单击该列来查找任何已知的旋转函数。 查看权重百分比%一列来确定是否花费过多时间旋转,如图 4 所示。
图 4. 显示占示例 37% 的旋转函数
SpinFunc
的调用堆叠的走势情况