在受 GPU 限制的应用程序中,我想知道 CPU 将在什么时候等待 GPU 完成渲染。 DirectX 和 OpenGL 有什么不同?
运行一个类似于下面的例子,显然 CPU 不会跑掉——在任务管理器中,CPU 使用率(如果是单核机器)将低于 100%。
While (running){
Clear ();
SetBuffers (); // Vertex / Index
SetTexture ();
DrawPrimitives ();
Present ();
}
最佳答案
简要总结一下,您可能会在 Present() 中看到等待,但这实际上取决于 Present() 调用的内容。
通常,除非您特别说要通知 GPU 何时完成,否则您最终可能会在驱动程序的输入缓冲区填满(对您来说是随机的)点等待。将 GPU 驱动程序和卡视为一条很长的管道。您可以在一端投入工作,并最终在一段时间后显示出来。您可能能够在管道填满之前将几帧的命令放入管道中。该卡可能需要花费大量时间来绘制图元,但您可能会看到 CPU 在几帧之后等待某个时间点。
如果您的 Present() 调用包含相当于 glFinish() 的内容,则整个管道必须在该调用返回之前排空。因此,CPU 将在那里等待。
我希望以下内容会有所帮助:
Clear ();
使当前缓冲区中的所有像素都改变颜色,所以 GPU 正在做
工作。查找 GPU 的清晰像素/秒
率以查看这应该花费什么时间。
SetBuffers ();
SetTexture ();
司机可能会在这里做一些工作,但一般它想等到你
实际上做绘图以使用这些新数据。无论如何,GPU 不做
这里很多。
DrawPrimitives ();
现在这里是 GPU 应该完成大部分工作的地方。取决于
您将受到顶点/秒或像素/秒的限制。也许你有
昂贵的着色器,您将受到着色器指令/秒的限制。
但是,您可能不会将此视为 CPU 等待的地方。司机
可能会为您缓冲命令,并且 CPU 可能会继续运行。
Present ();
在这一点上,GPU 工作是最小的。它只是改变一个指针以从不同的缓冲区开始显示。
然而,这可能是 CPU 在 GPU 上等待的地方。根据您的 API,“Present()”可能包含 glFlush() 或 glFinish() 之类的内容。如果是这样,那么您可能会在这里等待。
关于graphics - CPU 什么时候在 GPU 上等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964856/