我有一个WinForms应用程序,它使用XNA为控件中的3D模型设置动画。该应用程序几个月来一直很好,但最近我开始经历动画中的周期性暂停。开始调查发生了什么我确定了这些事实:
在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上发布了此问题。
答案 0 :(得分:1)
嗯......这似乎发生在GPU上,但它听起来像CPU垃圾收集问题。您可以运行CLR profiler并查看是否可以看到GC活动中可能与减速相关的任何峰值?
我同意这听起来不太可能,因为你可以在PIX中清楚地看到它,但它可能提供了一个关于原因的线索。
答案 1 :(得分:1)
您可以尝试查看是否可以找到与您的定期问题接近的Xperf内容,不要运行您的应用程序,但保持程序打开,除了您的应用程序之外通常会运行。您也可以尝试在应用程序运行时再次执行此操作,但它可能会给出一个混乱的视图。
开始跟踪,在高架提示下执行此操作。
xperf -on BASE + LATENCY -stackWalk Profile
等待相当长的时间以确保跟踪问题。
停止跟踪并按此打开。
xperf -d trace.etl
xperfview trace.etl
通过查看特定时间间隔的图表和咨询表进行分析,看看是否能找到与问题相关的内容,找到它的最高机会将出现在DPC和中断部分。但它可能在CPU或I / O部分有些奇怪。祝你好运!
还有关于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。