Windows 2D绘图引擎的发展及联系

cario库——C++画图 是用于创建新上下文对象的函数,该函数创建和返回一个新的 Cairo 上下文对象,该对象链接到指定的表面(cairo_surface_t类型)。Cario库是一个用于图形绘制的开源C++库,主要用于处理2D图形的渲染和绘制。Cario库通过使用矢量图形来实现高质量的渲染,这意味着图形可以按照任意缩放级别进行绘制而不会产生锯齿或像素化。该函数将指定路径上的 PNG 文件读入一个新表面中,返回的指针就是新创建的cairo_surface_t类型的表面。rgba:红绿蓝+透明度(0:完全透明,1:完全不透明) 阅读详情
背景知识 : Windows 图形编程

    在 Windows 7 操作系统中,微软花费了很大的力气构建了一套新的 2D 绘图 API。我们称之为 Direct2D ,隶属于 DirectX 家族。这个 API 的开发填补了 Windows 图形平台的一些缺陷。其中非常重要的一点就是普通的 2D 程序渲染不再缺乏硬件加速。而在 Windows Vista 中,我们知道 GDI 是无法进行硬件加速的。微软寄望于开发的这个 API 具备很多现代特性。比如支持抗锯齿和 Alpha Blend 的 2D 渲染,和其它现代图形 API 交互,服务器端渲染,诸如此类。

    为了方便理解微软为何开发 Direct2D ,我们先来回顾一下当初开发 Windows 时的历史。最初的渲染系统叫做 GDI (图形设备接口),今天仍然存在。它最初为 16 位 Windows 写就,随后升级到 32 位 Windows (Windows 95 和 Windows NT)。因为 GDI 是为很久以前那些计算能力低下的计算机而开发的,所以它并没有诸如抗锯齿之类的特性,大多数 API 亦不支持 Alpha 通道。

    在 Windows 95 期间,DirectX 发布了第一版。DirectDraw 是其中最早的组件之一。当初的本意是在硬件加速启用的情况下,开发人员可以绕过 WinG 允许,直接访问硬件。这样的一个协议堆栈既可以和 GDI 协作,但是又真正处在同一地位。

    随着图形硬件(显卡)演进,GDI 通过 DDI (设备驱动接口) 获得了硬件加速的能力。很多视频卡实现了这些 DDI ,而通过购买一块视频卡来改善你的 Windows 性能亦成为平常之事。接下来,Direct3D 进驻到 DirectX 2 中,当然它也创建了自己的 DDI 集。随之,视频卡开始投入越来越多的精力来使得 3D 图形越来越快,以便维持游戏市场巨大的需求。最后导致诞生了两个不同的领域 : 硬件加速和图形编程。前者围绕于 Direct3D 构建,后者则围绕于 GDI 。

    Direct3D 和 GDI 构建于不同目标,不同位置的事实意味着它们并不能像人们期望的那样能够良好的工作在一起。虽然实现了不少像 GetDC 这样的帮助桥接特性,但是在大量交叉渲染的场景下它们总是存在着或这或那的一些问题。尽管如此,微软并没有移除这些待解决的场景需求。

    到了世纪之交,GDI 的限制越来越显现。微软针对这些功能缺陷做了一个 GDI 扩展,即 GDI+ 。这些扩展提供了诸如位图操作,画笔,抗锯齿和越来越复杂的 Primitive 渲染中不同像素深度格式,Alpha Blend 的支持。同时,GDI+ 亦包括了诸如打开 Png 和 Jpg 格式文件的图像操作支持。然而,GDI+ 新增的全部操作都没有硬件加速支持。

    GDI+ 在托管世界中非常流行,这主要得力于它是 System.Windows.Drawing 命名空间的主力。每一个客户自定义渲染的非常漂亮的 Windows Form 程序都使用 GDI+ 来当此大任。但是,构建于 GDI 之上的 GDI+ 同样继承了与 Direct3D 交互的所有问题。事实上,因为它总是软渲染,在某些场景下,它会变得更糟。

    当时间走到计划研发 Windows 7 时,很明显,微软需要解决很多互操作性的不足,以及不平衡的硬件加速能力。保留现有的 API 且要达到上述目的是相当困难的事情。GDI 有很长的历史,这需要应付海量的应用程序兼容性问题。如果要把 Alpha Blend 支持(举例) 弄进 GDI 核心 API 集合,而且还不得罪现有的客户无异于天方夜谭。因为 GDI+ 构建于 GDI 之上,旧有的陋习同样让它获得硬件加速能力变得难以实现。

    解决方案就是创建新的 API 来囊括我们想要的功能和处理互操作性问题。MIL 代码(WPF 处理渲染的原生组件)是一个很方便的起点。它有着我们想要的渲染特性,而且同时提供了软件渲染和硬件加速。

    首先需要做的事情是使渲染代码基于 D3D 10.1 ,而不是 D3D 9 。之所以这样决定是因为有一些构建于这个运行时版本的其它技术把 D3D 10.1 作为基础(10Level9,WARP,D3D Primitive Remoting)。而且我们还可以看到未来的硬件同样构建于这个架构之上。这样就能允许我们来设计 D3D 10.1 互操作性。因此就能允许与其它技术交互,比如 Direct2D 。

    另外一个互操作性工作就是利用窗口管理器和 DXGI ,以确保 Direct2D 和 GDI 能够共同工作。你可以使用 Direct2D 绘图到 GDI 目标,同理,反之亦可。 但是,从性能的角度来看,这些特性并非免费。它只是让那些构建在这两种混合 API 上的应用程序能够平滑过渡到新世界。

    前面所作的工作中很重要的一块就是尽量使得此 API 在性能方面富于表现力。对于开发人员来说,WPF 的好处在于它做了很重要的资源管理工作,但却使得直接控制硬件变得困难起来。这听起来貌似很简单,但是这背后有着大量的设计决定以确保 GPU 内存没有分配给不需要之人,且仍然能够允许人们构造他们之所想。因此遵循了这样一个原则的 Direct2D 设计和资源/线程模型就能够允许服务器端渲染进行合适的伸缩。GDI 却不能。

    此外,对于处理文本和图像可以分别采用 DirectWrite 和 WIC 。这表明了微软 DirectX 家族正更加组件化。Direct2D 以一种互补的方式对 DirectWrite 文本和 WIC 位图操作提供硬件加速支持。

    最后想说的是,我们构建了一个支持硬件加速的 2D 渲染 API (带有软渲染)。它有着现代渲染原语集合,能和以前的 API 进行交互。我们认为它完全可以取代作为大多数应用程序开发场景所使用的 GDI/GDI+ API ,而且也可以作为某些游戏开发场景中 D3D 10.1 的补充。微软构建的这么一套组件化的技术集合完全允许开发人员混合搭配以构造以前难以构造的事物。比如把已定位的文本像素直接渲染到 Direct3D 纹理当中,而不需要任何字体的支持。
