资源争用

fea*_*l87 8 c# c++ directx

在使用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使用discard锁定顶点缓冲区
9更改像素着色器/顶点着色器
1 setrendertarget

谢谢!

PS截图pix

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

如果我使用单个绘制调用(具有相同的gpu负载(例如具有x粒子或实例化对象的粒子引擎))而不是完整的游戏,我得到一个完整的蓝色条和GPU正确2-3帧后面的CPU ...

编辑:我越来越关注效果框架可能是这个问题的原因.我在更多对象之间共享一种效果,以节省内存和创建它们的时间.在没有争用的情况下可以安全地假设吗?

Coi*_*oin 1

根据所提供的信息想到什么:

  • 您是否在垂直同步中使用双缓冲?也许他们都在等待后台缓冲区变得可用。尝试三重缓冲或立即呈现。
  • 您是否尝试过使用 NOOVERWITE 循环策略而不是 8 次 DISCARD 来锁定顶点缓冲区?也许 GPU 的内存压力太大,无法为您的丢弃重新分配新的缓冲区。此外,某些硬件不允许在渲染其内容之前丢弃相同的顶点缓冲区超过 X 次。
  • 既然共享相同的效果,参数也共享吗?