我在使用和编程电脑多年后意识到,实际上在屏幕上绘制的软件堆栈对我来说大多是个谜。操作系统如何在屏幕上绘制窗口?
我曾经研究过一些嵌入式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