6549|18

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何提高GDI绘图速度 [复制链接]

   在wince项目中,使用800x600 24位的bmp做对话框背景,发现切换的速度比较慢。背景的绘制是在OnEraseBkgnd方法中,绘制的方法是直接调用BitBlt,经测试发现绘制一次需要250毫秒以上。而且背景显示的效果是从上到下,渐渐的出来。程序运行环境为,s3c6410的开发板,wince6.0。cpu运算能力应该很强的,但是背景图显示却这么慢,是gdi的效率问题吗,希望有经验的高手解答,我分不多,回答的好,我就全给了,谢谢各位

最新回复

真的是reallyu 所说的原因。我现在用了一张32位的图,跟LCD设备的是一样。然后现在测试发现显示的时间只有140毫秒了,以前至少要250. 估计如果换成16位的,就只要几十毫秒了  详情 回复 发表于 2009-9-7 17:28
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我也遇到过类似的问题,用pictureBox做的图片按钮,处理单击事件很慢。直接使用Button就很快。
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
2440没感觉慢
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(初级)

4
 
不知yzbsd是怎么做的?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
s3c6410啊,都有这个感觉,肯定是LZ的实现有问题。

不要怀疑GDI,怀疑自己的实现方法吧!

我用的CPU主频只有s3c6410的一半,也没有遇到过这样的显示问题。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有什么好办法,又不是pc,只能这样了
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 1 楼 feishanm 的回复:
我也遇到过类似的问题,用pictureBox做的图片按钮,处理单击事件很慢。直接使用Button就很快。


难道你那么大的背景图可以很高速的切换?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
gdi一般不会很慢的啊
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 2 楼 yzbsd 的回复:
2440没感觉慢


你的背景图有我这么大分辨率吗,颜色数有24位?,难道说你的背景一下就显示出来?是用的什么方法啊
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 4 楼 91program 的回复:
s3c6410啊,都有这个感觉,肯定是LZ的实现有问题。

不要怀疑GDI,怀疑自己的实现方法吧!

我用的CPU主频只有s3c6410的一半,也没有遇到过这样的显示问题。


我是在MFC的Dialog的OnEraseBkgnd方法里面绘制的背景,调用的是BitBlt方法,据我所知,在GDI里基本没有比BitBlt效率更高的绘图函数,除了pc上drawDib之类的方法,但wince上是没有的。照你的说法,那应该是我绘制背景的地方不对?不应该在这个方法里面,对么。希望不辞聆教
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
BOOL CDlg::OnInitDialog()
{
           ....
          m_hBmBkgnd=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(BMP_MAIN));
           ....
}
void CDlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this);

                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;
        }
        else
        {
                CDialog::OnPaint();
                CClientDC  dc(this);
                CDC memDC;
                CBitmap bmBkgnd;
                bmBkgnd.Attach( m_hBmBkgnd );
                memDC.CreateCompatibleDC(&dc);
                CBitmap *pOldBm = memDC.SelectObject( &bmBkgnd );
                BITMAP bm;
                bmBkgnd.GetObject(sizeof(bm), &bm);
                dc.StretchBlt(0, 0,595,369, &memDC, 0, 0,bm.bmWidth,bm.bmHeight, SRCCOPY );
                memDC.SelectObject( pOldBm );
                bmBkgnd.Detach();
        }
}
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 
24位的位图,使用Bitblt的时候需要转换(如果你的屏是16位色的),速度比较慢,用16位色的图片会快很多
另外还可以使用函数SetDIBitsToDevice,这个可能会快点
还可以在内存中先把24位色图转成16位色565,在调用SetDIBitsToDevice输出
如果做UI的话,最好是直接使用16位色565的图片,使DIB和DDB格式保持一致速度最快,800x480的bitblt应该在几十ms
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
使用双缓冲可以避免从上到下的显示效果,但对于速度提高没有帮助
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 reallyu 的回复:
24位的位图,使用Bitblt的时候需要转换(如果你的屏是16位色的),速度比较慢,用16位色的图片会快很多
另外还可以使用函数SetDIBitsToDevice,这个可能会快点
还可以在内存中先把24位色图转成16位色565,在调用SetDIBitsToDevice输出
如果做UI的话,最好是直接使用16位色565的图片,使DIB和DDB格式保持一致速度最快,800x480的bitblt应该在几十ms


