大家好:
现在正在做的项目是一些画图工作,画图量十分的巨大。所以想来向大家学习下VC中如何提高画图效率的技巧。
我的画图每次屏幕改变后都要重新绘制的。所以效率需要好好考虑。
在我的画图过程中,主要的绘制工作无非就是画点,画线,moveto,lineto,实色填充一个区域,透明填充一个区域,花式填充一个区域,写文本字符串等。还有的就是一些坐标的数值计算。每一个小过程都很简单,就是总的绘制量巨大。所以累加时间很长。希望得到提升。目前还没做任何的代码优化。
希望大家有什么经验技巧都来说说。
比如:
我在某一个小绘制函数中这样生成一个画笔:
CPen pen(PS_SOLID,1,RGB(255,0,0));
dc.selectobject(pen);
...
那么我后面需要对这个pen的内存空间进行释放吗?还是他自己在这个函数结束后就自己释放?
连续的大量的moveto和lineto,夹杂着数值计算会不会影响绘图速度?(就是moveto的数值是动态计算的。)?
设备环境DC以及位图等资源什么时候需要释放,什么时候他自己会释放?
等等这些东西。
现在正在做的项目是一些画图工作,画图量十分的巨大。所以想来向大家学习下VC中如何提高画图效率的技巧。
我的画图每次屏幕改变后都要重新绘制的。所以效率需要好好考虑。
在我的画图过程中,主要的绘制工作无非就是画点,画线,moveto,lineto,实色填充一个区域,透明填充一个区域,花式填充一个区域,写文本字符串等。还有的就是一些坐标的数值计算。每一个小过程都很简单,就是总的绘制量巨大。所以累加时间很长。希望得到提升。目前还没做任何的代码优化。
希望大家有什么经验技巧都来说说。
比如:
我在某一个小绘制函数中这样生成一个画笔:
CPen pen(PS_SOLID,1,RGB(255,0,0));
dc.selectobject(pen);
...
那么我后面需要对这个pen的内存空间进行释放吗?还是他自己在这个函数结束后就自己释放?
连续的大量的moveto和lineto,夹杂着数值计算会不会影响绘图速度?(就是moveto的数值是动态计算的。)?
设备环境DC以及位图等资源什么时候需要释放,什么时候他自己会释放?
等等这些东西。
解决方案 »
- 判断鼠标是否在曲线上的问题,老问题,再次发问,问题补充
- 请问如何的到文件的路径?不要名字,只要路径
- 不行啊,为什么还是收不到??-- 关于CHeaderCtrl的自绘行为!!!!!!!第二次提问CHeaderCtrl
- 2005和VC6的C++不同地方有那些啊
- 高分求:Focus On 2D in Direct3D【中文:Direct3D 中的 2D 编程】 随书代码
- 4KB的三维动画DEMO极品程序! 『曾获大赛一等奖』
- 如何用ADO连接有密码的ACCESS数据库,请给出连接字符串
- 有点难的问题:如何将对话框程序窗口,设置为桌面背景
- MSDN
- 如何在CDaoDatabase的表中动态获得记录值?
- 一个VS2010编译器的小问题
- 【求助】MFC实现编辑框写功能程序错误
CPen pen(PS_SOLID,1,RGB(255,0,0));
这种方法就不需要释放,函数结束后会自动释放,因为pen是个局部变量。
需要注意的是:FONT很多时候不能用局部变量。
我也不是想偷工减料,就是想问问大家你说的这个优化绘图代码的一般方法。比如之前说的剪裁,我也是后来才加上的。就是类似的让绘图程序执行起来快点的操作和设计。变量会自己释放,但是如果这些pen,brush以及bitmap等是用create类方法创建的,我看有人说就需要手动去delete才能释放分配的内存。现在就是搞不懂哪些情况下需要自己去释放。
首先,要会使用双缓冲!这个不仅仅是提高画图质量(比如避免闪烁什么的),在双缓冲基础上,可以提高画图效率。
其次,将双缓冲扩充,变成三缓冲或者更多缓冲!提高效率(不仅仅是质量了)。我们常用的画图数据,有具体的实体等数据,还有一些是中间操作数据,比如鼠标拖动,拖动过程的目标A就是中间数据,拖动完成后,中间数据就变成具体的实体等数据B。如果我们仅仅用双缓冲来实现,那么,拖动过程,所有的具体的实体数据B就需要重画,然后再重画中间的数据A;但是,如果改成三缓冲来实现,我们可以这样做,每次实体数据B改变的时候,我们在第一个缓冲M1中只画数据B;第二个缓冲M2用于显示中间数据A,当然,在显示前先拷贝M1缓冲,然后,再画数据A;第三个缓冲也就是最后一个缓冲M3是将M2贴出显示用的,这是必须的!这样,你每次有中间数据改变的时候(比如拖动过程、选择过程),只需要重新画一些M2,然后显示;在实体数据改变的时候,你重新画一下M1(当然,M1画完后,M2也需要重新画,这是一个层次关系),最后显示!
这只是基本的用法,你可以根据具体的需要来改变使用更多的缓冲!
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()的;建议楼主养成一个好习惯,不要依赖程序自动执行,每次添加上这句!
以后每次刷新只需要bitblt映射就好了。
你好,谢谢回复。但是你说的这句什么意思?比如我创建一个基于单文档的工程,他的ondraw函数里就给了我一个pDC,这个设备环境还会有其他程序用?
目前我的程序中没有做你说的设备还原,就是pen啊,br这些选入后没有保存之前的,我每次画图都会先设置DC,所以在我的程序中不怕乱了,但是其他程序也会使用我用的这个pDC吗?也就是说我的绘图程序会影响电脑内其他使用设备环境的程序?
不管怎么样,我决定接受你的好的提议,以后绘图都先保存设备pen,br等,用完后还原。谢谢。