OnPaint函数中bitblt速度慢的问题~

abo77281 2011-05-02 06:44:37
在2440上面用VC来做摄像头显示,发现bitblt来画图,速度好慢,不知道有没有解决这个问题的办法?

OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{

PAINTSTRUCT ps;
HDC hdc,hdcMem;
HDC hdcBmp;
HDC hdcBmpShizi;
HBITMAP hBmpBuffer;


hdc = BeginPaint(&ps);

hdcMem = CreateCompatibleDC(hdc);
hBmpBuffer = CreateCompatibleBitmap(hdc, m_dimScreen.x, m_dimScreen.y);
SelectObject(hdcMem, hBmpBuffer);


//画背景 这部分要50ms
hdcBmp = CreateCompatibleDC(hdc);
SelectObject(hdcBmp, m_hBmpBack);
BitBlt(hdcMem, 0, 0, m_dimScreen.x, m_dimScreen.y, hdcBmp, 0, 0, SRCCOPY);
DeleteDC(hdcBmp);
//画背景结束

//视频源 这部分要20ms
Test(hdcMem);
//视频源 结束

//视频源上面叠加一些图像,这部分要50ms
hdcBmpShizi = CreateCompatibleDC(hdcMem);
SelectObject(hdcBmpShizi, m_hBmpShizi);
TransparentBlt(hdcMem, 0, 0, 230, 230, hdcBmpShizi, 0, 0, 230, 230, RGB(0xff,0xff,0xff));
DeleteDC(hdcBmpShizi);

//双缓冲,贴到设备hdc,这部分要60ms
BitBlt(hdc, 0, 0, m_dimScreen.x, m_dimScreen.y, hdcMem, 0, 0, SRCCOPY);


DeleteDC(hdcMem);
DeleteObject(hBmpBuffer);

EndPaint(&ps);

return 0;
}

视频显示要求1s内显示15图片,现在的这个速度也忒慢了。
...全文
1137 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq449224404 2013-03-29
  • 打赏
  • 举报
回复
哈哈哈 受用了
abo77281 2011-05-09
  • 打赏
  • 举报
回复
GDI看来是没有办法满足这个条件了~
abo77281 2011-05-05
  • 打赏
  • 举报
回复
直接写屏最省事~
littleblack1987 2011-05-04
  • 打赏
  • 举报
回复
貌似BitBlt 贴张480*272的24位图片也就几 ms吧(主频还不到400M),莫非视频图片不一样?
littleblack1987 2011-05-04
  • 打赏
  • 举报
回复
主,我错了,我只考虑了BitBlt(。。。); 的时间。。。
abo77281 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 littleblack1987 的回复:]
貌似BitBlt 贴张480*272的24位图片也就几 ms吧(主频还不到400M),莫非视频图片不一样?
[/Quote]

2440,320*240 24bit的图片要40ms左右~
abo77281 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 crystal28 的回复:]
我没说opengl啊,和opengl没有关系。
先搞懂directdraw或gapi的写屏方式
[/Quote]

哎~~
现在什么都没有搞懂~~
呵呵
abo77281 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qinqindog 的回复:]
WinCE5用StretchDIBits比用bitblt快得多,原来测试过。你可以试试。
[/Quote]

StretchDIBits是比bitblt要快,但是总的速度还是没有办法满足一秒钟刷50次屏的要求~
呵呵~
Ei 2011-05-03
  • 打赏
  • 举报
回复
那改DDraw 或者 直接写屏吧。。。没注意到你是用2440
bitblt 速度也就那样了,确实相对会慢一些,你测一下就知道了//
「已注销」 2011-05-03
  • 打赏
  • 举报
回复
从道理上讲不会出现这种情况
[Quote=引用 14 楼 qinqindog 的回复:]

WinCE5用StretchDIBits比用bitblt快得多,原来测试过。你可以试试。
[/Quote]
「已注销」 2011-05-03
  • 打赏
  • 举报
回复
我没说opengl啊,和opengl没有关系。
先搞懂directdraw或gapi的写屏方式
JimsdogV1 2011-05-03
  • 打赏
  • 举报
回复
WinCE5用StretchDIBits比用bitblt快得多,原来测试过。你可以试试。
abo77281 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aaa_tnt 的回复:]
CreateDIBSection创建一个16bit,然后往里面填从摄像头采集RGB数据。
关于内存泄漏例如,SelectObject要把原来dc中的obj做一个交换,
HGDIOBJ hOld = SelectObject(hdcMem, hBmpBuffer);
删除的时候,做同样的操作,确保hdcMem删除
SelectObject(hdcMem, hOld );
DeleteObj……
[/Quote]

呵呵 谢谢您的提示。

在视频数据处理部分相对而言还是挺快的。全屏320*240的图像写到hdcmem里面也就20ms,就是代码的Test(hdcMem);这句话。
主要是其它部分的bitblt有些慢,视频刷新速率跟不上。

abo77281 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 crystal28 的回复:]
不支持overlay的话,只能先得到要叠加上去的图像和文字的二维点阵,然后将二维点阵贴到屏幕上。
但是不管怎样,bitblt速度肯定慢,directdraw或gapi的方法速度肯定快
[/Quote]

不会用opengl,不知道怎么把这段代码换成opengl的实现方式~
Ei 2011-05-03
  • 打赏
  • 举报
回复
CreateDIBSection创建一个16bit,然后往里面填从摄像头采集RGB数据。
关于内存泄漏例如,SelectObject要把原来dc中的obj做一个交换,
HGDIOBJ hOld = SelectObject(hdcMem, hBmpBuffer);
删除的时候,做同样的操作,确保hdcMem删除
SelectObject(hdcMem, hOld );
DeleteObject(hdcMem);
「已注销」 2011-05-03
  • 打赏
  • 举报
回复
不支持overlay的话,只能先得到要叠加上去的图像和文字的二维点阵,然后将二维点阵贴到屏幕上。
但是不管怎样,bitblt速度肯定慢,directdraw或gapi的方法速度肯定快
woshi_ziyu 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aaa_tnt 的回复:]

色深改成16,应该会好很多,而且为什么要每次都CreateCompatibleDC和CreateCompatibleBitmap,另外这段代码有内存泄漏。
[/Quote]
?为什么不需要每次都CreateCompatibleDC和CreateCompatibleBitmap呢?应该放在哪里?初始化吗
abo77281 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aaa_tnt 的回复:]
色深改成16,应该会好很多,而且为什么要每次都CreateCompatibleDC和CreateCompatibleBitmap,另外这段代码有内存泄漏。
[/Quote]

谢谢你~
嗯,不需要每次都CreateCompatibleDC和CreateCompatibleBitmap,呵呵。
这个问题主要是想请教怎样解决bitblt的效率问题。

另外,这个code哪部分会内存泄露呢?请指示下~~~
abo77281 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 crystal28 的回复:]
试试directdraw的overlay功能
[/Quote]

这个是基于wince5.0的平台,上面不支持overlay。
Ei 2011-05-03
  • 打赏
  • 举报
回复
色深改成16,应该会好很多,而且为什么要每次都CreateCompatibleDC和CreateCompatibleBitmap,另外这段代码有内存泄漏。
加载更多回复(10)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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