怎样提高GDI+的绘图效率的相关推荐

 我来答
huanglenzhi
2015-01-02 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数: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);
  }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式