关于 Direct2D
http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd370987(v=vs.85).aspx
本主题介绍 Direct2D,这是 Windows 7 的全新二维图形 API。使用 Direct2D,Win32 开发人员可在执行二维图形呈现任务时获得出色的性能和视觉效果。
什么是 Direct2D?
Direct2D 是一种硬件加速的即时模式二维图形 API,可为二维几何对象、位图和文本提供高性能、高质量的呈现。Direct2D API 可与使用 GDI、GDI+ 或 Direct3D 的现有代码进行交互。
Direct2D 主要供以下几类开发人员使用:
- 大型企业级本机应用程序开发人员。
- 创建供下游开发人员使用的控件工具包和库的开发人员。
- 需要对二维图形进行服务器端呈现的开发人员。
- 使用 Direct3D 图形,并且需要在菜单、用户界面 (UI) 元素和抬头显示器 (HUD) 中使用高性能的简单二维和文本呈现的开发人员。
为什么使用 Direct2D?
在 Microsoft Windows 中开发出新二维图形 API 的主要目的包括:
- 紧跟 Windows 用户所习惯的不断提高的丰富视觉体验。
- 使开发人员能够编写出可随着运行代码的 PC 的图形处理硬件直接扩展的二维呈现代码。
- 使开发人员能够编写出可在服务上下文中运行的二维图形呈现代码。
近年来,最终用户开始希望数字体验具备更好的视觉保真度。这种趋势在消费电子产品中得到反映。GPS 设备、媒体播放设备、移动电话和数码相机年复一年地不断实现更加丰富的体验。电影、电视、视频游戏和网站中各种各样的图形内容也反映了这种趋势。为了跟上这些变化,开发人员需要不断丰富现有 Windows 应用程序的视觉效果。
视频游戏图形和各种 Windows 体验(如 Windows Media Center 和 Aero)的发展,推动现代 Windows PC 中的图形处理器也得到了稳定的发展。有些 Windows 应用程序可以通过 Microsoft Direct3D 和 Windows Presentation Foundation (WPF) 来利用现代 GPU。尽管 Direct3D 可用于开发高端三维图形应用程序,WPF 可满足 .NET 开发人员的需要,但对于拥有基于 GDI 和 GDI+ 的呈现代码所构成的大型现有代码库的开发人员或要在其基于 Direct3D 的应用程序中加入高质量二维图形的开发人员而言,仍无法满足其要求。
最后,对于进行企业方案和网站开发方案的开发人员而言,需要可在服务中使用的图形 API。现有的呈现 API 侧重于单个用户会话中的客户端呈现。在服务上下文中使用时,它们无法满足稳定性和可伸缩性的要求。因此,需要新的 API 来解决这些问题。
高性能和最大可用性
Direct2D 是使用 Direct3D 10.1 API 构建的用户模式库。这意味着 Direct2D 应用程序可受益于现代主流 GPU 的硬件加速呈现。在更早的 Direct3D 9 硬件中,也可通过使用 Direct3D 10-level-9 呈现来实现硬件加速。此组合可在现有 Windows PC 的图形硬件上实现卓越的性能。
下图显示 Direct2D 的分层体系结构。

对于无法使用硬件加速的情况,Direct2D 提供了高性能软件光栅器。在软件中呈现时,与使用 GDI+ 并提供同等视觉质量的应用程序相比,使用 Direct2D 的应用程序可大幅提高呈现性能。该软件光栅器还可用在服务上下文中。
使用 Windows 7 操作系统中的远程桌面协议 (RDP) 基础结构也可以远程显示通过 Direct2D 呈现的内容。开发人员可以选择是通过显示计算机上的 GPU 来处理呈现,还是在本地呈现并作为位图来传送。可以根据要求的填充率以及所呈现的图形基元的质量来进行此选择。当显示计算机所运行的操作系统早于 Windows 7 时,将通过在网络中传送位图来执行远程显示呈现。
Direct2D 提供单个 API,该 API 既具有 Direct3D 的性能,又可通过软件回退、远程桌面和服务呈现等实现高可用性,使开发人员进行单一实现就可在很多不同方案中进行高性能呈现。
视觉质量
与使用 GDI 的应用程序相比,使用 Direct2D 处理图形的应用程序可实现更高的视觉质量。Direct2D 使用每基元抗锯齿功能,在呈现的内容中实现外观更为平滑的曲线和直线。在呈现二维基元时,也完全支持透明度和 Alpha 混合。下图对使用 GDI 呈现的锯齿内容(左)和 Direct2D 呈现的抗锯齿内容(右)进行了比较。

