C#.NET CF在wince描绘界面出现的问题

lonyjianhui 2011-05-17 05:51:06
我用C#写了个在Windows CE系统的界面,是用GDI写的,但是,无论如何也达不到速度要求(双缓冲都用到了),不知道如何提高,下面是代码,希望大家帮忙看看。其效果是先显示了黑色背景,之后就停顿了一会儿,再整个界面显示,就是说停顿的那一小段时间太长了,不知道是什么问题导致的。我该怎么做才可以提高速度?

建立一个窗体,重写OnPaint事件

protected override void OnPaint(PaintEventArgs e)
{
XmlDocument projectD = new XmlDocument();
projectD.Load(@"\Program Files\SmartDeviceProject2\writerXml.xml");//关于十几张图片的路径和位置等信息
XmlNodeList list = projectD.SelectNodes(@"project/languagevector/language[@name='中文简体']/pagevector/page[@name='page_menu']/objectvector/object");
e.Graphics.FillRectangle(new SolidBrush(Color.Black), 0, 0, 800, 480);//窗体背景为黑色

foreach (XmlNode node in list)
{

string path = null; //图片路径
string pos = node.Attributes["pos"].InnerXml; //图片大小和位置
try
{
path = node.ChildNodes[0].Attributes["image"].InnerXml;
}
catch
{
path = node.Attributes["name"].InnerXml;
}
RGDI.SetCanvas(new Bitmap(@"\Resources\" + path), new Point(int.Parse(pos.Split(',')[0]), int.Parse(pos.Split(',')[1])));//在内存创建画布并画图
}
RGDI.Draw(e.Graphics);//把在内存画的图画在窗体上
}



下面是RGDI类:

class RGDI
{
private static Image Canvas = new Bitmap(800, 480);
/// <summary>
/// 把画布画在窗体上
/// </summary>
/// <param name="g"></param>
public static void Draw(Graphics g)
{

Bitmap bm = new Bitmap(Canvas);
g.DrawImage(bm, 0, 0);
}
/// <summary>
/// 创建画布
/// </summary>
/// <param name="image"></param>
/// <param name="point"></param>
/// <returns></returns>
public static Image SetCanvas(Image image, Point point)
{
Bitmap bt = new Bitmap(Canvas);
Graphics gs = Graphics.FromImage(bt);
gs.DrawImage(image,point.X, point.Y);
gs.Dispose();
Canvas = bt;

return bt;
}
/// <summary>
/// 创建新空白画布
/// </summary>
public static void SetNewCanvas()
{
Canvas.Dispose();
Canvas = new Bitmap(800, 480);
}
}

...全文
162 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonyjianhui 2011-05-18
  • 打赏
  • 举报
回复
错了,是2楼的预处理
lonyjianhui 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sjzlxd 的回复:]
CE显卡的问题,pc上就算是集成显卡 要比ce上快1万倍. 做ce程序主要考虑的就是cpu和显卡内存太弱的问题.
[/Quote]

我知道,所以一般是画界面前都是有另一步处理的:XML和图片都是二进制流,直接在内存读取。
我就是想找个方案解决那一步问题,也就是3楼说的预处理。
人工智能算法 2011-05-18
  • 打赏
  • 举报
回复
CE显卡的问题,pc上就算是集成显卡 要比ce上快1万倍. 做ce程序主要考虑的就是cpu和显卡内存太弱的问题.
am 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 csz_1987 的回复:]

其效果是先显示了黑色背景,之后就停顿了一会儿,再整个界面显示,就是说停顿的那一小段时间太长了,不知道是什么问题导致的。我该怎么做才可以提高速度?


停顿的时间太长了是因为你程序执行很多耗时的操作。
在这种移动设备上IO速度,跟PC上又是差一个档次的。
你先是读取了XML,然后再根据XML内的节点,读取了十几张图片,
再对图片进行绘制。这个不卡都不可能。

