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

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

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

  • 有谁知道有什么方法可以提高 Windows CE 上的绘图速度。我目前正在根据来自 a 的反馈查看 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 进程的直接调用,从而使其速度慢很多。您可以通过在每次调用中执行尽可能多的工作来缓解这种情况。如果您需要复杂的线,请考虑 Polyline 而不是单独的 MoveToEx/LineTo 调用。尝试只触摸每个像素一次,而不是渲染重叠的对象,并利用无效区域仅绘制屏幕上需要重新绘制的部分(使用 GetUpdateRgn 或者 GetUpdateRect 但在打电话之前要这样做 BeginPaint, ,这标志着该区域有效)。

CE 图形加速模型相当基础,基于位块传输。它不支持 Windows 2000 型号桌面设备驱动程序支持的更多功能。是否提供加速取决于硬件是否具有加速器芯片 - 许多设备将使用嵌入在应用处理器中的 LCD 控制器,该控制器通常不进行任何加速。

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

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

其他提示

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

关于配置文件的问题,我还没有找到任何配置文件,但我确实建立了我的配置文件 自己的.

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

抱歉,我无法回答您最后两个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top