我有一个 WinForms 应用程序,它使用 XNA 在控件中为 3D 模型设置动画。该应用程序几个月来一直运行良好,但最近我开始在动画中遇到周期性停顿。着手调查正在发生的事情,我已经确定了以下事实:
- 它只发生在我的机器上,其他机器工作正常
- 从我的渲染循环中删除所有内容并不能改善问题
在 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 论坛上也发布了此问题。