资源争用

时间:2010-02-25 15:17:23

标签: 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锁定顶点缓冲区并丢弃 9像素着色器/顶点着色器的更改
1 setrendertarget

谢谢!

P.S。 pix的屏幕截图

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

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

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

1 个答案:

答案 0 :(得分:1)

提供的信息会让您想到:

  • 您是否使用vsync进行双缓冲?也许他们都在等待后备缓冲器可用。尝试三重缓冲或立即演示。
  • 您是否尝试使用NOOVERWITE循环策略锁定顶点缓冲区而不是8次DISCARD?也许GPU存在太大的内存压力,无法为丢弃重新分配新的缓冲区。此外,某些硬件不允许在渲染它之前丢弃相同的顶点缓冲区X次。
  • 由于您共享相同的效果,参数是否也共享?