在理解wine 图形显示之前先了解下Windows 下当前使用的图形显示方法。
Windows 图形显示
Windows采用了基于GDI(Graphics Device Interface)和 DirectX两种不同的图形显示方式。
- GDI(Graphics Device Interface):是Windows中内置的2D渲染引擎,主要负责窗口、控件等基本UI元素的渲染、文字绘制以及打印输出等任务。在GDI的实现中,系统采用双缓冲技术,防止屏幕重绘过程中出现闪烁等问题。
- DirectX: 是Microsoft提供的对硬件加速3D图形的开发工具集合,包括Direct3D, Direct2D,DirectComposition等组件,可以在Windows平台上实现高效率的图形渲染。它通过与显卡进行直接交互(即硬件加速)来实现图形的渲染和显示 。DirectX可以利用GPU中的专门硬件进行运算,并且支持着色器编程模型,使得用户可以更加灵活地控制物体各个方面的外观和行为。当前,DirectX已经推出到DirectX 12版,随着现代游戏图形越来越复杂,DirectX这种硬件加速的3D图形显示方式将会越发重要。
其中DX11 09年推出,DX12 14年推出并于15年Windows10 上全面支持DX12,现在主流都用DX12。
参考官方文档: https://learn.microsoft.com/zh-cn/windows/win32/learnwin32/overview-of-the-windows-graphics-architecture
Windows 下图显当前架构图如下:
- 图形设备接口 (GDI) 是 Windows 的原始图形界面。 GDI 首先针对 16 位 Windows 编写,然后针对 32 位和 64 位 Windows 进行了更新。
- GDI+ 作为 GDI 的后续版本在 Windows XP 中引入。 GDI+ 库通过一组包装平面 C 函数的 C++ 类进行访问。 .NET Framework还在 System.Drawing 命名空间中提供 GDI+ 的托管版本。
- Direct3D 支持三维图形。
- Direct2D 是 2D 图形的新式 API,是 GDI 和 GDI+ 的后续版本。
- DirectWrite是文本布局和光栅化引擎。 可以使用 GDI 或 Direct2D 绘制光栅化文本。
- DirectX 图形基础结构 (DXGI) 执行低级别任务,例如呈现输出帧。 大多数应用程序不直接使用 DXGI。 相反,它充当图形驱动程序和 Direct3D 之间的中间层。
最底层需要调用 GDI DDI 和DX DDI;(DDI (Device Driver Interface,设备驱动程序接口))。其由设备厂家根据接口协议进行开发。微软定义好所有的DDI 接口,厂家各自去实现驱动。所以如果显卡驱动没有安装成功的话,我们的电脑显示就会很丑陋,分辨率和颜色显示会混乱。
在Windows 下的开发,也可以采用 OpenGL 进行开发,同 DirectX 一样,显卡驱动中会实现OpenGL 协议接口。微软官方也支持OpenGL,但是不宣传使用。
我们平时使用的Winform、MFC、WPF、Qt等则是用来实现对这些引擎调用的工具,属于更上层的范围。
WPF采用的是DirectX作为底层绘图引擎,Winform和MFC则都采用GDI/GDI+。Qt Widget使用GDI/GDI+,QML则使用OpenGL 渲染。当然作为C++/C# 开发人员,也可以在Qt 中使用DX,或者在Winform 上使用OpenGL,只是需要自行研究函数库调用再做封装使用而已。
以上绘图引擎主要涉及到的动态库如下:
- gdi32.dll
官方解释:Windows GDI - Win32 apps
主要涉及以下一些绘图操作:
- 位图
- 画笔
- 剪裁
- 颜色
- 坐标空间和转换
- 设备上下文
- 填充形状
- 字体和文本
- 线条和曲线
- 图元文件
- 多个显示监视器
- 绘画和绘图
- 路径
- 笔
- 打印和打印后台处理程序
- 矩形
- 区域
- gdiplus.dll
官方解释: GDI+ - Win32 apps
主要在gdi 的基础上新增支持了:
- 渐变画笔
- 基数样条
- 独立路径对象
- 转换和矩阵对象
- 可缩放区域
- Alpha 混合
- 支持多个图像格式
- d2d1.dll
官方解释:Direct2D - Win32 apps
Direct2D 是一种硬件加速的即时模式 2D 图形 API,可为二维几何图形、位图和文本提供高性能和高质量的渲染。跟GDI/GDI+ 区别很大,在新的设备中完全可以用Direct2D 去实现。
主要绘图操作:
- 呈现目标
- 呈现目标功能
- 呈现目标资源
- 绘图命令
- 错误处理
- 绘图资源
- 画笔
- 几何图形
- 位图
- 绘制文本
- Direct2D 基元
- d3d*.dll/d3dcompiler*.dll
涉及到3D 绘图,较为复杂,后续再补充。
接下来先了解下Linux 下当前的图形显示方式。
Linux 下图形显示
在linux 下主要有X11 和 Wayland 这两种显示方式。
- X Window系统(X11):这是一种最早引入的显示系统,它提供了基本的图形用户接口(GUI)功能,包括窗口、菜单、对话框以及文本输入等,同时支持OpenGL等高级图形渲染接口。X Window作为一种客户端/服务器模型,其结构设计使得不同的应用程序可以共享和独立使用显示设备,通常被用于使用本地计算机连接到远程服务器上时。
- Wayland窗口系统:近年来,Wayland逐渐取代X11成为Ubuntu推荐的默认显示服务器协议。与X Window不同,Wayland采用“合成器”(Compositor)的概念实现对图形显示的管理和处理,在不影响性能的前提下,目的是消除Linux平台下图形事件冒泡延迟,减小硬件资源的占用率,提供更流畅与舒适的界面体验。
Wine 图形显示
作为Windows 和Linux 的胶水层,Wine 需要实现Windows 上的图形显示,也即要分别实现GDI 和DirectX .
查阅源码,Wine 基本实现了对应的API 功能;其中
DirectX 真正实现在wined3d 中,与Windows 对应的各种d3dxx.dll ,函数实现均会跳转到wined3d;当然其在Linux 的实现均是调用了OpenGL 的接口。(当然,官方也提出可以通过注册表将3D 渲染引擎修改为Vulkan,但是当前的Vulkan 转换并不完善,慎用)由于DirectX 和OpenGL 的接口设计不相同,会导致部分转换有异常;
d3d12 作为一个特殊,考虑到Vulkan 与 DX12 API 比较类似,架构相近;因此其实现直接调用 winevulkan。
由于Linux 桌面显示系统基本都是基于X11,因此Wine 封装了winex11.drv,
负责将Win32界面渲染到Linux和其他UNIX操作系统的桌面上。 涉及到渲染以及鼠标键盘等事件均需要通过其中转。
附:基本概念
-
OpenGL(Open Graphics Library)是一种跨平台的图形渲染API,它提供了一套用于绘制2D和3D图形的计算机图形学标准接口。OpenGL可以在各种硬件平台上使用,并且支持多个操作系统,包括Windows、Linux,macOS等。它由开放标准组织OpenGL Architecture Review Board (ARB)进行标准化管理。
OpenGL主要通过定义一些函数来实现对GPU的访问和控制,并提供一系列高效的方法来渲染2D和3D图像。OpenGL本身并不直接处理输入设备或窗口系统,但它可以与其他API如GLUT或SDL结合使用以提供完整的图形编程环境。
OpenGL具有以下优点:
1.跨平台和可移植性:OpenGL的代码可以从一个硬件/操作系统平台方便地移植到另一个平台上而无需大量修改。
2.开放源代码:OpenGL是一种开放的标准,其规范及时向公众公示,并且可广泛应用于各种应用程序中。
3.性能高效:OpenGL立足于利用GPU的硬件加速,充分发挥显卡的输入/输出运算能力,因此具有极高的图形处理性能。
4.支持各种语言:除了C/C++,OpenGL也同时兼容多种编程语言,例如 Java、Python、C#等。 -
GTK 是一种跨平台的图形用户界面(GUI)工具包,它是为了开发基于 X Window System 的 Unix 应用程序而设计并开发的。它是使用 C 语言编写的,但也支持许多其他编程语言,如Python、Perl和C++等。GTK+ 提供了各种部件(Widgets),如按钮、文本输入框、下拉菜单等,使得开发者可以方便地构建 GUI 界面。文章来源:https://www.toymoban.com/news/detail-810895.html
-
Vulkan是一个低开销、跨平台的3D图形API,由Khronos Group推出,可运行在Windows、Linux以及Android等操作系统上。它基于前身OpenGL ES标准,并在其基础上进行了颠覆性的升级与改进。
相对于OpenGL,Vulkan具有如下特点:
1.效率更高:Vulkan内部优化了许多传统API中存在的“瓶颈”,采用更直接的方法向GPU提交指令,大幅度提升了效率和帧率。
2.可扩展性更好:Vulkan被设计为模块化的,能够更好地适应不同类型GPU的硬件架构,也可以更好地利用线程并发技术,实现更多的资源共享和同时处理。
3.精确度更高:在管线配置和着色器编译方面,Vulkan规范要求使用精确的控制调节,使得着色器执行过程更加规范、精确,并且方便游戏引擎为用户提供更加个性化的效果。
4.跨平台性更强:Vulkan可以支持多种平台,允许游戏开发者一次编写渲染代码,即可应用到多种平台上。文章来源地址https://www.toymoban.com/news/detail-810895.html
到了这里,关于Wine 图形显示基本概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!