C#中双缓存绘图的实现方法
最近正在考虑写个小游戏,来学习GDI+。其中要用到的一个技术就是双缓存技术,双缓冲技术是为了解决界面闪烁而采用的一项技术,就是将要绘制的界面先绘制在内存中一个虚拟的、和正在显示的界面同样大小的一个区域上,界面变化时将这个内存中的图象一次性绘制到屏幕上。通常,双缓存逻辑如下所示:
在上面的代码中,我们通过调用 Graphics 类的静态 FromImage 方法在与我们的控件大小相同的空位图中创建了一个 Graphics 对象。我们在内存中的 Graphics 对象上进行所有的绘图,完成后,将整个准备好的位图覆盖到控件的图形上即可。
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. }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构