VC++如何提高画图效率???

daredjever 2010-01-06 03:53:07
大家好:
现在正在做的项目是一些画图工作,画图量十分的巨大。所以想来向大家学习下VC中如何提高画图效率的技巧。
我的画图每次屏幕改变后都要重新绘制的。所以效率需要好好考虑。
在我的画图过程中,主要的绘制工作无非就是画点,画线,moveto,lineto,实色填充一个区域,透明填充一个区域,花式填充一个区域,写文本字符串等。还有的就是一些坐标的数值计算。每一个小过程都很简单,就是总的绘制量巨大。所以累加时间很长。希望得到提升。目前还没做任何的代码优化。
希望大家有什么经验技巧都来说说。
比如:
我在某一个小绘制函数中这样生成一个画笔:
CPen pen(PS_SOLID,1,RGB(255,0,0));
dc.selectobject(pen);
...
那么我后面需要对这个pen的内存空间进行释放吗?还是他自己在这个函数结束后就自己释放?
连续的大量的moveto和lineto,夹杂着数值计算会不会影响绘图速度?(就是moveto的数值是动态计算的。)?
设备环境DC以及位图等资源什么时候需要释放,什么时候他自己会释放?
等等这些东西。
...全文
659 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fandh 的回复:]
如何优化绘图质量与效率,是图像图形软件一直面对的问题,包括当前的CAD/CAM都必须要解决这些!我也说说我的看法!
首先,要会使用双缓冲!这个不仅仅是提高画图质量(比如避免闪烁什么的),在双缓冲基础上,可以提高画图效率。
其次,将双缓冲扩充,变成三缓冲或者更多缓冲!提高效率(不仅仅是质量了)。

我们常用的画图数据,有具体的实体等数据,还有一些是中间操作数据,比如鼠标拖动,拖动过程的目标A……
[/Quote]

双缓冲不能提升绘图效率吧,只是可以提升用户体验。

daredjever 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fandh 的回复:]
而不是单独的就你这个程序用?
[/Quote]

你好,谢谢回复。但是你说的这句什么意思?比如我创建一个基于单文档的工程,他的ondraw函数里就给了我一个pDC,这个设备环境还会有其他程序用?
目前我的程序中没有做你说的设备还原,就是pen啊,br这些选入后没有保存之前的,我每次画图都会先设置DC,所以在我的程序中不怕乱了,但是其他程序也会使用我用的这个pDC吗?也就是说我的绘图程序会影响电脑内其他使用设备环境的程序?
不管怎么样,我决定接受你的好的提议,以后绘图都先保存设备pen,br等,用完后还原。谢谢。
fandh 2010-01-07
  • 打赏
  • 举报
回复
最后再补充一下画图效率,就是裁剪区,这个很重要,你改变需要使用裁剪区来刷新你改变的局部范围,其它的不用重画,提高不少效率!
wwgddx 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fandh 的回复:]
如何优化绘图质量与效率,是图像图形软件一直面对的问题,包括当前的CAD/CAM都必须要解决这些!我也说说我的看法!
首先,要会使用双缓冲!这个不仅仅是提高画图质量(比如避免闪烁什么的),在双缓冲基础上,可以提高画图效率。
其次,将双缓冲扩充,变成三缓冲或者更多缓冲!提高效率(不仅仅是质量了)。

我们常用的画图数据,有具体的实体等数据,还有一些是中间操作数据,比如鼠标拖动,拖动过程的目标A就是中间数据,拖动完成后,中间数据就变成具体的实体等数据B。如果我们仅仅用双缓冲来实现,那么,拖动过程,所有的具体的实体数据B就需要重画,然后再重画中间的数据A;但是,如果改成三缓冲来实现,我们可以这样做,每次实体数据B改变的时候,我们在第一个缓冲M1中只画数据B;第二个缓冲M2用于显示中间数据A,当然,在显示前先拷贝M1缓冲,然后,再画数据A;第三个缓冲也就是最后一个缓冲M3是将M2贴出显示用的,这是必须的!这样,你每次有中间数据改变的时候(比如拖动过程、选择过程),只需要重新画一些M2,然后显示;在实体数据改变的时候,你重新画一下M1(当然,M1画完后,M2也需要重新画,这是一个层次关系),最后显示!
这只是基本的用法,你可以根据具体的需要来改变使用更多的缓冲!
[/Quote]

学习了, 提高效率要多注意细节
fandh 2010-01-07
  • 打赏
  • 举报
回复
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *poldpen = dc.selectobject(pen);

