2009-12-27 109 views
4

在一個GPU綁定的應用程序中,我想知道CPU將在GPU上等待什麼時候完成渲染。 DirectX和OpenGL有什麼不同?CPU何時在GPU上等待?

運行一個類似於下面的例子,顯然CPU不會跑掉 - 並且在任務管理器中查看CPU使用率(如果它是單核心機器)將低於100%。

While (running){ 

    Clear(); 

    SetBuffers(); // Vertex/Index 

    SetTexture(); 

    DrawPrimitives(); 

    Present(); 
} 
+0

如果不知道你在詢問什麼操作系統,就不能回答這個問題 – 2009-12-27 01:23:26

+0

那會是windows-XP向上的 – 2009-12-27 01:30:25

回答

4

快速總結是,您可能會在Present()中看到等待,但它確實取決於Present()調用的內容。一般情況下,除非你明確說你需要注意GPU何時完成,否則最終可能會等待(隨機)你的驅動程序的輸入緩衝區填滿。將GPU驅動程序&卡想象成非常長的管道。你可以在一端工作,並在一段時間後出現在顯示器上。在填充之前,您可能能夠將幾幀的命令放入管道中。該卡可能需要花費很多時間繪製原始圖元,但您可能會看到CPU在幾幀後的某個點處等待。

如果您的Present()調用包含glFinish()的等價物,那麼整個管道必須在該調用返回之前耗盡。所以,CPU將在那裏等待。

希望下面可以幫助:

Clear(); 

導致當前緩衝區中的所有像素變色,所以GPU做 工作。查看你的GPU的清晰pix /秒的速率,看看這應該是什麼時間。

SetBuffers(); 
SetTexture(); 

駕駛員可以在這裏做了一些工作,但一般要等到你 其實並繪製使用這個新的數據。在任何情況下,GPU在這裏都不會做 。

DrawPrimitives(); 

現在這裏是在GPU應該做的大部分工作。根據原始大小,您將受頂點/秒或像素/秒的限制。也許你有 昂貴的着色器,你會受到着色器指令/秒的限制。

但是,您可能不會將此視爲CPU正在等待的位置。驅動程序 可能會爲您緩衝這些命令,並且CPU可能會繼續運行。

Present(); 

此時,GPU的工作量很小。它只是改變一個指針開始從不同的緩衝區顯示。

但是,這可能是出現到CPU的位置,以等待它在GPU上。根據你的API,「Present()」可能包含諸如glFlush()或glFinish()之類的東西。如果是這樣,那麼你可能會在這裏等。

0

在Windows上,等待在視頻驅動程序中。它們在某種程度上取決於驅動程序的實現,儘管在很多情況下,根據您使用的API的要求(不管是否將調用定義爲同步),需要等待。

所以是的,DirectX和OpenGL很可能不一樣。