2010-02-25 19 views
8

在使用Pix的剖析我的应用程序,我注意到,GPU正在通过(在DX10模式)大部分时间处于空闲等待不可用的资源。 (并且是始终与CPU(例如行,如果CPU正在处理帧X中,GPU也处理帧X)针对此问题)资源争

一些注释:

1)应用程序是GPU有限(该CPU基本是空闲(CPU使用率的20%,在最重的场景))

我的问题是:

1)如何做我必须解释这些结果?在Pix的每一帧中,我会看到2-3个小红条(据我所知,意味着资源不可用),之后是中等/大灰条(即GPU闲置)。在另一侧的CPU有一些操作,一个大空栏,然后其他的一些操作(在等待着什么?)

另需注意,当GPU处于闲置状态一般的CPU正常工作。 (与此相反的是无效明显)

2)什么叫可以使资源变得不可用?

带有DISCARD的MAP被认为是阻塞呼叫?
查询获取对象的DESC?
分享着色器效果被认为是一个争用?
其他?

我的一般帧是:

41 DrawPrimitives/DrawIndexedPrimitives(最物体是实例化)
7/8锁与/像素着色器的丢弃
9变化顶点着色器
1 SetRenderTarget方法

顶点缓冲器

谢谢!

P.S. PIX的屏幕截图

http://img191.imageshack.us/img191/6800/42594100.jpg

如果我使用单个绘图调用(具有相同的GPU的负载(例如,其中x颗粒或实例化对象)的颗粒发动机),而不是完整的游戏我得到一个完整的蓝色酒吧和GPU正确CPU落后2-3帧...

编辑:我重点越来越多地影响框架,可能是这个问题的原因。我在更多的对象之间共享一个效果来节省内存和创建它们的时间。这是安全的假设没有争议?

+0

嗡嗡声,运行pix,你能不能隔离哪个调用强制刷新? – Bahbar 2010-03-09 17:08:10

回答

1

什么带有所提供的信息介意:

  • 你使用双缓冲与垂直同步?也许他们都在等待backbuffer成为可用。尝试三重缓冲或即时演示。
  • 您是否尝试过用NOOVERWITE循环策略而不是8次DISCARD锁定顶点缓冲区?也许GPU有太多的内存压力来为你的丢弃重新分配一个新的缓冲区。此外,某些硬件在渲染它的东西之前不允许放弃X倍以上的相同顶点缓冲区。
  • 由于您正在共享相同的效果,参数是否也共享?
+0

1)尝试所有类型,立即/双/三重缓冲。没有变化 2)我在最大每帧丢弃一次缓冲区。 (有8个缓冲区) 3)Mhn .... nope,参数是分开的,因为它们是独立的逻辑类。 – feal87 2010-03-03 11:26:55