周期性GPU性能问题

时间:2010-05-21 12:27:43

标签: performance xna gpu pix

我有一个WinForms应用程序,它使用XNA为控件中的3D模型设置动画。该应用程序几个月来一直很好,但最近我开始经历动画中的周期性暂停。开始调查发生了什么我确定了这些事实:

  1. 它仅在我的机器上发生,其他机器正常工作
  2. 从渲染循环中删除所有内容不会改善问题
  3. 在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。

    Note2:也在XNA Creators论坛here上发布了此问题。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

      

    xperf -on BASE + LATENCY -stackWalk Profile

  2. 等待相当长的时间以确保跟踪问题。

  3. 停止跟踪并按此打开。

      

    xperf -d trace.etl
      xperfview trace.etl

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

  5. 还有关于Xperf and how to obtain it的更多信息,希望这会带来结果。


    如果没有,您可以尝试使用已用于改进DWM的GPUView
    这也包含在Xperf旁边的Windows Performance Toolkit中,因此您可以轻松地尝试这两种方法!

      

    log v

         

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

         

    日志

         

    gpuview merged.etl

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

    如果你被卡在某处,请阅读这些工具的文档。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这看起来像是vsync问题或GPU的最后阵痛。由于回到另一个版本修复它,并且“瓶颈”在IDirect3DDevice9::Present中,让我们选择前一个选项。

我不熟悉XNA,所以我不知道有多少D3D的工作方式,但你知道你的PresentationParameters设置了什么吗?

特别尝试将交换效果设置为Discard。