Display Lists在記憶體中的形式

2022-05-03 06:33:07 字數 2671 閱讀 1789

opengl顯示列表的設計能優化程式執行效能,尤其是網路效能。它被設計成命令快取記憶體,而不是動態資料庫快取。也就是說,一旦建立了顯示列表,就不能修改它。因為若顯示列表可以被修改,則顯示列表的搜尋、記憶體管理的執行等開銷會降低效能。

採用顯示列表方式繪圖一般要比瞬時方式快,尤其是顯示列表方式可以大量地提高網路效能,即當通過網路發出繪圖命令時,由於顯示列表駐留在伺服器中,因而使網路的負擔減輕到最小。另外,在單使用者的機器上,顯示列表同樣可以提高效率。因為一旦顯示列表被處理成適合於圖形硬體的格式,則不同的opengl實現對命令的優化程度也不同。例如旋轉矩陣函式glrotate*(),若將它置於顯示列表中,則可大大提高效能。因為旋轉矩陣的計算並不簡單,包含有平方、三角函式等複雜運算,而在顯示列表中,它只被儲存為最終的旋轉矩陣,於是執行起來如同硬體執行函式glmultmatrix()一樣快。一般來說,顯示列表能將許多相鄰的矩陣變換結合成單個的矩陣乘法,從而加快速度。

用來繪圖並且維護顯示列表內容的硬體被稱作圖形加速器。圖形加速器一般都有乙個預先分配好的記憶體區域來維護顯示列表內容(譯者:注意,不一定是主記憶體)。影象中每個可見的象素都由圖形加速器中的乙個或更多的位元組記憶體來描述。乙個灰度圖可能只有乙個位元組來表述象素的灰度。而乙個彩色影象則可能給紅,綠,藍每個分量各分配乙個位元組。t為了保持在螢幕上不閃爍地顯示,這個所謂的顯示記憶體每秒鐘要被掃瞄相當多次。圖形加速器通常還有乙個叫做「脫屏快取」(offscreen memory)的記憶體區域,這個快取是無法被顯示的,它被用來儲存那些不可見的資訊。

opengl假設顯示記憶體和脫屏快取由視窗系統來管理。視窗系統決定記憶體的哪一部分可以被opengl訪問以及這些部分是如何組織的。在每個opengl的環境裡,都有乙個函式集(其包含函式通常不多)來把opengl繫結到某個特別的環境上。在ms的windows環境中,這組函式叫做wgl。在x視窗系統環境下,這組函式叫做glx。在蘋果機上,這組函式又叫做agl。在每個環境裡,這些函式都提供對圖形記憶體區域的分配/釋放操作的支援。分配/釋放的資料結構叫做圖形上下文(context),圖形上下文裡儲存了opengl狀態,當前圖形上下文的選擇情況,哪快圖形記憶體是用來繪製的,以及opengl與視窗系統之間的指令同步。

隨著opengl的渲染而改變內容的那一部分圖形記憶體區域叫做幀快取(frame buffer)。在視窗系統裡,opengl通過幀快取來與視窗通訊。視窗系統為opengl提供了一組工具來為視窗選擇幀快取特性,而這組工具,通常是系統相關的。典型地,視窗系統也會制定當視窗重疊時opengl幀快取的行為。在沒有視窗的系統中,opengl幀快取與整個顯示裝置通訊。

乙個支援opengl渲染的視窗 (即幀快取) 可能包含以下的組合:

· 至多4個顏色快取

· 乙個深度快取

· 乙個模板快取

· 乙個積累快取

· 乙個多重取樣快取

為了能夠執行雙快取構架,大多數圖形硬體同時支援前後快取。這將允許應用程式在顯示前快取(可見的)的時候渲染到後快取(離屏快取)。當渲染結束的時候,這兩個快取進行交換,以便已經完成渲染的快取像前快取一樣進行顯示,這樣渲染就能在後快取重新開始了。一旦使用雙快取,在繪製過程當中使用者將不能看到影象。這種技術通常被用來實現實時互動的平滑動畫。

如果為左眼和右眼各實現乙個顏色快取的話,那麼就可以支援立體視覺效果了。雙快取技術由前後快取來支援。因此乙個雙快取的立體視覺將會有4各顏色快取:前左,前右,後左,後右。乙個普通的(非立體的)雙快取視窗將會僅僅有前後兩個快取。乙個單快取的視窗將會只有乙個快取。

如果繪製3d物件時需要剔除隱藏表面的話,深度快取是必要的。這個快取在每個象素上儲存了顯示物件的深度值。當繪製附加物件的時候,會在每個象素上進行深度比較,這樣就能決定新的物件是否可見。

模板快取用來進行複雜的掩模(masking)操作。乙個複雜的形狀可以儲存在模板快取裡,然後繪製子串行操作可以使用模板快取裡的內容來決定是否更新象素。

積累快取是乙個顏色快取,不過典型地它有比顏色快取更高的精度。這就允許一些影象通過積累產生一些合成的影象。比如說乙個作用就是可以在積累快取裡對乙個物件隨著他的運動繪製一些幀數。在積累快取中的象素除以幀數以後,結果影象就展現出了運動模糊效果。相似的技巧也可以用來模擬景深效果以及高質量的全屏抗鋸齒。

而通常的,當乙個物件被繪製的時候,對於某個圖元是否影像螢幕上的象素,會做乙個單獨的決議。多重取樣快取正是這樣乙個快取,它允許每個渲染的物件在象素內被取樣多次,以進行高質量的全屏抗鋸齒,而不必對這個物件渲染多次。每個象素內的取樣包括:顏色,深度,模板資訊。每個象素取樣的次數當然是必須的。當視窗包含多重取樣快取的時候,它將不回包括單獨的深度或者是模板快取。隨著物件的渲染,顏色樣本會被組合生成乙個單一的顏色值,然後這個顏色值被傳遞,並寫入到顏色快取裡。因為他們包括視窗中每個象素的多個顏色、深度以及模板樣本(通常是4,8或者是16),因此多重取樣快取會消耗相當數量的離屏快取。

立即模式

顯示列表 

保留模式

顯示列表的資料放**不是固定的,而是要看具體優化,顯示列表只是提供了優化的可能性。

原則上說,概念上是server memory。實現上,包括視訊記憶體、驅動核心級記憶體、驅動使用者級記憶體。

頂點和紋理是可以放到視訊記憶體的,但其它的操作還是需要驅動來排程的。視訊記憶體不夠時當然就要做記憶體交換。

提高速度,並不只是因為視訊記憶體快,而是還有並行。gl提出server/client的兩部分不只是為了支援遠端模式,也包含了兩部分是並行的含義,這和硬體加速下的情況是一樣的。gpu和驅動都是與使用者程式並行的。

-------lidudu

float在記憶體中儲存

浮點型變數在計算機記憶體中占用4位元組 byte 即32 bit。遵循ieee 754格式標準。乙個浮點數由2部分組成 底數m 和 指數e。mantissa 2exponent 注意,公式中的mantissa 和 exponent使用二進位制表示 底數部分 使用 進製數來表示此浮點數的實際值。指數部...

Bitmap在記憶體中載入

package com.danjiang.bitmapdemo import android.annotation.suppresslint import android.graphics.bitmap import android.graphics.bitmap.config import and...

在記憶體中讀寫資料

from io import stringio 建立 io.stringio記憶體緩衝器物件f f stringio 往f中寫入字串資料,並返回字串的長度 f.write hello 結果 5 f.write 結果 1 f.write world 結果 6 提取物件f中的全部內容 f.getvalu...