怎样提高GDI+的绘图效率的相关推荐
1个回答
2015-01-02 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517198
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
因为利用了双缓冲,我在内存中建立了一个Graphics绘图平面m_pMemGraphics,先把零碎元素画到这个内存平面上,再一次性将它绘制到屏幕上。这个Graphics对象对象是利用FromImage方法创建的(也就是说,在这个绘图平面上绘图是把所有的东西都画到了这个Graphics对象所依赖的图片上,然后需要绘制到屏幕上的时候,只能用DrawImage的办法将这个图片画到屏幕上。偶也想到了用BitBlt的方法以提高效率,但用FromImage方法创建的Graphcis对象的DC是一片漆黑呀!找了半天利用它的DC的方法也不得要领,在codeproject上找到一个例子是VB.NET的,分析了半天还是没有办法。。。这又是一个疑问,希望知道的高手告诉俺怎么做呀,在这里先谢了!),我就只好用DrawImage了。也想了其它的几个办法,包括GDI和GDI+混合使用,GDI+使用了GDI创建的DC。但反过来,就像上面我描述的"一片漆黑",行不通嗯,我还是先说一下暂时没有使用BitBlt怎样改进的绘图效果吧:
1. 使用SetClip限定你的绘制区域。
2. 仅仅是限定的绘制区域也是不行的,还要把你所要绘制的图片剪切的尽量小,和SetClip配合使用。
3. 多浪费点儿内存使用 CachedBitmap 吧,绘图速度会好很多,DrawCachedBitmap 要比 DrawImage 快一些哟!
使用了以上几种方法我的程序绘制速度由70多帧提高到了200多帧。。。还可以哦,仍然是DrawImage和DrawCachedBitmap而没有使用BitBlt。嘿嘿好了,今天想到的就这么多,先写这些吧。俺滴结论是:绘图尽量使用BitBlt,离DrawImage远点儿!
贴段示例代码吧,也因为功能性的东西写的比较分散了,就贴一个函数好了,道理是相同的。。。
void CDesktopDlg:rawRing ()
{
// 设置剪切区域
m_pGraphics-> SetClip (m_pClipRgn);
// 内存中绘制背景
m_pMemTrayGrp-> DrawCachedBitmap (m_pCachedTrayBmp, 0, 0); // <------注意m_pCachedTrayBmp和 // m_pTrayBmp是相同的图片,只是一份复 // 制,用来提高绘图速度。
if (m_lstShowBtnRing.size () > 0)
{
// 内存中绘制按钮
for (list <CEbankButtonAttr*> ::iterator itor = m_lstShowBtnRing.begin ();
itor != m_lstShowBtnRing.end (); itor ++)
{
m_pMemTrayGrp-> DrawCachedBitmap ((*itor)-> m_pCachedBmp, (*itor)-> x,
(*itor)-> y));
}
}
// 绘制到屏幕
m_pGraphics-> DrawImage (m_pTrayBmp, *m_pTrayRect);
}
1. 使用SetClip限定你的绘制区域。
2. 仅仅是限定的绘制区域也是不行的,还要把你所要绘制的图片剪切的尽量小,和SetClip配合使用。
3. 多浪费点儿内存使用 CachedBitmap 吧,绘图速度会好很多,DrawCachedBitmap 要比 DrawImage 快一些哟!
使用了以上几种方法我的程序绘制速度由70多帧提高到了200多帧。。。还可以哦,仍然是DrawImage和DrawCachedBitmap而没有使用BitBlt。嘿嘿好了,今天想到的就这么多,先写这些吧。俺滴结论是:绘图尽量使用BitBlt,离DrawImage远点儿!
贴段示例代码吧,也因为功能性的东西写的比较分散了,就贴一个函数好了,道理是相同的。。。
void CDesktopDlg:rawRing ()
{
// 设置剪切区域
m_pGraphics-> SetClip (m_pClipRgn);
// 内存中绘制背景
m_pMemTrayGrp-> DrawCachedBitmap (m_pCachedTrayBmp, 0, 0); // <------注意m_pCachedTrayBmp和 // m_pTrayBmp是相同的图片,只是一份复 // 制,用来提高绘图速度。
if (m_lstShowBtnRing.size () > 0)
{
// 内存中绘制按钮
for (list <CEbankButtonAttr*> ::iterator itor = m_lstShowBtnRing.begin ();
itor != m_lstShowBtnRing.end (); itor ++)
{
m_pMemTrayGrp-> DrawCachedBitmap ((*itor)-> m_pCachedBmp, (*itor)-> x,
(*itor)-> y));
}
}
// 绘制到屏幕
m_pGraphics-> DrawImage (m_pTrayBmp, *m_pTrayRect);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询