我在使用和編程電腦多年後意識到,實際上在屏幕上繪製的軟件堆棧對我來說大多是個謎。操作系統如何在屏幕上繪製窗口?
我曾經研究過一些嵌入式LCD GUI應用程序,我認爲這提供了一些關於簡化堆棧的線索,但對於像Windows操作系統這樣的整個畫面仍然很模糊。
據我所知:
- 最低級別0是電子硬件(集成電路),其提供了一種數字接口把一個像素在屏幕的特定顏色或灰度燈罩上。界面在數據表中有記錄,因此您可以知道如何切換數字線以按照您的需要轉換任何像素。
- 下一級1是一個硬件驅動程序。這通常將硬件抽象爲通用接口。像SetPixel()等
下一級2是2D/3D圖形庫(其中我有限制部件/單屏幕體驗)。較低級別似乎提供了表示屏幕像素的緩衝區或內存範圍。圖形庫對此進行了抽象,以便您可以調用DrawText(「text」,10,10,「font」)等函數,並以正確的方式爲您設置像素。
下一級將是操作系統的魔力。窗口/按鈕/窗體/ WPF /等在內存中創建,然後路由到適當的驅動程序,同時也被引導到屏幕的某個部分?
但是,像Windows這樣的東西真的有用嗎?
- 我會假設GPU適合0級和1級之間的GPU。GPU直接驅動顯示器上的像素,現在1級驅動程序是GPU驅動程序。有更多功能可用於啓用GPU提供的附加功能。 (這是怎麼回事?操作系統是否在3D空間中傳遞三角形陣列,並且GPU將其處理爲3D透視圖然後將其在屏幕上查看?)
儘管對我來說最大的神祕是當你進入窗口的一部分的事情。您可以將素描,視覺工作室和FPS遊戲同時運行,並且能夠在它們之間切換,或者在某些情況下可以將它們平鋪在屏幕上,或者然後分佈在多個屏幕上。這是如何跟蹤和渲染的?其中每一個都必須在後臺運行,操作系統將不得不說哪個圖形管道應該連接到屏幕的哪一部分。 Windows如何說這部分屏幕是3D遊戲,這部分是2D WPF應用程序?
最重要的是,你在一個應用程序中使用DirectX,而在另一個應用程序中使用Qt。我記得有多個運行相同技術的遊戲或應用程序,因此如何運作?從我可以看到你將有應用程序 - >圖形庫(DirectX,WPF等) - >幀緩衝區 - > Windows導向器(在哪裏和什麼部分的屏幕應該這個幀緩衝區縮放) - >驅動程序?
最後,它只是切換位來指示哪個像素應該是什麼顏色,但它是一個很大的切換位的方式來到那裏的地獄。
如果我啓動Visual Studio並創建一個基本的WPF應用程序,當我在屏幕上放下一個按鈕並點擊開始時,背景中會發生什麼?我已經看到VS設計師放棄它,在XAML中創建它,我甚至在嵌入式系統中逐個像素地手動繪製東西,但之間會發生什麼,所謂的三明治肉?
我已經使用過Android,iOS,Windows和Linux,它似乎是一種常見的功能,但我從未見過或聽到過我如何在上面概述的背後的解釋,我只有一個略有教育的猜測。
是否有人能夠說明這是如何工作的?
謝謝glauxosdever!據我所知,這聽起來像我上面描述的0級/ 1級。仍然不確定這是如何看待高層次的。直到Linux或Windows本身的「窗口管理器」才被理解。非窗口操作系統看起來很簡單,但我無法找到有關當您開始使用/不使用圖形卡運行窗口管理器時發生的問題。 Windows內部只是看到一個圖形API,底層驅動程序系統處理圖形是否連接到哪個圖形控制器硬件? – Dru
通常,窗口管理器調用底層圖形API,然後調用(內核,然後調用)圖形驅動程序。括號內的文本是否相關取決於內核是單片還是微內核。 – glauxosdever