学习!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用楼主 qwqwqw408 的回复:
? 在wince项目中,使用800x600 24位的bmp做对话框背景,发现切换的速度比较慢。背景的绘制是在OnEraseBkgnd方法中,绘制的方法是直接调用BitBlt,经测试发现绘制一次需要250毫秒以上。而且背景显示的效果是从上到下,渐渐的出来。程序运行环境为,s3c6410的开发板,wince6.0。cpu运算能力应该很强的,但是背景图显示却这么慢,是gdi的效率问题吗,希望有经验的高手??

我们200m的都没有出现这些问题,lz可不要这么轻易怀疑gdi啊
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 amorous 的回复:
引用楼主 qwqwqw408 的回复:
? 在wince项目中,使用800x600 24位的bmp做对话框背景,发现切换的速度比较慢。背景的绘制是在OnEraseBkgnd方法中,绘制的方法是直接调用BitBlt,经测试发现绘制一次需要250毫秒以上。而且背景显示的效果是从上到下,渐渐的出来。程序运行环境为,s3c6410的开发板,wince6.0。cpu运算能力应该很强的,但是背景图显示却这么慢,是gdi的效率问题吗,希望有经验的高手??

我们200m的都没有出现这些问题,lz可不要这么轻易怀疑gdi啊


我用的是飞思卡尔的板子,400M,显示一副700K的位图,可以明显的看到从上到下的过程,使用的是双缓冲。我都怀疑400M太慢了,你200M的怎么做到的啊?指教一下吧
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 10 楼 yzbsd 的回复:
BOOL CDlg::OnInitDialog()
{
? ? ? ? ? ....
? ? ? ? ? m_hBmBkgnd=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(BMP_MAIN));
? ? ? ? ? ....
}
void CDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);

int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
}
else
{
CDialog::OnPaint();
CClientDC? dc(this);
CDC memDC;
CBitmap bmBkgnd;
bmBkgnd.Attach( m_hBmBkgnd );
memDC.CreateCompatibleDC(&dc);
CBitmap *pOldBm = memDC.SelectObject( &bmBkgnd );
BITMAP bm;
bmBkgnd.GetObject(sizeof(bm), &bm);
dc.StretchBlt(0, 0,595,369, &memDC, 0, 0,bm.bmWidth,bm.bmHeight, SRCCOPY );
memDC.SelectObject( pOldBm );
bmBkgnd.Detach();
}
}

我试了下,好像没什么改变,显示的效果还是那样,有个刷的过程,图片的显示不是一瞬间就显示出来的。哎,估计也就只能这效果了。毕竟不是pc机,cpu实在太弱小了。谢谢你的答复
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 11 楼 reallyu 的回复:
24位的位图,使用Bitblt的时候需要转换(如果你的屏是16位色的),速度比较慢,用16位色的图片会快很多
另外还可以使用函数SetDIBitsToDevice,这个可能会快点
还可以在内存中先把24位色图转成16位色565,在调用SetDIBitsToDevice输出
如果做UI的话,最好是直接使用16位色565的图片,使DIB和DDB格式保持一致速度最快,800x480的bitblt应该在几十ms


感觉有可能是这个问题,我是24位的图,我们开发板的LCD是32位的,难道说显示的时候把图片差值到了32位?
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

19
 
真的是reallyu 所说的原因。我现在用了一张32位的图,跟LCD设备的是一样。然后现在测试发现显示的时间只有140毫秒了,以前至少要250. 估计如果换成16位的,就只要几十毫秒了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表