2012-04-29 68 views
-3

我是編程新手。我知道C/C++和Win32的基礎知識。我現在試圖做圖形,但我想要最快的連接到屏幕。我意識到大多數人都在使用Opengl或DirectX。但是,我不想要這些開銷。我想從頭開始並控制像素數據。我知道GDI位圖,但我不確定這是否最適合訪問數據。我知道我必須通過Windows進行交流,這是麻煩。 Opengl和DirectX是否可以編譯到GDI的級別,或者有一種特殊的方式,它們是繞過還是使用類似的代碼?請不要問我爲什麼要這樣做。也許解釋如何做到這一點可能會有所幫助。就像窗戶如何將所有窗戶組合在一起以創建最終圖像Windows低級圖形

+10

太好了。 A「我不知道我的電腦或操作系統是如何工作的,但我已經決定了我不想解決我的問題的所有方式,請不要問我爲什麼排除所有有效方法「 題。這些都是最好的 – jalf

+0

你可以使用nvapi的nvidia GPU ...請參閱文檔。 https://developer.nvidia.com/nvapi –

回答

6

對像素數據的最直接訪問是通過着色器,它們都受OpenGL和Direct3D的支持。它們交叉編譯並直接在視頻卡上運行。他們不使用OpenGL,他們沒有OpenGL開銷。 OpenGL只是用來讓他們首先進入顯卡自己的處理器。

你在CPU上做的任何事情都必須首先通過總線(通常是PCI-express)拷貝到顯卡上。 GDI實際上是從圖形內存中刪除很多級別的。

OpenGL,Direct3D,Direct2D,GDI和GDI +都是抽象層。 GPU供應商編寫一個接受這些標準命令功能的驅動程序,以特定於卡的格式對數據進行重新編碼,然後將其發送到卡上。通常,OpenGL和Direct3D是經過最嚴格優化的,並且還需要最少量的重新編碼。

Windows如何結合各種屏幕上的窗口來創建全屏圖像很大程度上取決於您正在討論的Windows版本。 DWM將變更爲。由於DWM是在Vista中引入的,因此程序渲染到GPU內存的個人區域,然後窗口管理器使用視頻卡的紋理查找單元將每個程序的各個區域高效分層到屏幕主緩衝區。當程序(通常是遊戲)請求全屏獨佔訪問時,跳過此步驟,並且驅動程序使該應用程序的渲染命令直接影響主屏幕緩衝區。

假設CPU正在生成需要顯示的數據,最快和最有效的方法可能是將數據塊複製到頂點緩衝區對象中,並使用OpenGL命令將其柵格化爲線或多邊形或無論(或Direct3D等效)。如果你以前認爲GDI是低級界面,那麼你就有一些閱讀材料可以使這項工作成爲可能。但它的運行速度比純粹的GDI快幾個數量級。實際上,這個新架構的速度要快得多,因爲GDI(和WPF)是建立在Direct2D和/或Direct3D之上的。

+0

謝謝你的回覆。我還有一個問題。我不知道我的思路是否正確,但我一直認爲GPU是增加這種操作類型的插件。然後主板的另一個視頻卡部分連接到屏幕。就像我的筆記本電腦有Nvidia卡。我認爲它CPU - > GPU - >集成顯卡 - >屏幕,可以繞過GPU使其插件。不是我想要的。我也正在考慮致力於CUDA只是爲了選擇。並行性。一切都通過NVIDIA並且它直接控制屏幕? – user1364455

+0

@ user1364455:GPU是顯卡的一部分。對於混合動力系統,它不如我寫的那麼好。該繪圖是在GPU上完成的,然後將幀緩衝區複製回集成圖形以便流式傳輸到屏幕。除非您的圖形非常簡單,否則這比使用集成圖形更快,並且比使用CPU生成圖像更節能。無論如何,你可以忽略你的nvidia芯片 - 我寫的所有內容都適用於Intel集成顯卡,更新的Intel芯片(如Sandy Bridge)甚至支持集成顯卡上的着色器。 –

+0

@ user1364455:問題在於,在現代計算機中,處理器上運行的代碼直接連接到向屏幕提供數據的圖形內存,而處理器不是CPU。 –

1

,但我想在屏幕

我想從頭開始,並控制像素數據

你緣木求魚最快的連接。使用GPU加速功能時可以獲得最佳性能。但是,在這種情況下,您無法直接訪問像素數據,嘗試訪問它(讀回或寫入)會對性能產生負面影響,因爲您必須將數據從系統內存傳輸到視頻內存。因此,應該小心處理從系統內存流向視頻內存的任何內容。另外你必須學習API。

如果您「從頭開始」並在CPU上進行渲染,您將可以輕鬆訪問像素數據並完全控制渲染,但性能將劣於GPU(CPU不太適合並行處理,並且系統內存可能比視頻內存的數量級要慢),再加上你將花費大量的時間重新發明輪子。

Opengl和DirectX的編譯到GDI的水平還是有一種特殊的方式他們這樣做,他們是否繞過或使用類似的代碼?

不,他們幾乎直接使用硬件製造商提供的驅動程序與圖形硬件進行通信。而DirectX/OpenGL使用的那些「直接硬件訪問」接口將不可用 - 它們是硬件特定的,並且是製造商特定的,可以是內部的,甚至可能受專利保護。

當然,您可以使用的傳統硬件接口很少(即VESA或VGA 13h模式),但是,它們的直接使用通常被操作系統禁止(您無法在Windows上輕鬆訪問VESA) ,因此要訪問它們,您必須啓動MS-DOS,使用自定義操作系統或幫助程序類(例如Linux上的SVGAlib),這些類只能在根特權下運行。當然,即使你真的使用VESA/VGA來自己渲染東西,在任何硬件(比RivaTNT 2 Pro更新)上,與OpenGL/DirectX完成的硬件加速渲染相比,性能將會非常糟糕。你有沒有看過windows xp在沒有合適的GPU驅動時速度有多快(需要一秒鐘重繪窗口)?這就是使用VESA/VGA直接訪問的速度。

請不要問我爲什麼要這樣做。

問爲什麼你想這樣做是有道理的。你的「我想要直接的低級訪問」方法在15年前或者在DOS時代是適合的。現在合理的解決方案是使用現有的API(由不是你的人維護)並尋找一種方法來充分利用它。當然,如果你想開發車手,那將是另一回事。

0

待辦事項OpenGL和DirectX編譯到GDI的水平還是有他們這樣做是一種特殊的方式

我知道大多數與OpenGL或DirectX去。但是,我不想開銷

那麼你的意思是**你絕對不知道什麼OpenGL或DirectX真正做到,但你已經決定,他們沒有足夠有效的爲您需要。

對不起,但這是無稽之談。回答這樣的問題是不可能的。

在現實世界中,您有一臺專門用於製作圖形的小型超級計算機。你可以通過OpenGL和DirectX訪問它。

而他們快速的原因是他們做不是只是「從頭開始,控制像素數據」。

所以,如果你想要認真的答案,請嘗試讓知識的人回答你的問題決定哪個問題是最好的。

如果你想要高效的圖形,正確的答案是使用DirectX或OpenGL。