2010-05-21 63 views
2

我有一个WinForms应用程序,它使用XNA在控件中为3D模型设置动画。该应用在数月内一直很好,但最近我开始在动画中经历周期性暂停。设置以调查发生了什么事我已经建立了这些事实:定期GPU性能问题

  1. 它发生在我的机器上只,其他机器工作正常
  2. 删除一切从我的渲染循环不提高的问题

在2.我没有实际删除的一切,我限制了我的循环来设置我的GraphicsDevice上的视口,然后做一个GraphicsDevice.Present。

试图进一步挖掘我激发了PIX捕获一些统计数据。两个PIX运行的屏幕截图可以查看here (Run6)here (Run14)。 Run6使用我的原始渲染循环,而Run14使用裸露的Present循环。

PIX告诉我,GPU是定期做东西,我认为这是导致暂停。这可能是什么原因?或者我该如何去了解GPU究竟在做什么?

更新:因为我通常相信我的代码是完美的(谁在笑?)我从头开始一个新的XNA项目,看它是否展现出相同的行为。因此,启动一个新的XNA 3.1 Windows游戏项目并运行PIX我得到this timeline。相同的周期性暂停。所以在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创建者论坛here

回答

1

你可以尝试看看你是否可以找到Xperf接近你的定期问题的东西,不要运行你的应用程序,但保持程序打开除了应用程序之外,它通常会运行。您也可以尝试在应用程序运行时再次执行此操作,但可能会产生混乱的视图。

  1. 开始追踪,在提示提示下执行此操作。

    xperf -on BASE +潜伏期-stackWalk简介

  2. 等待了相当数量的时间,以确保该问题跟踪。

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

    xperf -d trace.etl
    xperfview trace.etl

  4. 通过观察图表和咨询具体的间隔表的分析,看看你是否能找到的东西,是关系到问题,找到它的最高机会将在DPC和中断部分。但是在CPU或I/O部分也可能有些奇怪。祝你好运!

关于Xperf and how to obtain it的更多信息,希望能够提供结果。


如果没有,则可以选择尝试GPUView已用于改善DWM,
这也包含旁边Xperf与Windows性能工具包让您可以轻松尝试两个!

日志v

...等待了相当数量的时间,以确保该问题被跟踪......

日志

gpuview merged.etl

在gpuview内存不足的情况下,您可以尝试添加“/ limit 3”或删除v。

如果卡住某处,请阅读工具的文档。

+0

+1 yay为xperf工具!这非常有用! – 2010-05-28 15:29:10

1

嗯...这似乎是发生在GPU上,但它听起来像一个CPU垃圾收集问题。你可以运行CLR profiler,看看你是否可以看到GC活动的任何峰值,你可以关联到减速?

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

+0

同意GC是一个可能性,我做了一些测试,但他们没有发现可疑的行为。另外,裸露的循环实际上并没有什么实质性的东西,只有一个用于本次调用的矩形...... – 2010-05-21 23:40:58

0

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

+0

XNA FX和Direct3D在Windows 7 x64上运行良好 - 至少使用ATI GPU(我假设NVIDIA相同)。 – 2010-05-25 22:37:10

+0

如前所述,渲染在相同的驱动程序上工作正常,这就是为什么我现在倾向于责备XNA 4.0 CTP。但是,是的,我安装了一个更新的gfx驱动程序,但没有解决问题。 – 2010-05-26 06:28:59

0

这看起来像是vsync问题还是GPU在最后的阵痛。由于回到不同的版本修复了它,并且在IDirect3DDevice9::Present中的“瓶颈”让我们继续前面的选项。

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

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

+0

好吧,最后一次测试中的XNA层非常薄,每帧渲染只包含5个以IDirect3DDevice9 :: Present(NULL,NULL,NULL,NULL)结尾的DX调用。 – 2010-05-28 15:28:18

+0

在互联网上进行了一次快速检查以获取XNA术语,并且它看起来像PresentationParameters作为GraphicsDevice构造函数的最后一个参数传入。它看起来并不像你可以在4.0中改变交换效果,即使它在3.1中可用。尝试将您的PresentParameters上的PresentInterval设置为Immediate。请参阅http://msdn.microsoft.com/en-us/library/ff433790(v=XNAGameStudio.40).aspx和http://msdn.microsoft.com/en-us/library/microsoft.xna.framework。 graphics.presentinterval(v = XNAGameStudio.40).aspx – 2010-05-28 18:33:56

+0

就像一个参考:交换效果现在是名为PresentationInterval的PresentationParameters类的成员(请参阅http://msdn.microsoft.com/zh-cn/library/microsoft .xna.framework.graphics.presentationparameters_members(v = XNAGameStudio.40).aspx和http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.presentinterval(v=XNAGameStudio.40)的.aspx)。 – 2010-05-30 12:13:29