graphics - CPU 什么时候在 GPU 上等待?

标签 graphics hardware

在受 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/

相关文章:

java - bluebird 上的 JFrame 太小 (MAC)

c++ - 如何使用 GDI+ 绘制具有填充颜色的(贝塞尔曲线)路径?

hardware - 同时读取多个文件是个好主意吗?

安卓硬件调试

c# - 从扫描仪(类似键盘)设备获取输入字符串 C# .net

javascript - 形状内文本环绕的算法

graphics - 我应该为粒子引擎可编写脚本的引擎设计什么样的语言?

networking - 在 CRC 错误的情况下切换表

security - 7 遍或 35 遍删除如何工作?为什么要使用这些方法?

c# - 基本的二维图形库