2

我有一个 WinForms 应用程序,它使用 XNA 在控件中为 3D 模型设置动画。该应用程序几个月来一直运行良好,但最近我开始在动画中遇到周期性停顿。着手调查正在发生的事情,我已经确定了以下事实:

  1. 它只发生在我的机器上,其他机器工作正常
  2. 从我的渲染循环中删除所有内容并不能改善问题

在 2. 我实际上并没有删除所有内容,我将循环限制为在我的 GraphicsDevice 上设置视口,然后执行 GraphicsDevice.Present。

为了进一步挖掘,我启动了 PIX 来捕获一些统计数据。可以在此处 (Run6)此处 (Run14)查看两次 PIX 运行的屏幕截图。Run6 使用的是我原来的渲染循环,而 Run14 使用的是基本的 Present 循环。

PIX 告诉我 GPU 正在定期做某事,我认为这是导致暂停的原因。这可能是什么原因?或者我该如何找出 GPU 实际在做什么?

更新:因为我通常相信我的代码是完美的(谁在笑?)我从头开始了一个新的 XNA 项目,看看它是否表现出相同的行为。所以开始一个新的 XNA 3.1 Windows 游戏项目并运行 PIX 我得到了这个时间线。相同的周期性停顿。所以问题必须在堆栈中较低,在 XNA 或 Direct3D 中。

所以 PIX 显示 GPU 正在处理某些事情,我可以看到在每一帧中进行的 DX 调用列表,并且时间计算显示在IDirect3DDevice9::Present调用期间(或之后)发生了暂停。

更新 2:我之前在有问题的机器上安装和卸载了 XNA 4.0 CTP。我不能确定这是否相关,但我认为重新安装 XNA Game Studio 3.1 位可能会有所作为。事实证明确实如此。

基本问题保持不变(赏金仍在增加):什么会影响 XNA 3.1(或 DirectX)使其行为如此,是否有任何用于 DirectX 和/或 GPU 级别的日志记录/跟踪工具可以阐明发生了什么吗?

注意:我在具有 8GB RAM 的 Windows 7 x64 双核机器上使用 XNA 3.1。

注意2:在此处的 XNA Creators 论坛上也发布了此问题。

4

4 回答 4

1

您可以尝试查看是否可以使用Xperf找到与您的周期性问题相近的东西,不要运行您的应用程序,而是保持打开通常在您的应用程序之外运行的程​​序。您也可以尝试在应用程序运行时再次执行此操作,但这可能会导致视图混乱。

  1. 开始跟踪,在提升的提示中执行此操作。

xperf -on BASE+LATENCY -stackWalk 配置文件

  1. 等待相当长的时间以确保问题已被追踪。

  2. 停止跟踪并像这样打开它。

xperf -d trace.etl
xperfview trace.etl

  1. 通过查看特定间隔的图表和咨询表进行分析,看看您是否可以找到与问题相关的内容,找到它的最高机会是在 DPC 和中断部分。但在 CPU 或 I/O 部分也可能有些奇怪。祝你好运!

还有更多关于Xperf 以及如何获得它的信息,希望这能带来结果。


如果没有,您也可以尝试已用于改进 DWM 的GPUView
, 它也包含在带有 Windows 性能工具包的 Xperf 旁边,因此您可以轻松地尝试两者!

日志 v

...等待相当长的时间以确保问题被追踪...

日志

gpuview 合并的.etl

如果 gpuview 内存不足,您可以尝试添加“/limit 3”或删除 v。

如果您卡在某个地方,请阅读工具的文档。

于 2010-05-28T14:19:39.660 回答
1

嗯...这似乎发生在 GPU 上,但听起来像是 CPU 垃圾收集问题。您能否运行CLR 分析器并查看是否可以看到任何与减速相关的 GC 活动峰值?

我同意这听起来不太可能,因为您可以在 PIX 中清楚地看到它,但它可能会提供有关原因的线索。

于 2010-05-21T18:54:15.617 回答
0

如果它只发生在您自己的机器上,那么它可能是驱动程序吗?请原谅我的怀疑,但它毕竟是 64 位机器:D

于 2010-05-25T21:48:50.670 回答
0

这看起来像是 vsync 问题或 GPU 在最后的挣扎。由于回到不同的版本修复了它,并且“瓶颈”在IDirect3DDevice9::Present让我们使用前一个选项。

我对 XNA 不熟悉,所以我不知道 D3D 的工作原理有多少,但是您知道您的 PresentationParameters 设置为什么吗?

具体尝试将交换效果设置为丢弃。

于 2010-05-28T14:57:37.727 回答