C++ MFC/BCG编程(五):Windows绘图引擎、图形设备接口GDI、设备描述表DC Windows环境下二维绘图引擎有多种选择:GDI、GDI+、Direct2D、Direct3D、OpenGL、Vulkan等。GDI作为微软原生的二维绘图引擎,有微软的全力支持,作为操作系统核心层效率方面不用担心。 阅读详情

相关推荐

Windows 2D 绘图技术演进:从 GDI 到 Direct2D 的性能与效果对比

本文系统梳理了Windows平台2D绘图技术从GDI、GDI+到Direct2D的演进历程。通过对比三者的核心架构、性能特点与适用场景,重点分析了Direct2D如何利用GPU硬件加速实现远超传统技术的渲染性能与视觉效果,为开发者选择适合的图形渲染方案提供清晰指导。

weixin_29207149的博客 271

Win7 64位 VS2015及MinGW环境编译矢量库agg-2.5和cairo-1.14.6

有人可能想为什么这里都设置好了路径,上面还要建立libpng和zlib,pixman目录,这主要是因为官方那个编译文件默认是写死的,只找他默认改名后的目录和文件,然后新建一个Win32 Project,也就是窗口程序,实际上我建的Win32 Console空工程,然后在工程设置又改成的窗口,怎么弄都行。还没完,AGG最叼的是自带演示工程水平非常高,在源码中有一个叫examples的目录,直接拖一个idea.cpp编译,如图。主要不同的是,我的libpng和zlib编译好了,直接从pixman开始的。

lmrylll的博客 1298

自研跨平台px2d引擎

我厂自研跨平台2D引擎,历经项目考验

frostmourncn的专栏 1155

Agg vs. Cairo 二维绘图引擎之比较和选择

<br />Agg vs. Cairo 二维绘图引擎之比较和选择<br />cheungmine<br />当今时代对于作为二维图形软件开发者, 是幸运的。因为除了Windows GDI/GDI+之外,我们还有很多其他的选择。而且这些选择除了能跨平台之外,性能上与原始GDI/GDI+相比,都不逊色。<br /><br /> 如果不考虑绘图的效果,使用Win32 GDI函数直接绘图的效率大约是同样的GDI Plus的10倍以上。为了反走样的美观,只有牺牲效率了。老式的程序还在使用GDI绘图,不是这些程序不想

