关于绘图的效率

来源:互联网 发布:二手手机价格评估软件 编辑:程序博客网 时间:2024/05/16 17:51
需要一个十六进制显示分析可执行文件的小程序。 可WinHex令人郁闷的是在一个文件上做完书签后,下次无论打开什么文件它都还会按照做过的那个书签格局显示,翻遍所有的菜单项也没能再打开一个干干净净的文档。而网上
其它的此类程序则很少有书签功能的,于是想自己写 一个。无奈自己酷爱命令行操作,数天来细读MSDN,收获不小,在此做一个小小的总结。
1.关于双缓存绘图的技术。
幸好以前接触过OPENGL,知道有双缓存这种东西。不幸对它并不了解。直到近两天才知道双缓存原来是一种技术,而不是某种语言的特性。所谓双缓存,即先在内存中开一个缓冲区,将所有的绘图操作积累到这个内存缓冲区中,然后在必要的时候把缓冲区内容一次性拷贝到屏幕上。这是自己当前的理解。其原因是内存操作远快于外部IO的读写,所以尽量让快速设备多做些事情,让低速设备只作它必须做的事情。其实这种思想到处都有,例如上次的那个关于strcmp与memcmp实现细节的学习当中就发现,两个函数在比较字符的时候都是先做内存边界对齐,然后一次性地读入四个字节到一个32位的寄存器中,然后在32位的寄存器中再进行逐字节比较。这便是因为CPU速度远快于内存速度,从而尽量使CPU多做一些工作而内存只作它应该做的工作,与双缓存技术的思想异曲同工。
关于这一次程序中双缓存的具体实现:
第一种方法:使用了一个CString,先把所有的要显示的内容输出到CString中,到最后再使用DrawText将CString的内容写到屏幕上。
第二种方法:创建 一个内存DC(CreateCompatibleDC)和一张位图(CreateCompitleBitmap),所有的操作先画到内存DC中去,最后使用一个BitBlt把内存DC中的内容拷贝到屏幕上去。
两种方法的效率大抵相同。

2.关于SaveDC和RestoreDC。
极为广泛的思想。计算机网络中会话层为了维持一个完整的会话创建的同步点,中断处理程序跳转之前的保存断点,等等都与此同。步步为营。未来如何不知道,但是至少能保证未来的失败不会影响到当前的成果。
在codeproject上有一篇就是讲绘图效率的问题。中间也讲到了SaveDC和RestoreDC。大意是改变DC的属性之前,比如要往DC里选一个新的GDI对象,先保存当前的DC,在使用完后再恢复DC,这样那些原先选入DC的GDI对象便会自动被选出DC,至于如何清除它们,自有析构函数劳神,这样的代码写的简洁且高效,否则,有可能某些GDI对象因为被选入DC中而无法释放,会造成内存泄漏。大意如此,这两个函数使用简单,不用多写了。

3.以后再说吧。