代码改变世界

.NETCF图形和用户界面性能(摘自《编写移动代码》)

2008-09-10 12:14  cppguy  阅读(1132)  评论(1编辑  收藏  举报

   好看的图形如同一件设计完美的艺术品一样:这意味着技术和设计是同等重要的。在一个屏幕上画一个单个举行或者一个单一的文本片段将运行足够快。在视觉屏幕取画一个复杂的图形或者一个“正在飞行”的游戏图板很可能会导致质量很差的用户体验。考虑一下画复杂的图标实例需要用1.5秒时间的情况,这个时间超出了人的最小反应时间,人的视力可以识别在这个时间间隔内发生的离散事件。比如画一个图标,绘制过程包括画一个背景图像,绘制图标的轴,在图标上画线,在实际数据所指的地方画上小点,生成代表每个数据系列的颜色列表,如果在用户面前这样做,结果是导致非常混乱的视觉效果。如果目标是为静态游戏制作,结果更糟糕:在这个实例中,当食物在屏幕上移动和显示时,用户将会感到剧烈的闪烁。

   不在用户的视觉内画图的第二个理由是,用户界面位图空间是易变的。与代码属于自身屏幕外位图不同,屏幕上的空间是所有正在运行的应用的窗口和控件以及操作系统共享的资源。许多操作系统并不维护可能画到用户界面的图像。如果另一个应用的对话框出现在你的代码绘画的窗口之前,这意味着你将失去所画的任何图像。

   审美效果更好并且几乎不会出错的方法是,在屏幕外缓冲区绘制图形,当绘制完成后再将结果拷贝到前台。这种方法也是可以只的俄日期俄容易设计,管理和调试。这样不需要学习错综复杂的操作系统的绘画模式,你的应用可以在它自己的易于理解的环境中完成绘画,同时只有当工作完成时,才输出到用户界面。一个屏幕外绘画方法几乎总是用于任何复杂图标擦欧洲哦的最好方法,接管当图像正在处理时,你需要一个等待光标。

     .NET CF有两种把屏幕外绘画一道用户界面的方法。第一种使用一个PictureBox控件,并用你刚刚绘制完成的位图设置它的Image属性。

      第二种方法是从用户界面元素获得Graphic对象,并调用Graphic.DrawImage()完成图像转移:

    特别值得注意对于Graphics.DrawImage()有几个重载放阿飞可以使用。上面所列举的是最简单和最快的方法;它只需要从一个位图获得数据,同时它们拷贝到另一个位图中。其他的重载提供更复杂的功能,如只将原图像的特定区域画如目标图像中,拉长或者收缩被拷贝的图像,以及一个图像中使用透明的屏蔽等,当从源向目标拷贝图像时,这些重载完成某一类的转换。通常情况下,在图像拷贝期间,你的代码希望完成转换越复杂,它完成的代价也越复杂。

    维持好的工作性能的最好方法之一是使源和目标位图尽可能匹配。如果可能的话,确保图像转移是1:1的按喂复制,而没有被拉长或收缩。只有当需要时才使用透明屏蔽。其他的运行时间框架肯呢个提供图像中使用的颜色数量和颜色浓度的选择,尽管当时用.NETCF时不会遇到这个问题。保持这些信息在源和目标之间的一致,可以极大提高性能。总的目标是消除任何不匹配的现象,使图像转移操作尽可能地与内存直接拷贝操作类操作,直接内存拷贝在所有平台上性能都是最优的。