计算数据画波形图

oKevinJ 2013-06-26 01:19:29
软件要求是根据数据,来画出图形。其实同一个文件对应的图形是相同的,只是在同一个文件中,会有一根扫描线,沿X轴坚着移动。早期,我是根据数据,在每次OnPaint中,连线来画图的,每次OnPaint时,都要遍历一次所有的点。并连接起来。测试时发现,时间久了,因为长时间要运算,计时器不准了。会延时几秒才做,需求是每秒画一次那条坚着的线,而波形是未变的。仅在不同文件中,因为不同文件而变。

现在我想改进性能,对于同一个文件,第一次时,按数据画波形,在该文件未切换的情况下,第二次以后的画图,就不用取点,再连线来画波形了。这样肯定性能上可以提高很多。

但软件改后,因为我用了双缓冲同时对MFC中的画图也不是特熟吧。实际的结果,是缓冲后的图,并未最后显示出来。

代码大概如下,代码有精简,主要部分如下:
GetClientRect(&clientRt);
nWidth = clientRt.Width();
nHeight = clientRt.Height();
// 建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(pDC);
// 建立一个与屏幕显示兼容的位图,位图的大小可选用窗口客户区的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
// 将位图选入到内存显示设备中,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap);
// 先用背景色将位图清除干净,否则是黑色。这里用的是白色作为背景
//MemDC.FillSolidRect(clientRt.left, clientRt.top,nWidth,nHeight,RGB(0,0,0));
MemDC.FillSolidRect(0, 0,nWidth,nHeight,RGB(0,0,0));

// 静态缓冲 DC
static CDC cacheDC;
static CString movie_path;
static bool bFirstOfSaveMovie = true ;
static bool bOnlyOnceCreate = true ;
CString movie_path_;

if (bOnlyOnceCreate)
{
cacheDC.CreateCompatibleDC(pDC);
bOnlyOnceCreate = false ;
}

if (文件不相同)
{
// 不相同,则需要重绘一个新的。
bFirstOfSaveMovie = true ;
movie_path = movie_path_;
}
//画背景
DrawBackGround(MemDC);
if (bFirstOfSaveMovie)
{
DrawLineXYZ(cacheDC); //此行为画线,是动态计算后画的波形图,数据量会比较多。
bFirstOfSaveMovie = false ;
}
MemDC.BitBlt(0, 0, m_rect.Width(), m_rect.Height(), &cacheDC, 0, 0, SRCCOPY);
pDC->BitBlt(updateRt.left, updateRt.top, updateRt.Width(), updateRt.Height(), &MemDC, updateRt.left, updateRt.top, SRCCOPY);
// 绘图完成后的清理
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();


请问下大家,如何将这个缓冲的DC中的图,显示出来呢?另外,这个static的cacheDC,我会在程序结束时释放,从目前帖进来的代码来看,是否会存在内存泄漏的情况呢?急,求高手指点。
...全文
319 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oKevinJ 2013-07-01
  • 打赏
  • 举报
回复
算了结帖吧。内存位图俺就是没有成功生成,才发的此帖。。。
oKevinJ 2013-06-27
  • 打赏
  • 举报
回复
victor_woo你好,非常谢谢你的回复。 “-------------再多也是每次OnDraw遍历绘制一遍。” 我是希望,我每次画后,将这个内容缓存下来,以后再帖上去,在本文件的剩下的时间里,不需要去扫描这此点,也不用连线来画图了。这样效率肯定会好很多。特别是时间久了,文件大后,里面可能有几千个点,积累起来,还是较占CPU的。我想优化这里至少能让CPU占用少点。因为程序还有播放视频的操作,视频中对CPU占用的,我暂时没想过去改。
victor_woo 2013-06-27
  • 打赏
  • 举报
回复
引用 3 楼 oKevinJ 的回复:
victor_woo你好,非常谢谢你的回复。 “-------------再多也是每次OnDraw遍历绘制一遍。” 我是希望,我每次画后,将这个内容缓存下来,以后再帖上去,在本文件的剩下的时间里,不需要去扫描这此点,也不用连线来画图了。这样效率肯定会好很多。特别是时间久了,文件大后,里面可能有几千个点,积累起来,还是较占CPU的。我想优化这里至少能让CPU占用少点。因为程序还有播放视频的操作,视频中对CPU占用的,我暂时没想过去改。
我原来做java的applet chart, 有个BufferedImage类,我把画背景的和前景的分为两个bufferedimage, 背景的内容只处理一次,以后直接调用这个背景BI,但是前景每次刷新处理
victor_woo 2013-06-27
  • 打赏
  • 举报
回复
引用 4 楼 oKevinJ 的回复:
关于你说的 第一点。我是局部刷新了,但只刷新X值,我就是X轴数据量大啊,不想每次都刷新X。 第二点。也是我想要的功能。我就是想将X轴在不变的时候,保存下来。 第三点。目前没精力去用这个,而且俺也不熟。
第一点:局部刷新指的是垂直于X轴的那条线 第二点 生成内存位图应该不难
zhoujk 2013-06-27
  • 打赏
  • 举报
回复
这些X轴上的数据不要全画。只画需要显示的区域,例如最后N个单位就行了。 如果N值太大,才用你说的方法,先存个位图,然后左移,增加新的部分,再重绘到GUI
oKevinJ 2013-06-27
  • 打赏
  • 举报
回复
关于你说的 第一点。我是局部刷新了,但只刷新X值,我就是X轴数据量大啊,不想每次都刷新X。 第二点。也是我想要的功能。我就是想将X轴在不变的时候,保存下来。 第三点。目前没精力去用这个,而且俺也不熟。
victor_woo 2013-06-26
  • 打赏
  • 举报
回复
双缓存的意思是显示同时在后台调用Draw函数绘制图形,和前台视窗切换,加快速度,避免屏闪 每次OnDraw都必须绘制你想显示的图形,你的函数中第二次以后Ondraw其实已经屏蔽了绘制曲线的函数

  //画背景
                         DrawBackGround(MemDC);
                        if (bFirstOfSaveMovie)
                        {
                                    DrawLineXYZ(cacheDC);      //此行为画线,是动态计算后画的波形图,数据量会比较多。-------------再多也是每次OnDraw遍历绘制一遍
                                    bFirstOfSaveMovie = false ;
                        }                              
1:看能不能局部刷新,只刷新X值线 2:把曲线做成图片 3:用OpenGL做2D,OpenGL可以通过显示列表缓存固定显示结构
oKevinJ 2013-06-26
  • 打赏
  • 举报
回复
代码头部掉了如下内容: CPaintDC dc(this); CDC *pDC = &dc/*GetDC()*/; // 定义设备上下文 CDC MemDC; // 定义一个内存显示设备对象 CBitmap MemBitmap; // 定义一个位图对象 int nWidth, nHeight; CRect clientRt;
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。  我将带领大家一起来学习:Qt麦克风数据探测、FFmpeg解码音频数据、音频波形图、音频播放器。具体内容包括:1.Qt采集麦克风并探测数据,生成动态矩形图。2.FFMpeg解码音频数据,生成PCM数据,并绘制波形图。3.音频播放器实战。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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