双缓冲的图形

对图形进行编程时出现闪烁是一个常见问题。 需要多个复杂画图操作的图形操作可导致呈现的图像出现闪烁或具有不可接受的外观。 为解决这些问题,.NET Framework 提供了双缓冲功能。

双缓冲使用内容缓冲来解决与多个画图操作相关的闪烁问题。 启用双缓冲后,所有画图操作会首先呈现到内存缓冲而不是屏幕上的绘图图面。 所有画图操作完成后,内存缓冲会直接复制到与之关联的绘图图面。 由于屏幕上仅执行一个图形操作,因此与复杂画图操作相关的图像闪烁可得以消除。

默认双缓冲

在应用程序中使用双缓冲的最简单方式是对 .NET Framework 所提供的的窗体和控件使用默认双缓冲。 通过将 DoubleBuffered 属性设置为 true 或通过使用 SetStyle 方法,可对 Windows 窗体和创作的 Windows 控件启用默认双缓冲。 有关详细信息,请参阅如何:通过对窗体和控件使用双缓冲来减少图形闪烁

手动管理缓冲图形

对于更高级的双缓冲方案(如动画或高级内存管理),可使用 .NET Framework 类来实现自己的双缓冲逻辑。 负责分配和管理各个图形缓冲的类是 BufferedGraphicsContext 类。 每个应用程序域都具有自己的默认 BufferedGraphicsContext 实例,此实例管理该应用程序的所有默认双缓冲。 多数情况下,每个应用程序仅有一个应用程序域,因此,每个应用程序通常也仅有一个默认 BufferedGraphicsContext。 默认 BufferedGraphicsContext 实例由 BufferedGraphicsManager 类管理。 可以通过调用 Current 来检索对默认 BufferedGraphicsContext 实例的引用。 也可创建专用 BufferedGraphicsContext 实例,这可提高图形密集型应用程序的性能。 有关如何创建 BufferedGraphicsContext 实例的信息,请参阅如何:手动管理缓冲图形

手动显示缓冲图形

通过调用 BufferedGraphicsContext.Allocate(返回一个 BufferedGraphics 类的实例),可使用 BufferedGraphicsContext 类的实例创建图形缓冲。 BufferedGraphics 对象管理与呈现图面(例如窗体或控件)关联的内存缓冲。

实例化后,BufferedGraphics 类管理向内存中图形缓冲的呈现。 通过 Graphics(它公开一个直接表示内存缓冲的 Graphics 对象),可将图形呈现到内存缓冲。 可绘制到此 Graphics 对象,正如绘制到表示绘图图面的 Graphics 对象一样。 所有图形绘制到缓冲后,可使用 BufferedGraphics.Render 将缓冲的内容复制到屏幕上的绘图图面。

有关使用 BufferedGraphics 类的详细信息,请参阅手动呈现缓冲图形。 有关呈现图形的详细信息,请参阅 Windows 窗体中的图形和绘制

另请参阅