windows-mobile - Windows 移动设备或 CE 设备上的 GDI 性能

标签 windows-mobile profiling windows-ce gdi

我有一个 Windows CE 应用程序,它使用大量矢量图形并且在某些地方非常慢。我目前正在使用 GDI 通过位图进行渲染以实现无闪烁刷新。通常,我会在大型 3d map 的一部分上开窗。在某些设备上(例如 166mhz SH4),大数据集的刷新时间为 3-5 秒,这会变慢。我的问题是这样的;

  • 有没有人比较过 Windows Mobile 和 Win32 上图形操作的相对速度。换句话说,是适用于 WinCE 版本的软件的 Win32 版本的分析结果,假设我们只查看 GDI 调用。

  • 有没有人尝试过在 WinCE 平台(C++ 应用程序)上进行性能分析,如果有,使用什么工具。

  • 是否有人知道在 Windows CE 上提高绘图速度的方法。我目前正在根据 previous question 的反馈查看 FastGraph ,但这是一个稍微长期的解决方案。尽管如此,我正在为即将发布的版本寻找更快实现的东西。

最佳答案

在 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 调用。尝试只触摸每个像素一次而不是渲染重叠对象,并利用无效区域只绘制需要重绘的屏幕部分(使用 GetUpdateRgnGetUpdateRect 但是在调用标记该区域有效的 BeginPaint 之前执行此操作)。

CE 图形加速模型是相当基础的,基于位 block 传输。它不支持 Windows 2000 型号桌面设备驱动程序所支持的更大的功能集。是否可以使用任何加速取决于硬件是否有加速芯片——许多设备将使用嵌入在应用处理器中的 LCD Controller ,它通常不做任何加速。

您可以通过禁用批处理来模拟 CE 在桌面上的行为,使用 GdiSetBatchLimit 将限制设置为 1。还可以考虑使用 SVGA 图形驱动程序来禁用加速。在 Windows Vista 或 Windows 7 上,如果您使用的是 Aero 环境,则不会加速 GDI,所有操作都在软件中实现,尽管 Windows 7 重新添加了一些新的位 block 传输硬件加速功能。

Windows CE 6.0 有一个新的内核和进程模型,它将 GDI 移动到内核模式,就像在桌面 Windows(Vista 之前)上一样,因此调用 GDI 函数的成本应该会略微降低。仍然没有批处理。

关于windows-mobile - Windows 移动设备或 CE 设备上的 GDI 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/610185/

相关文章:

c# - 导出数据到excel mobile

c - 如何分析 R 包中的底层 C 代码?

php - PHP 的范围 ('A' , 'Z' ) 是否返回一个静态数组?

c++ - 删除文件,C++,WinCE

windows-ce - win CE 中静音应用程序音量

android - 多平台应用程序开发与操作系统开发

javascript - 内存受限设备上的脚本串联性能特征

c# - Windows Mobile 图形用户界面选项

c++ - 从注册表项中提取多个 IClass 值

tomcat - Tomcat 服务器缺少 VisualVM 分析选项卡