C#中双缓存绘图的实现方法

最近正在考虑写个小游戏,来学习GDI+。其中要用到的一个技术就是双缓存技术,双缓冲技术是为了解决界面闪烁而采用的一项技术,就是将要绘制的界面先绘制在内存中一个虚拟的、和正在显示的界面同样大小的一个区域上,界面变化时将这个内存中的图象一次性绘制到屏幕上。通常,双缓存逻辑如下所示:
1.  protected override void OnPaint(PaintEventArgs e )
2.  {
3.  Graphics gxOff; //屏幕外的图像
4.   
5.     if (m_bmpOffscreen == null) //要双缓冲的位图
6.     {
7.        m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
8.     }
9.           
10.                   gxOff = Graphics.FromImage(m_bmpOffscreen);
11.                 
12.                   gxOff.Clear(this.BackColor);
13.                   //绘制一些位图
14.                   gxOff.DrawImage(bmpParent, 0, 0, bmpRect, GraphicsUnit.Pixel);
15.                   
16.                   //边界矩形
17.                Rectangle rc = this.ClientRectangle;
18.                   rc.Width--;
19.                   rc.Height--;
20.                            
21.                   //绘制边界
22.                   gxOff.DrawRectangle(new Pen(Color.Black), rc);
23.                   //从内存位图绘制
24.                   e.Graphics.DrawImage(m_bmpOffscreen, 0, 0);
25.                 
26.                   base.OnPaint( e );
27.                }
在上面的代码中,我们通过调用 Graphics 类的静态 FromImage 方法在与我们的控件大小相同的空位图中创建了一个 Graphics 对象。我们在内存中的 Graphics 对象上进行所有的绘图,完成后,将整个准备好的位图覆盖到控件的图形上即可。
posted @   周金桥  阅读(705)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示