介紹4---memory和client/server

很粗略的,我們可以從三個主要角度來看待memory:

1. CPU可以讀寫的,稱爲system memory,我們一般寫的程序都是使用system memory。

2. CPU可寫GPU可讀的,屬於video memory,這種memory在驅動程序中具有重要意義,是驅動程序軟件和GPU硬件的橋樑。驅動程序往此memory寫入硬件指令,GPU讀取指令然後執行。

3. CPU可讀GPU可寫的,也屬於video memory,在驅動開發中也很重要。GPU將某些執行狀態或者反饋數據寫入此memory,驅動程序讀取就可以瞭解GPU的狀態。

 

frame buffer也屬於video memory,它是GPU可寫的,一般來說,也是GPU可讀但CPU不可讀的。

 

【說明】應用程序和驅動程序都是由CPU執行的,所以,所謂的CPU的讀寫,就是應用程序/驅動程序的讀寫屬性。

 

 

考察一個OpenGL應用程序,如下圖所示,應用程序在system memory中準備好數據,將指針傳遞給driver。driver有兩種處理方法:

1. driver在自己內部分配memory,即時的將應用程序system memory中的數據拷貝過來。這樣,接下去假如在應用程序中修改了其system memory中的數據,並不影響已經被拷貝到driver中的數據。

2. driver只是簡單的記錄下指針值,然後,只在這塊數據真正被需要用到的時候,driver纔去指針對應位置去獲取數據。在這中間,假如在應用程序中修改了其system memory中的數據,顯然driver所取得的數據是修改後的值。

 

【說明】opengl一開始只定義了第二種方式,由於存在侷限性(後面會詳述),在03年提出的verter buffer object技術開始支持第一種方式。

 

不管是哪種方式,driver都需要分配出video memory,用恰當的方法將app的system memory中的數據拷貝轉換到video memory中,然後GPU讀取執行即可。

 

但是,在第一種方式下,考慮到可能存在video memory不足的情況,此時,video memory可能會被其他數據覆蓋另作他用,所以,driver往往還會分配出system memory作爲備份。換而言之,app的system memory中的數據,在driver中會有兩份拷貝,一份在driver的system memory中,另一份在video memory中。

 

5

 

 

【說明】寫完後才覺得,可能以下內容並不適合新手,假如對ogl有一定了解的,可以繼續往下看。

 

現在是介紹state概念的合適時機了,根據Spec,OpenGL是一個狀態機state machine,意指OpenGL Pipeline中存在多個屬性,glAPI可以修改這些屬性,而glAPI的執行結果也取決於這些屬性的當前值。所有的屬性值構成了一個狀態,此即狀態機的名稱由來。換句話說,見上圖,ogl是一個有記憶效果的模塊,前面glAPI的不同調用會影響後面glAPI的結果。

 

【說明】這這裏,屬性並不是一個專業術語,只是爲了解釋方便使用的一個詞語,其意思是狀態機中的一個個子狀態。比如說,有沒有啓用光照,當前眼睛位置在哪裏,等等,這些都是子狀態(屬性),所有的子狀態構成了一個狀態機,有時候我們也簡稱爲狀態。我們也往往會稱呼子狀態爲狀態。一般來說,並不會引起歧義。

 

所以,在driver中,都會存在一個數據結構,其變量名一般都叫gc,取OpenGL Context的意思,它維護着在ogl中的當前狀態。ogl狀態由兩部分組成,client state和server state,大部分的狀態都是server state,是完全屬於driver/ogl內部維護的state;回想上面介紹的driver對app system memory處理的兩種方法中的第二種,不可避免的,有些狀態是和app相關的,被稱爲client state。

 

那麼,爲什麼app相關的是client state,而完全從屬於driver/ogl的是server state,而不是將兩者的client/server名稱換一下呢。我們可以從linux/X的角度去考量。

 

當一切都在一臺機器上執行的時候,比較難以理解。所以,下圖示意了兩臺電腦通過網絡連接在一起的情況。電腦A上跑着Linux/X,最終用戶坐在電腦B前面,用和電腦B連接的鍵盤鼠標進行輸入,遠程登錄到電腦A上,並啓動了一個應用程序,在和電腦B連接的顯示器上看到這個應用程序的圖形圖像輸出。根據X協議的規定,電腦A被稱爲client端,而電腦B被稱爲server端。

 

假如這個應用程序是一個OpenGL程序的話,opengl driver是處於機器B上的,因爲這樣才能操作機器B上的顯卡最終在機器B的顯示器上顯示繪製結果。

 

當app和driver在同一臺電腦上時,兩者是處於同一個進程中的;而當我們將app和driver分到兩臺電腦時,兩者是無法處於一個進程中的,我們就會明白client state和server state確實是有區別的。假如採用第二種方式,每次需要時driver都需要藉助X協議通過網絡獲取app system memory的數據,那會是非常緩慢的;因此,諸如vertex buffer object等技術就引入了第一種方式,數據在一開始就被拷貝到driver中,不在需要緩慢的X協議了,甚至,即使是在同一臺電腦中,假如video memory足夠多或者分配策略足夠好,vertex buffer object技術也能提高速度,因爲假如數據一直都在video memory中,就不需要頻繁的進行從system memory到video memory的拷貝了。

 

6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章