恒 1万+

提高二维矢量绘图效率之一般做法

提高二维矢量绘图效率之一般做法

gdruhv的博客 589

别再纠结GDI+和Qt了!聊聊Windows下那些被低估的2D绘图库:Cairo和Skia实战对比

本文深度对比了Windows平台下两大2D绘图引擎Cairo和Skia的核心特性与性能表现。通过实测数据展示Skia在硬件加速(Vulkan/OpenGL)下的渲染优势,以及Cairo在矢量图形和文本渲染上的卓越质量,为开发者提供技术选型指南和实战集成方案。

weixin_42525005的博客 182

图形开发之Cario库简介以及下载安装

这几天都在研究Cairo图形库,这是一个开源跨平台的图形库,相对于OpenGL来说更容易上手使用。在开始之前先介绍一些关于矢量图形和光栅图形的概念。矢量图形和光栅图形是两种不同的计算机图形体系。光栅图形用像素的集合来表现图像。矢量图形使用诸如点、线、曲线或多边形等几何图元来表现图像。这些图元通过使用数学方程式创建。这两种计算机图形提示各有各自的优缺点。矢量图形比光栅图形更先进的特点有如下几点:

eric 5070

blend2d:由JIT编译器提供动力的2D矢量图形引擎

blend2d:由JIT编译器提供动力的2D矢量图形引擎

2D绘图引擎比较

这个问题很普遍。最近在研究这个问题,在网上搜了一些资料,再结合自己的经验,谈谈自己的一些想法。 一.双缓存能提高绘图效率吗? 网上有篇文章:绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率,其中提到一种...

809

cario:Carios 是使用 Cocos2d-x 框架编写的 Mario Bros 克隆版

Cario 是使用 Cocos2d-x C++ 引擎编写的 Mario Bros 克隆版。 ( )

cairo多平台2D图形库.rar

cairo多平台2D图形库,C++ 2D图形库 Cairo是2D图形库,支持多种输出 设备。当前支持的输出目标包括X窗口 系统(通过Xlib和XCB),石英,win32和图像缓冲区, 以及PDF,PostScript和SVG文件输出。实验后端 包括OpenGL,BeOS,OS / 2和DirectFB。 开罗旨在在所有输出媒体上产生一致的输出 同时利用显示硬件加速(如果有) (例如,通过X Render Extension)。 cairo API提供的操作类似于 PostScript和PDF。开罗的业务包括抚摸和灌装 三次贝塞尔曲线样条,转换和合成半透明图像, 和抗锯齿的文本呈现。所有绘图操作都可以 通过任何仿射变换(比例,旋转,剪切, 等等。)。 开罗的设计旨在让您以现代方式绘制任何想要的东西 2D图形用户界面。

Qt使用GDI绘图(仅Windows平台)

绘图引擎 Windows环境下二维绘图引擎有多种选择:GDI、GDI+、DirectDraw、Qt/QPainter、Agg、Cairo、skia、Direct2D、Direct3D、OpenGL等。 GDI:微软原生的二维绘图引擎。 优点:微软的全力支持,作为操作系统核心层效率方面不用担心,支持多种开发框架(含语言):WinSDK、MFC、Delphi等。 缺点:不是面向C++对象组织的......

$firecat利白的代码足迹$ 9401

Gem5模拟器,详解官网教程Event-driven programming(五)

Gem5模拟器,详解官网教程Event-driven programming、时间调度、如何自定义SimObject

qq_46675545的博客 2038

开源项目推荐:OpenGL/Vulkan/Cairo/Skia/angle/VTK/OpenVG/MyPaint/GIMP/Krita/Pencil2D/inkspace/enve等绘图库或画图软件

https://github.com/yuanming-hu/taichi中国人写的太极图形库 http://taichi.graphics/太极图形库,作者胡渊鸣 https://libcinder.org/矢量图形库,2D/3D https://github.com/cinder/Cinder https://github.com/FortAwesome/Font-Awesome ...

$firecat利白的代码足迹$ 1万+

RAG项目简历包装指南:从“流水线工人”到“问题解决者”的跃迁(附代码与思路)

本文代码已在Python 3.11 + CUDA 12.3环境测试,部分功能需LangChain 0.2+支持。

Conan_0728的博客 1885

【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系

深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别,同时也有一些联系。下面将从几个方面详细比较这两种方法,并给出应用实例和代码示例。

weixin_51306394的博客 2566

高效的渲染引擎——Direct2D入门

