操作系统如何在屏幕上绘制窗口?

2024-03-13

经过多年的计算机使用和编程,我意识到实际在屏幕上绘制的软件堆栈对我来说基本上是一个谜。

我曾研究过一些嵌入式 LCD GUI 应用程序,我认为这为简化堆栈提供了一些线索,但对于 Windows 操作系统之类的东西的整体情况仍然模糊。

据我所知:

  • 最低级别 0 是电子硬件(集成电路),它提供数字接口,将屏幕上的像素变成某种颜色或灰度色调。该界面记录在数据表中,因此您知道如何切换数字线以按照您想要的方式转动任何像素。
  • 下一级是硬件驱动程序。这通常将硬件抽象为通用接口。像 SetPixel() 之类的东西。
  • 下一个级别 2 是 2D/3D 图形库(我对其中的小部件/单屏经验有限)。较低级别似乎提供了代表屏幕上像素的缓冲区或内存范围。图形库对此进行了抽象,因此您可以调用 DrawText("text", 10, 10, "font") 等函数,它会以正确的方式为您设置像素。

  • 下一个层次将是操作系统的魔力。窗口/按钮/表单/WPF/等是在内存中创建的,然后路由到适当的驱动程序,同时也被定向到屏幕的某个部分?

但是像 Windows 这样的东西到底是如何工作的呢?

  • 我假设 GPU 适合级别 0 和级别 1。GPU 直接驱动显示器上的像素,现在级别 1 驱动程序是 GPU 驱动程序。还有更多函数可用于启用 GPU 提供的附加功能。 (这会是什么?操作系统是否会传递 3D 空间中的三角形数组,然后 GPU 将其处理为 3D 透视图,然后将其显示在屏幕上?)

但对我来说最大的谜团是当你进入窗口部分时。您可以同时运行 sketch up、visual studio 和 FPS 游戏,并能够在它们之间切换,或者在某些情况下将它们平铺在屏幕上或分布在多个屏幕上。这是如何跟踪和渲染的?其中每一个都必须在后台运行,操作系统必须说明哪个图形管道应该连接到屏幕的哪个部分。 Windows 会如何说屏幕的这一部分是 3D 游戏而这部分是 2D WPF 应用程序等?

最重要的是,您可以在一个应用程序中使用 DirectX,在另一个应用程序中使用 Qt。我记得有多个游戏或应用程序运行使用相同的技术,那么这是如何工作的呢?据我所知,您将拥有应用程序->图形库(DirectX、WPF 等)->帧缓冲区->Windows 控制器(该帧缓冲区应该缩放到屏幕的位置和部分)->驱动程序?

最后,它只是通过位切换来指示哪个像素应该是什么颜色,但在到达那里的过程中需要进行大量的切换位。

如果我启动 Visual Studio 并创建一个基本的 WPF 应用程序,当我将按钮放在屏幕上并单击开始时,后台会发生什么?我见过 VS 设计师将它放在上面,在 XAML 中创建它,我什至在嵌入式系统中手动绘制了一个像素一个像素的东西,但是在这之间发生了什么,即所谓的三明治的肉?

我用过 Android、iOS、Windows 和 Linux,它似乎是一个常见的功能,但我从未见过或听到过关于我上面概述的背后是如何实现的解释,我只有一个稍微有根据的猜测。

有谁能解释一下这是如何工作的吗?


VGA

假设 x86,VGA 内存映射到最低 1 MiB 的标准视频缓冲区地址(文本模式为 0x000B8000,图形模式为 0x000A0000)。还有许多 VGA 寄存器控制卡的行为。有两种广泛使用的视频模式:模式 0x12(16 色 640x480)和模式 0x13(256 色 320x200)。模式 0x12 涉及使用 VGA 寄存器切换平面(蓝、绿、红、白),而模式 0x13 涉及使用 VGA 寄存器可以修改的 256 色调色板。

通常,依赖 VGA 的操作系统会在启动时使用 BIOS 设置模式,或者在运行时写入适当的 VGA 寄存器(如果它知道自己在做什么)。要绘制到屏幕上,视频驱动程序要么简单地写入视频内存(模式 0x13),要么将其与写入 VGA 寄存器(模式 0x12)结合起来。

目前使用的大多数卡仍然(部分)兼容 VGA。

VBE

几年后,VESA 发明了“VESA BIOS 扩展”,这是视频卡的标准接口,允许更高的分辨率和更大的颜色深度。视频内存通过两种不同的方式公开:存储模式和线性帧缓冲区。存储区模式会将视频内存的一小部分暴露给低地址 (0x000A0000),并且视频驱动程序几乎每次更新屏幕时都需要切换存储区。线性帧缓冲区是一种更方便的解决方案,它将整个视频内存映射到非标准高地址。

在启动期间,操作系统将调用 VBE 接口来查询支持的模式并设置最方便的模式,或者它会绕过 VBE 接口并直接写入所需的视频硬件寄存器(如果它知道自己在做什么)。在分组模式和线性帧缓冲区之间,视频驱动程序将写入视频内存映射到的指定内存地址。

