【问题标题】:Resource Contention资源争用
【发布时间】:2010-02-25 15:17:23
【问题描述】:

在使用 Pix 分析我的应用程序时,我注意到 GPU 大部分时间都在闲置(在 DX10 模式下)等待资源不可用。 (并且始终与 CPU 对齐(例如,如果 CPU 正在处理帧 X,GPU 也在处理帧 X)对于这个问题)

一些注意事项:

1) 应用受 GPU 限制(CPU 基本处于空闲状态(在最繁重的场景中占 CPU 使用率的 20%))

我的问题是:

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

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

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

带有 DISCARD 的 MAP 是否被视为阻塞调用?
获取对象 DESC 的查询?
共享着色器效果被视为争用?
还有什么?

我的总体框架是:

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

谢谢!

附: pix截图

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

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

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

【问题讨论】:

  • 哼,运行 pix,你能不隔离哪个调用在强制刷新吗?

标签: c# c++ directx


【解决方案1】:

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

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

【讨论】:

  • 1) 尝试了所有类型,立即/双/三缓冲。没有变化 2)我每帧最多丢弃一次缓冲区。 (有 8 个缓冲区) 3) Mhn....不,参数是独立的,因为它们是独立的逻辑类。
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2016-03-27
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多