Direct2D是微软在win7中的新技术,内部采取了3D渲染模式,比原来的GDI和GDI+效率大大提高,通过显卡的渲染,图像质量也有大幅度的提升。 目前我正在学习游戏引擎的编程,对于传统2D渲染效率低感觉极为不满意,用3D技术渲染两个三角形+纹理贴图 又略感费事,Direct2D无疑是一个好选择。 支持快速渲染高质量图片,优秀的图元绘制,加上方便的2D矩阵变换,蒙版等特效的应

西风世界 1万+

Zemax实战录——非序列模式下的微透镜阵列仿真与优化

本文详细介绍了在Zemax非序列模式下进行微透镜阵列仿真的完整流程与优化技巧。文章重点阐述了从序列模式切换到非序列模式的必要性,并逐步指导如何搭建光源、阵列与探测器的仿真环境。核心在于通过调整圆锥系数等关键参数优化像差,并增加光线数以提升仿真精度与均匀性,为光学设计提供可靠依据。

weixin_28339967的博客 512

Ycnd 2D 图形引擎常见问题解答

Ycnd 2D常见问题解答(持续更新!) 1、Ycnd 2D是什么?Ycnd 2D是一套基于DirectX的2D图形引擎,它使用DirectX(D3D)来加速图形的绘制。Ycnd 2D封装了DirectX中的许多细节,使得开发人员可以不必接触麻烦的DirectX初始化、设置、资源管理、渲染等过程就可以编写出具备硬件加速的图形程序,能够大大节省你的开发时间,提高开发效率。 2、Y

kflizcst的图形世界 3291

【教培管家】小程序实战(五):体验课预约——从流量到转化的闭环

本节我们通过变量状态管理和数据联动,实现了孩子选择和日期选定。下一篇我们继续讲解预约页面,根据选择的日期来筛选排课,供用户进行预约。

低代码布道师的博客 1562

【AUTOSAR实战】:CAN发送邮箱忙导致报文发送丢帧的问题调试

本文档主要讨论了CAN总线通信中可能出现的TC377传输错误的分析和解决方案。文章提供了如何通过检查CAN传输和接收过程、识别传输缓冲区的类型和状态以及选择适当的内存保护功能来检测和解决此类错误的见解。经过多次尝试和分析,得出的结论是,修改CANIF缓冲的尺寸并重新分配报文给各个buffer并不能解决问题。此外,发送中断被抢占可能导致报文无法发送,最终也将此因素排除。本文档还提到了一些可能导致发送流程调度出现问题的因素,例如CANIF中报文引用Buffer不合理。

weixin_46481662的博客 3136

如何看懂 Simple 2D 的 DPI 适配:display_scale 与坐标映射让 2D 绘图跨平台清晰一致

Simple 2D 是一个轻量级的开源 2D 图形引擎,用 C 语言编写并基于 SDL3,支持 macOS、Windows 和 Linux 的 ARM64/X86 平台。它的核心卖点之一是**DPI 感知渲染**:无论你是在 Retina 屏、2K 显示器还是 Windows 200% 缩放的笔记本上运行,画出的图形都清晰锐利、位置准确。本文将深入 Simple 2D 的 DPI 适配原理,带你看

gitblog_00896的博客 256

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2580

Direct2D 简介

---恢复内容开始--- Direct2D是一个函数库,结构库,类库? 函数被管理在不同的接口里面,要使用接口里面的函数,需要先实例化接口。 Direct2D的绘图机制(简单): 第一:获得虚拟画面(呈现器)。 第二:获得画刷。 第三:使用画刷在虚拟画面上画图。 其中,画面(资源),画刷(资源),画画(函数)等,都在Direct2D里面产生。并通过相应的接口管理...

aijie0679的博客 264

YOLOv8改进 | 细节涨点篇 | DySample一种超级轻量的动态上采样算子(效果完爆CARAFE)

本文给大家带来的改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子)。

Snu77的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LGame引擎核心功能解析:2D渲染、物理引擎与多平台适配的底层实现

LGame是一款功能强大的跨平台Java游戏引擎(Framework),全面支持JavaFX、Android、IOS、HTML5、Linux、MAC和Windows等多种平台。本文将深入剖析LGame引擎的三大核心功能:高效的2D渲染系统、逼真的物理引擎以及灵活的多平台适配机制,为新手和普通用户揭开游戏开发的神秘面纱。 ## 一、高效2D渲染系统:打造视觉盛宴的底层引擎 LGame引擎的2D渲

gitblog_00947的博客 876

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Direct2D能否在XP上运行
下一篇: D2D引擎与GDI\GDI+绘制效果对比
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值