目前使用的大多数卡仍然(部分)兼容 VBE。

现代视频接口

最现代的视频接口通常没有 VGA 和/或 VBE 那样广泛记录。然而,视频内存仍然映射到一个地址,而硬件寄存器和/或缓冲区包含有关图形卡行为的可修改信息。不同之处在于接口不再标准化,现在先进的操作系统需要为每个显卡使用不同的驱动程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统如何在屏幕上绘制窗口? 的相关文章

  • 查找椭圆或贝塞尔曲线上的等距点

    目前我正在编写 JavaScript 代码 将对象放置在屏幕上的椭圆上 我试图找到能够解决这个问题之一的算法 椭圆将是完美的 但如果它太昂贵 贝塞尔曲线也可以 抱歉 但不幸的是我的数学不允许我使用我找到的答案 https mathoverf
  • 如何使用 GWT 检测操作系统?

    Basically what I want to know is to find out if my GWT application is running on a MacOS or any other operating system t
  • C# 窗口形式的漂亮图形

    我需要使用 C 在 Windows 窗体中创建一些简单的图形 简单地说 我指的是线条 圆圈等 但是 当我画画时 例如实心圆 边缘不平滑 正如使用方形像素绘制圆时所预期的那样 但是当在矢量程序中使用相同数量的像素绘制相同的圆时 它看起来很完美
  • 二维几何:如何检查点是否在角度内

    我有以下二维几何问题 我有一个点 从该点投射一个无限角度 2D 锥体 该角度由方向和角度给出 该点和方向形成一个向量 并且角度的每一侧一半形成 2D 锥体 现在我想检查 2D 中的另一个点是在这个圆锥体内部还是外部 如何才能实现这一目标 谢
  • 投影 3D 网格的 2D 轮廓算法

    给定 一个 3D 网格 由一组顶点和三角形定义 并用这些点构建网格 问题 找到任意平面上投影的任意旋转网格的二维轮廓 投影很容易 挑战在于找到平面中投影三角形边的 外壳 我需要一些有关研究该算法的输入 指针的帮助 为简单起见 我们可以假设
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 如何正确实现TBitmap的扫描线访问?

    我正在尝试根据以下方式访问位图的扫描线关于内河码头的文章 http edn embarcadero com article 29173 使用像这样的扫描线 for y 0 to n do begin line bitmap scanline
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 内核与系统中的 Windows 进程

    我有一些与内核和用户模式下的 Windows 进程相关的问题 如果我有一个 hello world 应用程序和一个公开新系统调用 foo 的 hello world 驱动程序 我很好奇一旦处于内核模式 我能做什么和不能做什么 对于初学者来说
  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 二维数组的 MPI 数据类型

    我需要将一个整数数组的数组 基本上是一个二维数组 从根传递给所有处理器 我在 C 程序中使用 MPI 如何声明二维数组的 MPI 数据类型以及如何发送消息 我应该使用广播还是分散 你需要使用播送 http www netlib org ut
  • 了解多个进程的并发文件写入

    从这里 UNIX 中文件追加是原子的吗 https stackoverflow com questions 1154446 is file append atomic in unix 考虑多个进程打开同一个文件并向其追加内容的情况 O AP
  • 如何检索 iPhone 的区域设置

    我用谷歌搜索过它 但令我有点惊讶的是我找不到它 我只想访问设备配置的区域设置 我试图找到如何列出所有系统属性 以防我能在那里找到区域设置 但甚至找不到如何做到这一点 我知道 认为 我之前检索过系统属性 但我也记得在谷歌搜索时找到该信息并不容
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 更改 3D 图形颜色 (matplotlib)

    我使用以下代码在 matplotlib 中绘制了 3D 图形 Previously defines lists of data to plot fig plt figure ax fig add subplot 111 projection
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 将签名位图转换为签名字符串(很奇怪的一个)

    基本上我需要将位图图像转换为字符串 但这不是常见的 困境在于该字符串由两部分组成 1 积分 2 线路 我需要将图像转换为由 分隔的两个部分 我得到的一个例子是 221A 221A270A270A25032503200720071716171

