使用Direct3D时,CPU上会进行多少数学计算?

3

背景:我刚开始入门,甚至没有接触Direct3D 11 API,而是试图理解管道等。

从文档和网上流传的信息来看,似乎一些计算由应用程序处理。也就是说,计算不仅仅是将矩阵呈现给GPU进行乘法运算,而是由在CPU上操作的数学库进行计算。我没有特别的资源可以指向,尽管我想我可以指向XNA Math Library或2月份DX SDK中提供的示例。当你看到像mViewProj = mView * mProj;这样的代码时,这个投影是在CPU上计算的。或者我错了吗?

如果您正在编写一个程序,在屏幕上可以有10个立方体,可以移动或旋转立方体,以及视点,那么您会在CPU上进行哪些计算?我认为我会存储一个单独的立方体的几何形状,然后变换表示实际实例的矩阵。然后,似乎我会使用XNA数学库或其他我选择的库来在模型空间中变换每个立方体。然后得到世界空间中的坐标。然后将信息推送到GPU。

这在CPU上需要进行相当多的计算。我错了吗?

  • 我是不是基于太少的信息和理解得出结论的?
  • 如果答案是STFW,我应该搜索什么术语?
  • 或者如果我是对的,为什么这些计算没有被推送到GPU?

编辑:顺便说一句,我没有使用XNA,但文档指出XNA数学库取代了以前的DX数学库。(我将SDK中的XNA库视为一个纯粹的模板库)。

1个回答

4
“我是否基于过少的信息和理解得出结论?”
这并不是什么坏事,我们都会这样做,但简单回答是:是的。
GPU 所执行的任务通常取决于 GPU 驱动程序和您的访问方式。大多数情况下,您真的不需要关心或知道这些(除了好奇心和一般的理解)。
对于 mViewProj = mView * mProj; 这个公式,它很可能在 CPU 上执行。但它并不会产生太大的负担(最多计算 100 次周期)。真正的技巧在于将新的视图矩阵应用于“世界”上。每个顶点需要进行变换,并伴随着着色、纹理、光照等等。所有这些工作都将在 GPU 中完成(如果在 CPU 上完成,事情将变得非常缓慢)。
通常情况下,您对世界进行高级别的更改,例如 20 个 CPU 绑定的计算,而 GPU 则负责根据这些更改渲染世界所需的数以百万计或十亿计的计算。
以您的 10 个立方体为例:您为每个立方体提供一个变换,您创建变换所需的任何数学运算都是 CPU 绑定的(有例外情况)。您还为视图提供一个变换,同样地,创建变换矩阵可能是 CPU 绑定的。一旦您拥有了 11 个新矩阵,就将它们应用到世界中。从硬件角度来看,这 11 个矩阵需要被复制到 GPU 中……这将非常快速……一旦复制完成,CPU 就完成了任务,GPU 根据新数据重新计算世界,将其渲染到缓冲区并显示在屏幕上。因此,对于您的 10 个立方体,CPU 绑定的计算量是微不足道的。
查看一些 XNA 项目的反射代码,您将看到您的计算何时结束以及 XNA 何时开始(XNA 将尽其所能在 GPU 中完成所有工作)。

通常情况下,您会对世界进行高级别的更改,可能包括20个CPU绑定计算。即使是更复杂的场景,您也会重新设计数学库(例如将CPU绑定计算推送到GPU上)吗?还是说高数量的CPU绑定计算只是一个有缺陷的设计?(另外,请注意我的编辑,使用的是C++而不是C# + XNA)。 - user346582
使用CPU并不是邪恶的:在现代双核CPU上,您可以执行的CPU计算数量仍然可以保持60 FPS(对于良好用户体验的最低目标FPS,依我之见),而且随着64位、6核、12线程3.5GHz CPU的出现,价格低于1000美元,这只会变得更好。当然,允许的CPU时间百分比完全取决于您。有几个库可以将一般计算推送到GPU上进行处理,请参见:https://dev59.com/mnM_5IYBdhLWcg3wvF3J。使用GPU作为数学协处理器绝对是未来趋势。 - Rusty
我不认为 CPU 是邪恶的,但我觉得有关渲染图形的计算被留给了 CPU,这很奇怪,而现在有一个尖端趋势是将这些计算移动到加速渲染的设备上。无论如何,确认 CPU 上的计算结果是好的。感谢您抽出时间回答我的问题。 - user346582
@zirgen:"很奇怪...留给CPU"。直到不久以前,你没有选择...一切都在CPU上发生。某个平台上的操作方式总是受平台历史的影响,有时(大多数情况下)历史会胜过“正确的方法”。...干杯 - Rusty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接