我有一个使用大量矢量图形的Windows CE应用程序,并且在某些地方非常慢.我目前正在使用GDI通过位图进行渲染,以实现无闪烁刷新.通常情况下,我正在看一个大型3D地图的一部分.在某些设备上(例如166mhz SH4),大数据集的刷新时间为3-5秒.我的问题是这个;
有没有人对Windows Mobile与Win32的图形操作的相对速度进行任何比较.换句话说,假设我们只是在寻找GDI调用,是从适用于WinCE版本的软件的Win32版本中分析结果.
有没有人尝试在WinCE平台(C++应用程序)上进行性能分析,如果是的话,使用什么工具.
是否有人知道任何提高Windows CE绘图速度的方法.我目前正在关注FastGraph 之前的问题反馈,但这是一个稍长期的解决方案.糟糕而且全部都是这样,我正在为即将发布的版本更快地寻找更好的东西.
Mike Dimmick.. 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
,这标记区域有效).
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函数的成本应该略微降低.仍然没有批处理.
在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
,这标记区域有效).
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函数的成本应该略微降低.仍然没有批处理.