2

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

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

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

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

4

3 回答 3

5

在 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 图形加速模型是相当基本的,基于位块。它不支持 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 函数的成本应该会略微降低。仍然没有批处理。

于 2011-08-14T10:43:04.093 回答
2

我对图形方面的知识并不多,但从经验来看,如果你想在某些特定的硬件相关的事情上做得更快,那么你越接近“金属”,你就能越快(而且越难! )。所以你可以考虑使用Direct DrawDirect 3D(尽管我认为他们正在放弃 D3D 并转向 WM7 的 OpenGL ES)。您可能想了解游戏开发人员的使用方式。

关于 Profiles 的问题,我没有找到任何东西,但我确实建立了自己的.

于 2009-03-10T05:57:05.413 回答
1

我已经做了很多此类基准测试,WinCE 上的 GDI 操作比常规 Win32 慢,但仅与 WinCE 设备上较慢的处理器成比例。换句话说,在 WinCE 中使用 GDI 似乎没有任何额外的性能影响。

抱歉,我没有你最后两个问题的答案。

于 2009-03-04T12:22:11.887 回答