c# - 资源争用

标签 c# c++ directx

在使用 Pix 分析我的应用程序时,我注意到 GPU(在 DX10 模式下)大部分时间都处于空闲状态,等待资源不可用。 (而且总是和CPU排成一行(比如CPU在处理X帧,GPU也在处理X帧)针对这个问题)

注意事项:

1) App受GPU限制(CPU基本闲置(最重场景20%的CPU使用率))

我的问题是:

1) 我该如何解释这些结果?在 Pix 中,GPU 端的每一帧我都看到 2-3 个红色小条(据我所知表示资源不可用),然后是中/大灰色条(表示 GPU 空闲)。另一边的 CPU 有一些操作,一个大空条,然后是一些其他操作(在等待什么?)

另外请注意,当 GPU 空闲时,通常 CPU 正在工作。 (反之显然无效)

2) 哪些调用可以使资源变得不可用?

带有 DISCARD 的 MAP 被认为是阻塞调用?
获取对象的 DESC 的查询?
共享一个Shader Effect算不算争用?
还有什么?

我的一般框架是:

41个DrawPrimitives/DrawIndexedPrimitives(大多数对象都是实例化的)
7/8 使用丢弃锁定顶点缓冲区
9 改变像素着色器/顶点着色器
1 设置渲染目标

谢谢!

附言pix截图

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

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

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

最佳答案

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

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

关于c# - 资源争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2335078/

相关文章:

delphi - 更改 DrawTextLayout 的 DWriteMeasuringMode

c# - 扩展方法不更新自身

c# - 如何在 VS08 中使用 ruby​​ 编译器(用于 LESS CSS)?

c# - 如何在 ASP.NET 的所有页面中维护 session ?

c# - EnableCors C# .NET 核心 3

c++ - std::vector.size() 不工作

c++ - RcppArmadillo faSTLm 结果与 R 的 lm 不同,我做错了什么?

c++ - 在派生类中绑定(bind)非静态模板化成员函数

directx - WinRT 中的公共(public)值结构

c# - NV_STEREO_IMAGE_SIGNATURE 和 DirectX 10/11(nVidia 3D Vision)