我意识到经过多年使用和编程计算机后,实际绘制在屏幕上的软件堆栈对我来说几乎是一个谜。
我已经开发过一些嵌入式LCD GUI应用程序,我认为这提供了一些关于简化堆栈的线索,但是像Windows操作系统这样的东西仍然模糊不清。
据我所知:
下一级是2D / 3D图形库(其中我有限制的小部件/单屏体验)。较低级别似乎提供表示屏幕上像素的缓冲区或内存范围。图形库对此进行了抽象,因此您可以调用DrawText(“text”,10,10,“font”)等函数,并以正确的方式为您设置像素。
下一级将成为操作系统的神奇之处。 windows / buttons / forms / WPF / etc是在内存中创建的,然后路由到相应的驱动程序,同时也被定向到屏幕的某个部分?
但是像Windows这样的东西真的有用吗?
对我来说最大的谜团就是当你进入窗户的一部分时。您可以同时运行草图,视觉工作室和FPS游戏,并且可以在它们之间切换,或者在某些情况下将它们平铺在屏幕上或者然后分布在多个屏幕上。如何跟踪和渲染?其中每个都必须在后台运行,操作系统必须说哪个图形管道应该连接到屏幕的哪个部分。 Windows如何说这部分屏幕是3D游戏,这部分是2D WPF应用程序等?
最重要的是,你在一个应用程序中使用DirectX,在另一个应用程序中使用Qt。我记得有多个游戏或应用运行使用相同的技术,那么它将如何工作?从我可以看到你将有Application->图形库(DirectX,WPF等) - >帧缓冲区 - > Windows导向器(该帧缓冲区应缩放到的屏幕的哪个部分和哪个部分) - >驱动程序?
最后,它只是位切换以指示哪个像素应该是什么颜色,但它是沿途的许多切换位中的一个地狱。
如果我启动Visual Studio并创建一个基本的WPF应用程序当我在屏幕上按下按钮并点击开始时,后台会发生什么?我已经看到VS设计师放弃它,在XAML中创建它,我甚至手动在嵌入式系统中逐个像素地绘制东西,但是在这之间发生了什么,这就是所谓的三明治肉?
我使用过Android,iOS,Windows和Linux,它似乎是一种常见的功能,但我从未见过或听过有关我上面概述的背后的解释,我只有一个稍微受过教育的猜测。
是否有人能够阐明其运作方式?
答案 0 :(得分:2)
假设x86,VGA内存映射到最低1 MiB的标准视频缓冲区地址(文本模式为0x000B8000,图形模式为0x000A0000)。还有许多VGA寄存器可以控制卡的行为。有两种广泛使用的视频模式,模式0x12(16色640x480)和模式0x13(256色320x200)。模式0x12涉及使用VGA寄存器切换平面(蓝色,绿色,红色,白色),而模式0x13涉及具有256色调色板,可使用VGA寄存器进行修改。
通常情况下,依赖VGA的操作系统会在启动时使用BIOS设置模式,或者在运行时写入相应的VGA寄存器(如果它知道它在做什么)。要绘制到屏幕,视频驱动程序可以简单地写入视频存储器(模式0x13),也可以将其与写入VGA寄存器(模式0x12)相结合。
目前使用的大多数卡仍然(部分)与VGA兼容。
几年后,VESA发明了" VESA BIOS Extensions&#34 ;,这是视频卡的标准接口,允许更高的分辨率和更大的色深。视频存储器通过两种不同的方式暴露:存储模式和线性帧缓冲。分组模式会将视频内存的一小部分暴露在低地址(0x000A0000),并且视频驱动程序几乎每次要更新屏幕时都需要切换存储体。线性帧缓冲是一种更方便的解决方案,它将整个视频内存映射到非标准的高地址。
在启动过程中,操作系统会调用VBE接口来查询支持的模式并设置最方便的模式,否则它将绕过VBE接口并直接写入所需的视频硬件寄存器(如果它知道它在做什么)。在存储模式和线性帧缓冲区之间,视频驱动程序将写入视频存储器映射到的指定存储器地址。
目前使用的大多数卡仍然(部分)与VBE兼容。
最现代的视频接口通常没有像VGA和/或VBE那样广泛记录。但是,视频存储器仍然映射在一个地址,而硬件寄存器和/或缓冲区包含有关图形卡行为的可修改信息。不同之处在于接口不再标准化,现在高级操作系统需要为每个显卡提供不同的驱动程序。