在GPU绑定的应用程序中,我想知道CPU将在什么时候等待GPU完成渲染。 DirectX和OpenGL之间有什么不同吗?
运行一个类似于下面的示例,显然CPU不会跑掉 - 并且查看任务管理器,CPU使用率(如果它是单核心机器)将低于100%。
While (running){
Clear ();
SetBuffers (); // Vertex / Index
SetTexture ();
DrawPrimitives ();
Present ();
}
答案 0 :(得分:4)
快速摘要是你可能会在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()的内容。如果确实如此,那么你可能会在这里等。
答案 1 :(得分:0)
在Windows上,等待位于视频驱动程序中。它们在某种程度上取决于驱动程序的实现,但在很多情况下,等待的需要取决于您使用的API的要求(无论是否将调用定义为同步)。
所以是的,DirectX和OpenGL之间很可能会有所不同。