我有一个使用大量矢量图形的Windows CE应用程序,并且在某些地方非常慢。我目前正在使用GDI通过位图进行渲染,以实现无闪烁刷新。通常情况下,我正在看一个大型3D地图的一部分。在某些设备上(例如166mhz SH4),对于大数据集,这会使3-5秒的刷新时间变慢。我的问题是这个;
是否有人对Windows Mobile与Win32的图形操作的相对速度进行了任何比较。换句话说,假设我们只是在寻找GDI调用,是从适用于WinCE版本的软件的Win32版本中分析结果。
有没有人尝试在WinCE平台(C ++应用程序)上进行性能分析,如果有的话,使用什么工具。
是否有人知道在Windows CE上提高绘图速度的方法。我目前正在根据previous question的反馈来查看FastGraph,但这是一个稍长期的解决方案。糟糕的是,我正在为即将发布的版本寻找更快的东西。
答案 0 :(得分:5)
在Windows CE 6.0之前 - 因此包括所有Windows Mobile / Windows Embedded Handheld版本 - 图形代码在另一个进程(GWES.EXE)中实现,每次进行GDI调用时都需要进行跨进程调用。 CE 5.x跨进程调用比在桌面上便宜得多,但仍然比普通函数调用或调用内核模式更昂贵。
在桌面上,自NT 4.0以来,GDI在内核模式下实现。在原始的NT 3.1中,它就像CE模型,跨进程调用。为了减轻跨进程调用或用户/内核模式切换的开销,桌面GDI在用户模式端批量操作,直到您执行需要刷新队列的操作 - 例如选择不同的笔或画笔,或使用一个返回除BOOL
以外的其他内容的遗留函数 - 或者缓冲区已满,或者通过调用GdiFlush
显式刷新它。
Windows CE没有此批处理功能 - 所有调用都会导致直接调用GWES进程,从而使其速度变慢。您可以通过在每次调用中尽可能多地完成工作来缓解它。如果您需要复杂的线路,请考虑使用Polyline而不是单独的MoveToEx / LineTo调用。尝试仅触摸每个像素一次而不是渲染重叠对象,并使用无效区域仅绘制需要重新绘制的部分屏幕(使用GetUpdateRgn
或GetUpdateRect
,但在调用{{BeginPaint
之前执行此操作1}},标记区域有效。)
CE图形加速模型非常基础,基于bit-blits。它不支持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函数的成本应该略微降低。仍然没有批处理。
答案 1 :(得分:2)
我对图形方面的知识并不多,但从经验来看,如果你想快速处理某些特定的硬件相关事物,那么越接近“金属”就越快(并且越难)它得到!)。所以你可以考虑使用Direct Draw或Direct 3D(虽然我认为他们正在放弃D3D并转向使用OpenGL ES for WM7)。您可能希望了解游戏开发者使用的方式。
关于个人资料的问题,我没有发现任何问题,但我确实构建了own。
答案 2 :(得分:1)
我已经做了很多这样的基准测试,并且在WinCE上的GDI操作比常规的Win32慢,但只比WinCE设备上较慢的处理器的比例慢。换句话说,在WinCE中使用GDI似乎没有任何额外的性能损失。
抱歉,我对你最后两个问题没有答案。