【发布时间】:2016-12-14 08:12:40
【问题描述】:
经过多年使用和编程计算机后,我意识到实际在屏幕上绘制的软件堆栈对我来说大多是个谜。
我曾开发过一些嵌入式 LCD GUI 应用程序,我认为这为简化堆栈提供了一些线索,但 Windows 操作系统之类的整体情况仍然模糊不清。
据我所知:
- 最低级别 0 是电子硬件(集成电路),它提供数字接口以将屏幕上的像素变为某种颜色或灰度阴影。该接口记录在数据表中,因此您知道如何切换数字线以按照您想要的方式转动任何像素。
- 下一级是硬件驱动程序。这通常将硬件抽象为一个通用接口。像 SetPixel() 之类的东西。
下一级 2 是 2D/3D 图形库(我对它的小部件/单屏体验有限)。较低的级别似乎提供了表示屏幕上像素的缓冲区或内存范围。图形库对此进行了抽象,因此您可以调用 DrawText("text", 10, 10, "font") 之类的函数,它会以正确的方式为您设置像素。
下一级将是操作系统的魔力。 windows/buttons/forms/WPF/etc 在内存中创建,然后路由到适当的驱动程序,同时也被定向到屏幕的某个部分?
但是像 Windows 这样的东西到底是如何工作的呢?
- 我假设 GPU 介于 0 级和 1 级之间。GPU 直接驱动显示器上的像素,现在 1 级驱动程序是 GPU 驱动程序。有更多功能可用于启用 GPU 提供的附加功能。 (这会是什么?操作系统是否在 3D 空间中传递一组三角形,GPU 将其处理成 3D 透视图,然后将其放到屏幕上?)
但对我来说最大的谜团是当你进入窗户部分时。您可以同时运行 Sketch Up、Visual Studio 和 FPS 游戏,并能够在它们之间切换,或者在某些情况下将它们平铺在屏幕上或然后分布在多个屏幕上。这是如何跟踪和渲染的?这些中的每一个都必须在后台运行,并且操作系统必须说明哪个图形管道应该连接到屏幕的哪个部分。 Windows 怎么会说这部分屏幕是 3D 游戏而这部分是 2D WPF 应用等?
最重要的是,您在一个应用程序中使用了 DirectX,而在另一个应用程序中使用了 Qt。我记得有多个游戏或应用程序运行使用相同的技术,那么它是如何工作的呢?据我所知,您将拥有 Application->Graphics library (DirectX, WPF etc)->Frame Buffer->Windows director(该帧缓冲区应该缩放到屏幕的哪个位置和哪个部分)->Driver?
最后,它只是位切换来指示哪个像素应该是什么颜色,但在到达那里的过程中它是一个地狱般的切换位。
如果我启动 Visual Studio 并创建一个基本的 WPF 应用程序,当我在屏幕上放置一个按钮并点击开始时,后台会发生什么?我已经看到 VS 设计人员将它放在上面,在 XAML 中创建它,我什至在嵌入式系统中逐个像素地手动绘制了东西,但在这两者之间会发生什么,即所谓的三明治肉?
我使用过 Android、iOS、Windows 和 Linux,这似乎是一种常见的功能,但我从未见过或听过关于我上面概述的内容背后的解释,我只是有一个稍微有根据的猜测。
有人能解释一下这是如何工作的吗?
【问题讨论】:
标签: graphics 3d operating-system 2d