随机推荐

  • 如何在 swagger 中成功记录多种内容类型的 GET 响应

    假设我们有一个 json swagger 规范示例 swagger 2 0 info version 1 0 0 title Some API basePath api v1 consumes application json produc
  • 如何在 Swift 中使用 dropbox api 获取共享链接?

    我想制作一个应用程序 让用户将文件上传到保管箱 然后获得共享该文件的选项 如何获取文件的保管箱链接 看来我可以用 client sharing createSharedLink 路径 myfile 但我如何以字符串形式访问该数据 这是一个如
  • Windows:自动挂起整个进程? [复制]

    这个问题在这里已经有答案了 使用 Win32 API 只能使用以下命令挂起单个线程SuspendThread 但不是一次调用就能完成完整的过程 迭代进程线程并一次挂起它们并不是一个好的选择 因为它可能会导致死锁和意外行为 这应该是使用 DD
  • thread_local 的成本

    现在C 正在添加thread local存储作为一种语言功能 我想知道一些事情 What is the cost of thead local likely to be 在记忆中 用于读和写操作 与之相关的是 操作系统通常如何实现这一点 看
  • 修复页面滚动时的标题转换

    我一生都无法弄清楚这一点 有谁知道这个网站上的滚动效果是如何创建的 http blindbarber com news http blindbarber com news 我正在开发一个项目 该效果将非常有帮助 这样我的固定导航在滚动时不会
  • 将日期从字符串格式转换为 OLE 自动化日期

    我有一个日期字符串21 Apr 2018 如何将此日期字符串转换为 python 中的 OLE 自动化日期 我正在使用Python v3 6 OLE 日期的定义可以在此处找到 https msdn microsoft com en us l
  • JpaRepository 与枚举:findAllByOfferState_ACTIVE。没有这样的元素异常

    我想获得所有报价 其中 OfferState 等于 ACTIVE 是否可以仅使用方法名称使用 Spring Data 或者我必须使用 Query Repository public interface OfferRepository ext
  • MySQL - 如何规范化包含分隔符分隔 ID 的列

    我正在尝试规范化一个表 该表是以前的开发人员设计的 其中有一列包含管道分隔的 ID 这些 ID 链接到同一个表中的其他行 客户表 id aliases VARCHAR 1 4 58 76 2 3 4 1 58 76 58 1 4 76 76
  • 在集合中的项目数非常大的 WHERE 子句中使用“IN”

    我遇到一种情况 我需要对一组非常大的行进行更新 我只能通过它们的 ID 来识别这些行 因为目标记录是由用户选择的 除了用户的记录集之外没有任何共同点 想修改 所有这些记录上的相同属性都在更新 因此我想进行一次 UPDATE 调用 这是不好的
  • HOG 人体检测器:背景减除图像的误报检测

    我正在开展一个需要检测场景中的人员的项目 最初在原始帧上运行 HOG 检测器后 所有帧上的特定背景对象都被检测为人 从而产生 3021 个误报检测 因此 我采取了合理的步骤 通过对所有帧应用背景减法器 BackgroundSubtracto
  • Rascal:创建 AST 时 boolcollectBindings 的作用是什么?

    我有一个关于在 rascal 中创建 AST 的问题 我通常会执行以下操作 model createM3FromEclipseProject project testproject decls createAstsFromEclipsePr
  • PHP preg_match 长度限制 3276

    看来 PHP 的preg match在某些情况下 匹配重复字符的字符数限制为 3276 i e s 0 3276 有效 但是 s 0 3277 才不是 它似乎并不总是适用 因为 0 3277 works 我在 PHP 文档或错误跟踪器中找不
  • 在距离 10 的圆内画一个圆

    我最近开始使用 Android 我需要在圆内画一个圆 就像下面的图片一样 距离 10 如果你看到下面的照片 我需要画一个像下面这样的具有两个直径的圆 但我不这样做不需要照片上当前存在的任何图标 只是具有两个直径的圆中的圆 我只想绘制圆圈和两
  • 如何更改Android中全息主题的菜单项文本颜色?

    我在我的应用程序中使用 Theme Holo 我使用以下 Style xml 自定义了我的主题
  • mysqli 或 PDO - 优缺点是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 sudo 执行 bash 函数?

    我尝试导出该函数 然后使用 bash 执行它 但这不起作用 export f my func sudo bash c my func bash my func command not found 如果我尝试在不使用 sudo 的情况下使用
  • 组合 2 个列表的元素

    假设我们有两个列表 val l1 List a b c val l2 List 1 2 3 我想要的是 List a1 b2 c3 即 将 l1 的第 n 个元素与 l2 的第 n 个元素相加 实现它的一种方法是 l1 zip l2 map
  • Runtime.exec().waitFor() 实际上并未等待

    我有一些使用 Runtime exec 运行外部 jar 作为 IzPack 安装程序构建 的代码 如果我从命令行运行这个 external jar 如下所示 java jar external jar 然后 在应用程序完成之前 命令提示符
  • XCode:添加构建阶段被禁用

    我想添加崩溃解决方案 https www crashlytics com我的 iOS 项目需要添加插件Run script阶段 但无论我做什么 为了添加构建阶段所有选项均被禁用 我选择目标 gt 构建阶段 我有合适的方案 我的项目运行良好
  • 操作系统如何在屏幕上绘制窗口?

    经过多年的计算机使用和编程 我意识到实际在屏幕上绘制的软件堆栈对我来说基本上是一个谜 我曾研究过一些嵌入式 LCD GUI 应用程序 我认为这为简化堆栈提供了一些线索 但对于 Windows 操作系统之类的东西的整体情况仍然模糊 据我所知