.........
dc.selectobject(poldpen );
pen.DeleteObject();
首先,用完后必须 执行dc.selectobject(poldpen ),否者,你的pen释放不了,设备环境也没有恢复,很可能影响到其它的绘图,因为你这个设备dc可能好几个地方共用,而不是单独的就你这个程序用;如果不执行dc.selectobject(poldpen ),你的pen被设备选中,pen.DeleteObject()根本就是无效,你可以跟踪调试一下看看结果;
其次,pen.DeleteObject()这句,pen本身是个局部变量,如果你是XP以上的系统,好像可以不执行,好像在CPen的析构函数里面做了这个操作,能自动释放的,但是,在win98下,肯定需要执行这句pen.DeleteObject()的;建议楼主养成一个好习惯,不要依赖程序自动执行,每次添加上这句!

fandh 2010-01-07
  • 打赏
  • 举报
回复
如何优化绘图质量与效率,是图像图形软件一直面对的问题,包括当前的CAD/CAM都必须要解决这些!我也说说我的看法!
首先,要会使用双缓冲!这个不仅仅是提高画图质量(比如避免闪烁什么的),在双缓冲基础上,可以提高画图效率。
其次,将双缓冲扩充,变成三缓冲或者更多缓冲!提高效率(不仅仅是质量了)。

我们常用的画图数据,有具体的实体等数据,还有一些是中间操作数据,比如鼠标拖动,拖动过程的目标A就是中间数据,拖动完成后,中间数据就变成具体的实体等数据B。如果我们仅仅用双缓冲来实现,那么,拖动过程,所有的具体的实体数据B就需要重画,然后再重画中间的数据A;但是,如果改成三缓冲来实现,我们可以这样做,每次实体数据B改变的时候,我们在第一个缓冲M1中只画数据B;第二个缓冲M2用于显示中间数据A,当然,在显示前先拷贝M1缓冲,然后,再画数据A;第三个缓冲也就是最后一个缓冲M3是将M2贴出显示用的,这是必须的!这样,你每次有中间数据改变的时候(比如拖动过程、选择过程),只需要重新画一些M2,然后显示;在实体数据改变的时候,你重新画一下M1(当然,M1画完后,M2也需要重新画,这是一个层次关系),最后显示!
这只是基本的用法,你可以根据具体的需要来改变使用更多的缓冲!
daredjever 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sandyandy 的回复:]
每个画图都是moveto,lineto生成的, 没有偷懒的方法
[/Quote]

我不是偷懒,是想学习下提高绘图效率的方法和技巧。主要是代码结构优化等的一般做法。
daredjever 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vclongking 的回复:]
画图是累 程序员考虑的不是如何偷工减料 那个没法的 每步都得自己做呢
要考虑的是如何优化程序效率 比如楼上说的裁剪你截取图片的范围
然后局部变量是保存在栈内存里面的 它是函数结束时自动释放
[/Quote]

我也不是想偷工减料,就是想问问大家你说的这个优化绘图代码的一般方法。比如之前说的剪裁,我也是后来才加上的。就是类似的让绘图程序执行起来快点的操作和设计。

变量会自己释放,但是如果这些pen,brush以及bitmap等是用create类方法创建的,我看有人说就需要手动去delete才能释放分配的内存。现在就是搞不懂哪些情况下需要自己去释放。
daredjever 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gamedragon 的回复:]
要考虑裁减(clip)以减少画图操作
[/Quote]

剪裁已经考虑了的,虽然不是多层考虑。就是不在屏幕范围内的东西是不去绘制的。比如我的屏幕范围(0,0,800,600),那么我要画一个东西的话,我会先计算他的坐标,如果不在这个范围内我就不画了的。不知道你是不是这个意思?
plee1037 2010-01-07
  • 打赏
  • 举报
回复
在内存DC画图,画完在映射到窗口DC中。
以后每次刷新只需要bitblt映射就好了。
neiji 2010-01-07
  • 打赏
  • 举报
回复
只画改变部分
Huqing008 2010-01-07
  • 打赏
  • 举报
回复
画线除了moveto 和 lineto 就没别的 特殊图形可以用函数 不过比较少!
wutaihua 2010-01-07
  • 打赏
  • 举报
回复
mark
小草sd 2010-01-07
  • 打赏
  • 举报
回复
同样关注。不建议用GDI,还是自己绘吧
vclongking 2010-01-06
  • 打赏
  • 举报
回复
画图是累 程序员考虑的不是如何偷工减料 那个没法的 每步都得自己做呢
要考虑的是如何优化程序效率 比如楼上说的裁剪你截取图片的范围
然后局部变量是保存在栈内存里面的 它是函数结束时自动释放
gamedragon 2010-01-06
  • 打赏
  • 举报
回复
要考虑裁减(clip)以减少画图操作
sandyandy 2010-01-06
  • 打赏
  • 举报
回复
每个画图都是moveto,lineto生成的, 没有偷懒的方法
SuperLy 2010-01-06
  • 打赏
  • 举报
回复
函数中
CPen pen(PS_SOLID,1,RGB(255,0,0));
这种方法就不需要释放,函数结束后会自动释放,因为pen是个局部变量。
需要注意的是:FONT很多时候不能用局部变量。

19,468

社区成员

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

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