0

程序員有什麼辦法直接將數據寫入視頻內存?我知道操作系統對此非常嚴格,但是有些類型的應用程序(如視頻播放器或電腦遊戲)可以將其數據直接寫入視頻內存。如何將數據直接寫入視頻內存?

我知道這裏有一些衆所周知的庫(例如OpenGL)。但它們畢竟只是普通的圖書館,它們和我和你編寫的程序之間沒有本質的區別。

+0

在一些ARM板上,您可以通過'/ dev/fb0'文件直接訪問framebuffer。具有開源驅動程序的現代Linux系統可讓您通過libdrm&co訪問視頻內存。 – fsasm

+0

確實存在一個**基本**區別:它們隨附自己的*驅動程序*/*內核模塊*。 –

回答

1

我知道這裏有一些衆所周知的庫(例如OpenGL)。但它們畢竟只是普通的圖書館,它們和我和你編寫的程序之間沒有本質的區別。

哦,他們是相當不同於「正常的圖書館」。

以OpenGL爲例。其中一部分是您加載的DLL或SO。但其中的一部分就是所謂的「驅動程序」或「圖形驅動程序」。這根本不是一個「正常的圖書館」;它基本上是操作系統的一部分。它基本上是操作系統製造商之外的其他人編寫的一部分。

系統爲驅動程序定義接口,硬件製造商提供適合該接口的驅動程序庫。但這不是普通用戶能夠提供的,也不是通過安裝自己的圖形驅動程序來運行大多數遊戲。

該驅動程序的目的是爲操作系統的OS和客戶端提供統一的圖形硬件接口。不同的硬件是不同的,但每個OS驅動程序導出相同的接口(或多或少),這允許客戶端代碼不必知道硬件的細節。

防止客戶端代碼從打破系統。如果你使GPU崩潰(由於它是處理器,現在你可以做這件事),所以有人必須處理這個問題。操作系統處理CPU故障,而現在的圖形驅動程序/操作系統也會處理GPU故障。但爲了做到這一點,它必須站在你和硬件之間。

在大多數操作系統上,直接任意訪問視頻內存是不允許的。不適用於任何本身不是圖形驅動程序的程序。許多低級API(如OpenGL)允許您映射某些內存分配,以便您可以訪問它們。但是,與給人GPU內存指針完全不同,畢竟,不能保證映射的指針實際指向GPU內存。

哦,他們不讓你映射紋理或幀緩衝區,因爲他們希望保持硬件紋理格式的細節實現定義。

+0

我相信你應該更加重視答案的最後部分:問題是沒有訪問內存(任何驅動程序都可以這樣做),問題是硬件接口很複雜。有許多種緩衝區(着色器,紋理,幀緩衝區,...),GART,視頻模式以及最後但並非最不重要的事實是「顯示器」是共享資源,只要操作系統需要刷新,它就會覆蓋幀緩衝區。 –

+0

感謝您的微小全面迴應;-)但讓我知道如果我正確地說「如果一個顯卡製造商想要實際支持OpenGL,它必須提供一個OpenGL兼容的驅動程序(一個運行OpenGL命令)」。還有最後一件事:我仍然不知道哪些API(它們中有多少)在哪裏可以讓程序員做出神奇的圖形作品。我想每個操作系統都有自己的方式來完成這個任務,對吧?例如,據我所知,Windows有DirectX。其他操作系統呢? –