你可以预读取XML,和……
[/Quote]
同意
在这个事件调用太频繁了,使用局部重绘是不是会好一点
protected override void OnPaint(PaintEventArgs e)
lonyjianhui 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 csz_1987 的回复:]
其效果是先显示了黑色背景,之后就停顿了一会儿,再整个界面显示,就是说停顿的那一小段时间太长了,不知道是什么问题导致的。我该怎么做才可以提高速度?


停顿的时间太长了是因为你程序执行很多耗时的操作。
在这种移动设备上IO速度,跟PC上又是差一个档次的。
你先是读取了XML,然后再根据XML内的节点,读取了十几张图片,
再对图片进行绘制。这个不卡都不可能。

你可以预读取XML,和那……
[/Quote]

分析得很好,希望可以解决,我想问一下怎么"预读取XML”啊?工作一年了,还没遇到过需要"预"的地方,所以不太懂,我感觉ActiveX(OCX)控件是个很好的"预"的解决方案,但是,C#做不了这个控件,哭死我了。。。
csz_1987 2011-05-18
  • 打赏
  • 举报
回复
其效果是先显示了黑色背景,之后就停顿了一会儿,再整个界面显示,就是说停顿的那一小段时间太长了,不知道是什么问题导致的。我该怎么做才可以提高速度?


停顿的时间太长了是因为你程序执行很多耗时的操作。
在这种移动设备上IO速度,跟PC上又是差一个档次的。
你先是读取了XML,然后再根据XML内的节点,读取了十几张图片,
再对图片进行绘制。这个不卡都不可能。

你可以预读取XML,和那十几张图片,将图片保存在一个静态字典或列表里,
然后再绘制黑色背景,最后再绘制静态字典或列表里的十几张图片,
绘制的时候采用双缓冲结合局部刷新,应该速度会有所改观,
特别是将图片保存为静态的,绘制速度会快很多。
lonyjianhui 2011-05-18
  • 打赏
  • 举报
回复
基本上差不多了,结贴吧,谢谢各位大侠的帮忙,特别是2楼的csz_1987,再次感谢你。
lonyjianhui 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 csz_1987 的回复:]
引用 7 楼 lonyjianhui 的回复:

错了,是2楼的预处理


就是在程序启动的时候就读取啊,你现在的做法是,到要用的时候在读取。
打个比方吧,很多大型软件、系统在启动的时候都会做一个Splash Window,
然后会有一个进度条提示用户当前一些程序集或者一些配置数据加载的进度,
这个过程其实就是对程序运行需要的一些资源进行预读取啊,预先读入内存,
保存为全局静态形……
[/Quote]
很好,我也是刚刚问C++的同事才搞明白的,听你这么一说我更加明白了,非常谢谢,为了程序运行的顺畅,不得不牺牲内存啊,第一次搞Windows CE,才知道原来这个系统的IO那么耗时的。
csz_1987 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lonyjianhui 的回复:]

错了,是2楼的预处理
[/Quote]

就是在程序启动的时候就读取啊,你现在的做法是,到要用的时候在读取。
打个比方吧,很多大型软件、系统在启动的时候都会做一个Splash Window,
然后会有一个进度条提示用户当前一些程序集或者一些配置数据加载的进度,
这个过程其实就是对程序运行需要的一些资源进行预读取啊,预先读入内存,
保存为全局静态形式的,等你要用的时候,直接从内存里读取就行。
这样响应速度比你每次都进行IO操作快多了。缺点就是对内存占用比动态读取的大。

你现在代码里的做法是到要用的时候采取读取,实例化,绘制。你完全可以预先读取,实例化。
等到你要用的时候,直接绘制就行了。IO操作是特别耗时的,而你代码里写的,很多有都是对IO的操作。
用一次,对IO操作一次。当然你这种做法也有好处,就是省内存,用的时候读取,不用的时候释放。
弊端就是IO操作很慢,所以导致你要等待。

利弊自己权衡。
lonyjianhui 2011-05-17
  • 打赏
  • 举报
回复
自己顶下,希望可以在这里找到解决方法

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