GDI on Windows Mobile--托管代码和本地代码的性能比较

在论坛或者邮件组里经常会有朋友提到,要想提高图形应用程序的性能必须要使用本地代码(C/C++)来开发。我们也经常听说本地代码在三维图形的操作上要比托管代码快得多。然而,事实并非完全如此,本文会通过多个平台上的实验数据来探讨托管代码和本地代码在图形操作上的性能问题。KeywordsGDI, C++, C#, Windows Mobile, .NET Compact Framwork, performance本地代码测试我们先来看看本地代码测试程序。代码很简单,仅仅是为了测试。这段程序绘制了一个矩形位图域并创建了相应的DC(device context),然后重复10000次以下两个操作:一是不断的用灰色填充矩形域,二是不断在矩形域中间绘制绿色的椭圆。这里椭圆的长轴短轴都是在不断变化的,这可以避免显示驱动缓存对我们的测试造成的影响。主要代码如下:

...
screenDC = GetWindowDC(NULL);
bufferDC = CreateCompatibleDC(screenDC);
oldPen = (HPEN)SelectObject(bufferDC, CreatePen(PS_NULL, 0, NULL));
oldBrush = (HBRUSH)SelectObject(bufferDC, CreateSolidBrush(#00ff00));
hBufferBmp = CreateCompatibleBitmap(screenDC, BOX_WIDTH, BOX_HEIGHT);
oldObject = SelectObject(bufferDC, hBufferBmp);
rect.top = 0;
rect.left = 0;
rect.right = BOX_WIDTH;
rect.bottom = BOX_HEIGHT;
for(i = 0 ; i < GDI_ITERATIONS_PER_REPORT ; i++)
{
width += xop;
height+= yop;
if((width >= BOX_WIDTH) || (width <= 0))
xop *= -1;
if((height >= BOX_HEIGHT) || (height <= 0))
yop *= -1;
r += rop;
g += gop;
b += bop;
if((r > 254) || (r< 1))
rop *= -1;
if((g > 254) || (g< 1))
gop *= -1;
if((b> 254) || (b< 1))
bop *= -1;
boxBrush = CreateSolidBrush(RGB(r, g, b));
FillRect(bufferDC, &rect, boxBrush);
DeleteObject(boxBrush);
Ellipse(bufferDC, width, height, BOX_WIDTH - width, BOX_HEIGHT - height);
Ellipse(bufferDC, height, width, BOX_WIDTH - height, BOX_HEIGHT - width);
BitBlt(screenDC, left, top, left + BOX_WIDTH, top + BOX_HEIGHT,
bufferDC, 0, 0, SRCCOPY);
}
...

运行效果如图:


测试结果是,在Windows Mobile 5.0的模拟器上,执行循环的速度为490次每秒(当然这跟你PC机的性能是有关的)。每一次操作包括了填充矩形和绘制两个椭圆的过程。在一台Windows Mobile 5.0 Dell Axim x51(PXA270处理器)的实际设备上,这个程序可以达到250次每秒的循环速度。

时间: 2024-10-31 15:13:28

GDI on Windows Mobile--托管代码和本地代码的性能比较的相关文章

Windows Mobile 6.5中使用手势

这个语言参考部分包含了对触摸事件.手势.以及手势动画等编程元素的描述. 触摸API分为两个部分,管理触摸输入的手势API,和控制显示区域如何对用户触摸作出反应的手势物理引擎API. 触摸函数.消息.以及结构体是与鼠标共享的,因为应用程序像处理鼠标左键单击一样处理手写笔事件.想了解其他触摸参考信息,请转到鼠标参考. 索引 触摸手势 介绍窗口触摸,并讨论如何在你的应用程序中实现触摸接口. 手势参考(DTK) 这个API允许你的程序监视触摸输入并对触摸输入进行编程. 物理引擎概览 介绍了物理引擎,以及

艾伟_转载:Windows Mobile开发,Native C++ PK .NET Compact Framework

缘由 经常听到一些刚刚接触Windows Embedded CE和Windows Mobile开发的人会提出一些疑问.进行Windows Mobile开发,到底使用什么语言呢?C++还是C#?Java行不行?下面就我自己的想法讲述一下Native C++ 和 .NET Compact Framework的异同和选择.   什么是Native Native翻译成原生,Native是使用C,C++或者汇编等语言代码编写的,编译成处理器相关的binary文件(执行文件,DLL等可执行文件), 关于可执

Windows Mobile设备常见开发任务

摘要:移动开发者社区开发杂志<Windows Phone应用开发专题 第一季>中我参与编写的部分,<Windows Mobile设备常见任务开发>.主要介绍了Windows Mobile中最常见的几个开发任务,如拨打电话.发送短信.联系人管理等等.此为索引页. 第四日 常用设备相关任务开发 序言 今天我们来了解一下在Windows Phone设备中,用托管代码进行常用任务的开发.本章所介绍的,是Windows Phone开发中最最常见的几个简单任务. 内容简介 本章主要包含三个小节

Windows Mobile 6开发环境的配置过程

需要的文件列表: 1.Visual Studio 2005 Professional及更高的版本(Visual Studio 2005 Express目前并不支持智能设备开发)(推荐用迅雷或者电骡下). 2.Visual Studio 2005 的补丁SP1 (推荐用迅雷或者电骡下) 3. ActiveSync版本4.5 (http://download.microsoft.com/download/7/e/c/7ecbd388-7fb5-4e3e-b57f-12eaf7eb6136/setup

Wince和Windows Mobile下native C++的单元测试

单元测试(Unit Test)已经成为开发过程中不可分割的一部分,也是refactoring的基础,在Wince和Windows Mobile开发native C++时可以使用CppUnitLite进行单元测试. 在其他平台开发C++的时候,我一直使用CppUnit进行单元测试,可是CppUnit不支持Wince平台,因此在Wince下选择CppUnitLite进行单元测试.CppUnitLite是CppUnit的作者Michael Feathers重新开发的针对C++的单元测试框架.其开发目的

Windows Mobile开发者新手上路指南

Part 1.开发环境的搭建 软件安装顺序: 1.安装Microsoft ActiveSync 4.0以上版本 2.安装VS2005 开发Pocket PC需安装Windows Mobile 5.0 Pocket PC SDK 开发Smartphone需安装Windows Mobile 5.0 Smartphone SDK Mobile 5.0环境配置: 1.模拟器与Microsoft ActiveSync同步: A.启动VS2005,在Tools->Device Emulator Manage

Windows Mobile 7重点改进触摸手势功能

微软目前正在开发的Windows Mobile 7将产生WM系统发布以来在操控上的第一次革命性变化. 最近一份来自微软的文档显示,微软将对Windows Mobile 7的触摸感应作重大调整,用来解释该计划的设计图纸高达一百多页. 并且几乎可以确定会引入手势和感应反馈功能,这些功能将成为WM7的关键卖点.以下就是来自该文档的相关图片,我们从图中可以非常清楚地看到WM7的新操作方式.

Windows Mobile中如何建立GPRS连接以便Socket能正常通信

最近编写一个医疗项目的程序,需要用 Windows Mobile 来做通信处理,需要将手机端的数据通过GPRS传送至公网上的一个服务器上.数据传输我采用的是socket,用数据线+ActiveSync调试通过,数据传输正常,在准备将软件提交给质检部门的时候,用真正的GPRS来做通信测试时,问题出来了,连接始终建立不了,但用手机的IE浏览器却能正常打开网页,而且奇怪的是只要用IE浏览器成功访问过一次网页,我的 socket 就能正常进行数据通信,看来传说中的GPRS常连接被我误解了. 手机开通GP

在Windows mobile的控制面板中添加应用

在Windows mobile系统中,用户可以通过设置来访问控制面板的应用程序,软件开发人员也可以通过Windows mobile提供的API函数来访问控制面板的一些信息,例如可以向其中增加一个控制面板的应用. 控制面板应用程序实现为一个Dll中,但必须以cpl为后缀,它导出一个回调函数: LONG CPlApplet(HWND hwndCPl, UINT msg, LPARAM lParam1, LPARAM lParam2); 在用户点击设置时,ctlpnl.exe进程会通过调用CPlApp