八、MFC应用的人工优化
使用C/C++编写Windows程序的优点就是灵活高效,运行速度快,Visual C++编译器本身的优化工作相当出色,但这并不等于不需要进行适当的人工优化,为了提高程序的运行速度,程序员可以从以下几方面努力:
1) 减少不必要的重复显示
相对来讲,Windows的GDI操作是比较慢的,因此在程序中我们应该尽可能地控制整个视口的显示和更新,如果前后两此数据不发生变化,那么就不要重新进行视口的GDI图形操作,尤其对于背景图显示时非万不得已时不要重绘,同时不要经常五必要的刷新整个窗口。
2) 在视口极小化时不要进行更新屏幕操作
在窗口处于极小化时没有必要继续进行视口更新工作,这样可以显著提高速度。为此需要在子窗口一级捕获上述信息(视口不能捕获该类信息),再在视口中进行相应操作。如下代码片段所示:
首先在子窗口类中添加如下程序段:
void CMyChild::OnSysCommand(UINT nID,LPARAM lparam) { CMDIChildWnd::OnSysCommand(nID,lparam); if(nID==SC_MINIMIZE) { RedrawFlag=0; } else RedrawFlag=1; } |
再在视口更新时中修改如下:
void CMyChart::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ) { if(pChild->RedrawFlag) { InvalidateRect(&r,FALSE); TRACE("Now In CMyChart::OnUpdate\n"); } } |
至于上中pChild指针可以在视口创建的例程中获取:
pChild=(CMyChild*)GetParent();
3) 使用永久性的资源
在频繁进行GDI输出的视口中,如在监控软件中常常使用的趋势图显示和棒图显示等等,应该考虑在类层次上建立频繁使用的每种画笔和刷子,这可以避免频繁的在堆中创建和删除GDI对象,从而提高速度。
4) 使用自有设备描述句柄
亦即在创建视口时通过指定WM_OWNDC风格来拥有自己的显示设备句柄,这虽然会多消耗一些内存,一个DC大约占800字节的内存,但是这避免了每次进行GDI操作前创建并合理初始化显示设备句柄这些重复操作。特别是要自定义坐标系统和使用特殊字体的视口这一点尤其重要。在16M机器日益普遍的今天为了节约一点点内存而降低速度的做法并不可取。
5) 优化编译时指定/G3选项和/FPix87选项
/G3选项将强迫编译器使用386处理器的处理代码,使用嵌入式协处理器指令对那些频繁进行浮点运算的程序很有帮助。采用这两种编译开关虽然提高了对用户机型的要求,但在386逐渐被淘汰,486市场大幅度萎缩,586市场日益普及的今天上述问题已经不再成为问题了。
九、结束语 总体上讲,使用Visual C++和MFC类库进行Windows编程是非常方便的,本文中所提到的一些看法只代表本人的观点,经验也只是笔者根据近年使用MFC进行Windows编程的总结,在此写出来是希望对那些使用VC和MFC进行Windows编程的同行有所帮助,如有不同看法欢迎与笔者联系讨论。
查看本文来源