在需要的情况下,开发人员可以指定矢量图形的锯齿呈现。这些情况包括需要与硬像素边界(如指针或标尺等 UI 元素)对齐、必须匹配输出的 GDI 样式或者将在呈现过程的下游通过多重采样抗锯齿或其他一些机制执行抗锯齿。
互操作性
通过 GDI 与 Direct3D 的图面级互操作性,开发人员可以更方便地集成基于 Direct2D 的呈现。主要通过 GDI、GDI+ 或 Direct3D 呈现内容的应用程序可以先使用 Direct2D 呈现其应用程序的特定区域,经过一段时间再改用这样一种模型,即 Direct2D 主要用于执行呈现,GDI 主要用于插件或传统可扩展性。
通过 Direct2D,还可以方便地使用 DirectWrite 这一新的文本 API 以及 Microsoft Windows 图像处理组件 (WIC)(可能为英文网页)的高级图像处理功能。
有关 Direct2D 互操作性的详细信息,请参阅 Direct2D SDK 的互操作性部分。
小结
使用 Microsoft Direct2D,开发人员可在应用程序中构建二维图形功能,从而实现优于 GDI 的视觉质量和可随现代 GPU 扩展的性能特征。通过 Direct2D 互操作性模型,开发人员可以在进行基于 GDI、GDI+ 或 Direct3D 的呈现时有选择地迁移部分应用程序。
另请参见
关于 Direct2D的更多相关文章
- UWP中的Direct2D
介绍 DirectX一直是Windows平台中高性能图形的代名词,自Win7开始,微软又推出了Direct2D技术,包装于Direct3D,但专注于2D图形,并且准备取代GDI这样的传统2D图形技术. ...
- Direct2D教程(外篇)环境配置
2014年世界杯首场淘汰赛马上开始了,闲着没事,整理以前的博客草稿打发时间,意外的发现这篇文章,本来是打算加入到Direct2D那个系列的,不知道为什么把它给遗漏了.环境配置,对于熟手来说,不是什么重 ...
- Direct2D开发:纹理混合
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 我们都知道Direct2D可以加载并显示图片,但是不知道你有没有想过,这个2D的图形引擎可以进行纹理混合吗?如果 ...
- Direct2D开发:从资源加载位图
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...
- Direct2D开发:绘制网格
转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...
- 使用DirectWrite测量Direct2D文字大小
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 最近在使用Direct2D和DirectWrite写引擎,在引擎中需要实现文本标签控件.但是文本标签的尺寸最好不 ...
- SharpDX之Direct2D教程II——加载位图文件和保存位图文件
本系列文章目录: SharpDX之Direct2D教程I——简单示例和Color(颜色) 绘制位图是绘制操作的不可缺少的一部分.在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再 ...
- 在 WinForm 中使用 Direct2D
在 C# 的 WinForm 应用中,界面的绘制使用的是 GDI+.不过在一些特别的应用中,可能需要用硬件加速来提高绘制的效率.下面就来介绍两种在 WinForm 应用中嵌入 Direct2D 的方法 ...
- C# 使用 Direct2D 实现斜角效果
Direct2D 是微软新的二维图形 API,可为二维几何图形.位图和文本提供高性能和高质量的呈现.Direct2D 支持硬件加速,无论是绘制速度还是绘制质量,Direct2D 都要比 GDI 和 G ...
随机推荐
- android 数据下载 工具类
传入图片地址,获得服务器返回的流. 把流转化为byte[]数组
- 解决getElementsByClassName的兼容性问题
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- js按钮浮动随手指方向移动而移动
window.document.getElementById("moveDIV").addEventListener("touchmove", function ...
- Swift—继承
一个类可以继承另一个类的方法,属性和其他特性.当一个类继承其他类时,继承类叫子类,被继承类叫超类(或父类).在Swift中,继承具有单继承的特点,每个子类只有一个直接父类,继承是区分类与其他类型的一个 ...
- python线程池(threadpool)模块使用笔记
一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...
- Apache2 部署 Django
环境: debian8 apache2.4.10 #请注意自己的apache版本,不同版本配置文件结构差异很大 django1.10 python3.4 默认ap ...
- HDU 5966 Guessing the Dice Roll
题意有 N≤10 个人,每个猜一个长度为L≤10的由1−6构成的序列,保证序列两两不同.不断地掷骰子,直到后缀与某人的序列匹配,则对应的人获胜.求每个人获胜的概率. 思路:建立trie图,跑高斯消元. ...
- 原生js发送ajax请求
堕落了一阵子了,今天打开博客,发现连登录的用户名和密码都不记得了.2016年已过半,不能再这么晃荡下去了. 参加了网易微专业-前端攻城狮 培训,目前进行到大作业开发阶段,感觉举步维艰.但是无论如何,不 ...
- AndroidStudio Rename Package
AndroidStudio中重命名包名的方法和可能遇到的问题 在开发中,可能会遇到需要重命名和合并某个包的情况.如果进行如下操作可能会导致以下结果: 在一个空包下创建一个包,会出现两个包名合并的情况. ...
- 状态模式(State Pattern)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...