Re: [程式] CPU會等GPU嗎?

作者: justinlcs (班班)   2014-06-11 21:12:50
※ 引述《lovesnake (LoyalDog)》之銘言:
: ※ 引述《justinlcs (班班)》之銘言:
: : ^^^^^^^^
: : interrupt
: : 看你程式怎麼寫,但是通常Render Thread只會有一個的情況下,CPU送東西給GPU之後,
: : 大部分顯示引擎會等到結果返回才進行下一次的render,要不然資源存取很容易打架
: : 大多數的引擎都會等,一個render結束才會執行下一個。
: : 在軟體層面來說,可以取得的時間只有
: : 可以取得CPU準備資料所消耗的時間
: : 可以取得CPU送指令給GPU所消耗的時間 + GPU收到指令返回結果所消耗時間的"總和"
: : 無法從軟體面單獨取得CPU送資料給GPU消耗的時間
: : 無法從軟體面單獨取得GPU收到指令完成運算時所消耗的時間
: : 我所了解的程度有限,希望可以幫上忙
: 所用的是最底層的API OpenGL.
: 主程式可能有很多Thread,Timer、AI、Physics、Rendering等等。
: 我想知道的是,今天當CPU把Draw Call送給GPU後,是否會將RenderingThread Block,
: 然後執行其他的Thread,還是Busy-Waiting等到GPU處理完?
Render Thread是Render Thread
CPU在Render Thread丟資料給GPU之後就是等,在等的時候CPU自然會做其他Thread的事情
: 或者今天為單一Process,OpenGL的Display Function前後包夾clock();
: 他會直接把Display處理完丟給GPU,然後直接繼續執行,然後等下一次要Display時,再
: Wait GPU的Interrupt?
: 還是會等GPU執行完以後才繼續下面的程式呢?
如果你所有的邏輯設計包含Render都是在同一個Main Thread裡面,
也就是說你整支程式就只有一個Thread,當然會等GPU作完才會執行下一步
但是如果不是,那答案就很不一定,因為一般遊戲引擎絕對有很多個Thread
然後由一個Main Thread下達命令,例如
Main Thread中你下達了PlaySound()的call
實際上把播放的聲音送到 Sound Quene 之中然後再由另一個Sound Thread去播放
Render也是如此,要Render的東西送到Render Quene,由Render Thread一一繪製
但是Render Thread會比單純播放聲音複雜很多,解釋起來可以講很多,
而且實作的方式不同又可能是另一個故事,所以這裡不多做解釋
因為要call的系統資源種類太多,例如載入材質可能又有一個Loading Thread,
Network又是另一個Thread,諸如此類...這也是為何許多遊戲引擎的API,
相關的資源都會實做一個Singleton的Manager,例如Sound Manager,
Texture Manager, Control Manager, AI, GPU, Shader, Map, Decal, Mesh, Physics,
Network, Memeory, Animation, Buffer, Tick, Post Effect, Render, Render World,
Font, Logic, Sence....等等以非同步的方式
通常是用Observer模式實做來訂閱並觸發各種事件來交換訊息和進行動作
總而言之,如果你是把所有的邏輯都寫在同一個Thread,那麼絕對絕對是上一步做完
才會執行下一步
如果是好幾個Thread,考量非同步資料的運作方式會有很多種不同的答案。
**補充
我可能有點答非所問,如果你的問題是指compiler在編譯程式時,
是用Single Thread去模擬Multi Thread的選項,如果是這種情況,
那麼執行過程中所有的行為都會影響到Render的時間

Links booklink

Contact Us: admin [ a t ] ucptt.com