请高手帮忙分析一下下面代码的效率问题?
- C/C++ code
void CMapInfoPluginView::PrepareBmpTotalImage(CDC *pDC, CRect &rect){ if( !m_bmpTotalImage.GetSafeHandle() ) m_bmpTotalImage.CreateCompatibleBitmap( pDC, rect.Width(), rect.Height() ); else m_bmpTotalImage.SetBitmapDimension( rect.Width(), rect.Height() ); CDC dcMemSrc; dcMemSrc.CreateCompatibleDC( pDC ); dcMemSrc.SelectObject( &m_bmpBackground ); CDC dcMemDst; dcMemDst.CreateCompatibleDC( &dcMemSrc ); dcMemDst.SelectObject( &m_bmpTotalImage ); dcMemDst.BitBlt( 0, 0, rect.Width(), rect.Height(), &dcMemSrc, 0, 0, SRCCOPY ); Graphics *pGraphics = Graphics::FromHDC( dcMemDst.m_hDC ); for( size_t i = 0; i < m_vecTaskModule.size(); i++ ) { m_vecTaskModule[i].pTaskModule->Draw( pGraphics, rect ); } dcMemSrc.DeleteDC(); dcMemDst.DeleteDC(); delete pGraphics;}
当数据量比较小时,此函数工作正常。当接收的多播数据比较大时,此函数会被频繁调用,此时CPU占用100%。
请高手帮忙分析一下此代码的问题之处,谢谢!!
[解决办法]
GDI需要消耗资源,数据量太大,自然CPU会上去,Sleep降低一下
[解决办法]
没必要每个都得重绘吧
需要时再绘图
[解决办法]
for( size_t i = 0; i < m_vecTaskModule.size(); i++ )
改为
int length = m_vecTaskModule.size();
for( size_t i = 0; i <length; i++ )
[解决办法]
可以更新数据,但不刷新,比如1s刷一次。
这个函数只刷新数据,再弄个线程显示,或定时器也行,1s draw 1次
[解决办法]
可采用定时刷新
m_vecTaskModule[i].pTaskModule->Draw( pGraphics, rect );
为何不先绘制到内存DC上
[解决办法]
可以设个标志,有新数据时刷新重绘。