在 Windows CE 6.0 之前 - 因此包括所有 Windows Mobile/Windows Embedded Handheld 版本 - 图形代码是在另一个进程 (GWES.EXE) 中实现的,每次进行 GDI 调用时都需要跨进程调用。CE 5.x 的跨进程调用比在桌面上便宜得多,但仍然比普通函数调用或内核模式调用更昂贵。
在桌面上,GDI 从 NT 4.0 开始以内核模式实现。在最初的 NT 3.1 中,它就像 CE 模型,跨进程调用。为了减轻跨进程调用或用户/内核模式切换的开销,桌面 GDI 会在用户模式端对操作进行批处理,直到您执行需要它来刷新队列的操作——比如选择不同的笔或画笔,或者使用一个的遗留函数返回的东西不是BOOL
- 或者缓冲区已满,或者您通过调用显式刷新它GdiFlush
。
Windows CE 没有这种批处理功能——所有调用都会导致直接调用 GWES 进程,从而使其速度变慢。您可以通过在每次通话中做尽可能多的工作来缓解它。如果您需要复杂的线,请考虑折线而不是单独的 MoveToEx/LineTo 调用。尝试只触摸每个像素一次而不是渲染重叠的对象,并利用无效区域仅绘制需要重新绘制的屏幕部分(使用GetUpdateRgn
或GetUpdateRect
但在调用之前执行它BeginPaint
,这标志着该区域有效)。
CE 图形加速模型是相当基本的,基于位块。它不支持 Windows 2000 型桌面设备驱动程序支持的更多功能。是否有任何加速功能取决于硬件是否甚至有加速芯片——许多设备会使用嵌入在应用处理器中的 LCD 控制器,它通常不做任何加速。
您可以通过禁用批处理来模拟 CE 在桌面上的行为,使用GdiSetBatchLimit
将限制设置为 1。还可以考虑使用 SVGA 图形驱动程序禁用加速。在 Windows Vista 或 Windows 7 上,如果您使用 Aero 环境,则不会加速 GDI,所有操作都在软件中实现,尽管 Windows 7 添加了一些新的 bit-blit 硬件加速功能。
Windows CE 6.0 有一个新的内核和进程模型,它将 GDI 移动到与桌面 Windows(Vista 之前)一样的内核模式,因此调用 GDI 函数的成本应该会略微降低。仍然没有批处理。