【问题标题】:GDI performance on Windows mobile or CE deviceWindows mobile 或 CE 设备上的 GDI 性能
【发布时间】:2010-10-11 05:52:31
【问题描述】:

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

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

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

  • 是否有人知道在 Windows CE 上提高绘图速度的任何方法。我目前正在查看来自previous question 的反馈后的 FastGraph,但这是一个稍微长期的解决方案。虽然很糟糕,但我正在为即将发布的版本寻找更快的实现方法。

【问题讨论】:

    标签: windows-mobile profiling windows-ce gdi


    【解决方案1】:

    在 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 函数的成本应该会略微降低。仍然没有批处理。

    【讨论】:

      【解决方案2】:

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

      关于个人资料的问题,我没有找到任何资料,但我确实建立了我的own

      【讨论】:

      • 在现代设备上,您可以使用 OpenVG 代替 OpenGL,后者提供硬件加速矢量图形和相对快速的软件回退,尽管我认为后者在默认情况下不可用(即在最坏的情况下) ,你必须买一个)。
      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,非常有用。一旦我知道从比例的角度来看 Win32 和 WinCE 至少是相似的,我就可以从桌面有效地分析。我担心的是 PC 上的显卡可能会扭曲结果,导致我无法正确优化。
      猜你喜欢
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2011-05-15
      • 2013-02-18
      相关资源
      最近更新 更多