1

我知道 WPF 封装了 DirectX,但我知道我可以用它来渲染 DirectX 或 User32

  1. 当我将控件拖到窗口时,DirectX 是默认渲染器吗?

  2. 如果没有,我如何强制它使用 User32 进行渲染?

  3. 如果需要,我是否需要使用 User32 渲染整个窗口,或者只是我的控件?

4

2 回答 2

6

WPF之前的生活:

回首过去,不可避免地会发现标准窗口应用程序依赖于 Windows 操作系统的两个磨损严重的部分来创建其用户界面。

a) User32:为元素提供熟悉的窗口外观。

b) GDI/GDI+:为渲染形状、文本、图像等提供绘图支持,

WPF 是否使用 DirectX 或 User32 进行渲染?

WPF 改变了这一切,与窗口窗体有着根本的不同。WPF 的底层技术不是 GDI/GDI+,而是使用 DirectX。因此,无论我们创建什么类型的用户界面,WPF 都使用 DirectX。所以就好像我们是创建复杂的3D图形还是只是绘制一个按钮,所有的绘制工作都必须通过DirectX管道。由于 WPF 依赖 DirectX,现在我们也可以利用硬件加速,这意味着这将尽可能多地将工作交给显卡上的专用处理器 GPU(图形处理单元)和我们的 CPU(中央处理单元) 可以休息一下。

WPF 是否依赖于 User32?

WPF 仍然依赖 User32 来提供某些服务,例如处理和路由输入以及分清哪个应用程序拥有哪一部分屏幕空间。但是,所有绘图都是通过 DirectX 汇集的。

这是 WPF 中最显着的变化。WPF 不是 GDI/GDI+ 的包装器。相反,它是一个替代品——一个通过 DirectX 工作的单独层。

WPF 可以在没有 DirectX 的情况下运行吗?

WPF 依赖于 DirectX 运行时。但是,DirectX 和 WPF 都有自己的软件回退模式,因此,在没有合适的图形硬件和/或驱动程序的情况下,将使用软件渲染来代替。软件渲染时,一些图形密集型功能也将不可用。WPF 允许您检查它正在运行的 渲染层并定制 UI 以适应当前环境。

另外,我建议您快速阅读 HAL 与 HEL,以了解不同的显卡决定了可以通过 DirectX 硬件或软件完成的操作。

图 1. DirectX 的体系结构及其与 Win32 的关系。

在此处输入图像描述

在图 1 中,您可能会注意到 DirectX 下有两个层,称为 HEL(硬件仿真层)和 HAL(硬件抽象层)。事情是这样的:DirectX 是一个非常具有前瞻性的设计,因此它假设高级功能是由硬件实现的。但是,如果硬件不支持某些功能,会发生什么?这是双模 HAL 和 HEL 设计的基础。

HAL 或硬件抽象层是“金属”层。它直接与硬件对话。该层通常是供应商提供的设备驱动程序,您可以通过通用 DirectX 调用直接与其通信。最重要的是,当您请求的功能由硬件直接支持并因此得到加速时,将使用 HAL。例如,当您请求绘制位图时,硬件 blitter 会完成工作,而不是软件循环。

当硬件不支持您请求的功能时,将使用 HEL 或硬件仿真层。假设您要求视频卡旋转位图。如果硬件不支持旋转,HEL 就会启动并由软件算法接管。显然,这比较慢,但关键是它不会破坏你的程序。它仍然可以工作——只是速度变慢了。此外,HAL 和 HEL 之间的切换对您来说是透明的。如果你要求 DirectX 做某事,而 HAL 直接做,硬件会做。否则,将调用软件仿真来使用 HEL 完成工作。

参考:

http://vishalnayan.wordpress.com/2011/05/20/windows-presentation-foundation-what-why-and-when/ http://www.yaldex.com/games-programming/0672323699_ch05lev1sec1.html

于 2013-03-19T02:34:55.833 回答
2

您可以通过将 设置为来强制Application使用软件渲染。ProcessRenderModeSoftwareOnly

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;

但是,这是在流程级别完成的,我不确定是否可以按元素完成

于 2013-03-19T02:29:10.293 回答