经过多年使用和编程计算机后,我意识到实际在屏幕上绘制的软件堆栈对我来说大多是个谜。
我研究了一些嵌入式 LCD GUI 应用程序,我认为这提供了一些关于简化堆栈的线索,但像 Windows 操作系统这样的东西的整体情况仍然模糊不清。
据我所知:
下一个级别 2 是 2D/3D 图形库(其中小部件/单屏体验有限)。较低级别似乎提供了表示屏幕上像素的缓冲区或内存范围。图形库对此进行了抽象,因此您可以调用 DrawText("text", 10, 10, "font") 之类的函数,它会以正确的方式为您设置像素。
下一级将是操作系统的魔力。windows/buttons/forms/WPF/etc 在内存中创建,然后路由到适当的驱动程序,同时也被定向到屏幕的某个部分?
但是像 Windows 这样的东西是如何真正工作的呢?
不过对我来说最大的谜团是当你进入窗户的时候。您可以同时运行草图、Visual Studio 和 FPS 游戏,并能够在它们之间切换,或者在某些情况下将它们平铺在屏幕上,或者然后分布在多个屏幕上。这是如何跟踪和呈现的?每一个都必须在后台运行,操作系统必须说明哪个图形管道应该连接到屏幕的哪个部分。Windows 怎么会说这部分屏幕是 3D 游戏,而这部分是 2D WPF 应用程序等?
最重要的是,您在一个应用程序中使用了 DirectX,在另一个应用程序中使用了 Qt。我记得有多个游戏或应用程序运行使用相同的技术,那么它是如何工作的?从我所看到的,您将拥有应用程序-> 图形库(DirectX、WPF 等)-> 帧缓冲区-> Windows 控制器(此帧缓冲区应缩放到屏幕的何处和哪个部分)-> 驱动程序?
最后,它只是位切换以指示哪个像素应该是什么颜色,但在到达那里的过程中这是一个非常多的切换位。
如果我启动 Visual Studio 并创建一个基本的 WPF 应用程序,当我在屏幕上放置一个按钮并点击开始时,后台会发生什么?我已经看到 VS 设计器将它放下,在 XAML 中创建它,我什至在嵌入式系统中逐个像素地手动绘制东西,但是在这两者之间会发生什么,所谓的三明治的肉? …
使用OrmLite将条目添加到数据库时,似乎有两种方法:
dbConn.Insert(customer);
Run Code Online (Sandbox Code Playgroud)
和
dbConn.Save(customer);
Run Code Online (Sandbox Code Playgroud)
使用Insert()时,AutoIncrement ID字段不会更新,但是当使用Save()时它会更新.
如果您使用:
dbConn.LastInsertId();
Run Code Online (Sandbox Code Playgroud)
如果使用Save(),它将返回正确的ID,但如果使用Insert(),则返回错误的ID.
为什么存在这两种方法?使用Insert()将使用正确的ID向数据库添加条目,它不会反映在POCO模型中.看起来很奇怪,如果您不知道这一点,那么当您最终使用错误的ID并且难以跟踪错误时,不会抛出异常并且没有问题的迹象.