Двойная буферизация графики

Мерцание является распространенной проблемой при программировании графики. Графические операции, требующие нескольких сложных операций рисования, могут вызвать мерцание отображаемых изображений или иным образом нарушить их восприятие. Чтобы устранить эти проблемы, .NET Framework предоставляет доступ к двойной буферизации.

Двойная буферизация использует буфер памяти для решения проблем мерцания, связанных с несколькими операциями рисования. Если двойная буферизация включена, все операции рисования сначала обрабатываются в буфере памяти вместо области рисования на экране. После завершения всех операций рисования буфер памяти копируется непосредственно в связанную с ним область рисования. Поскольку на экране выполняется лишь одна графическая операция, удается избежать мерцания, связанного со сложными операциями рисования.

Двойная буферизация по умолчанию

Самый простой способ использования двойной буферизации в приложении — использование двойной буферизации по умолчанию для форм и элементов управления, предоставляемой .NET Framework. Вы можете включить двойную буферизацию по умолчанию для Windows Forms и созданных элементов управления Windows, задав DoubleBuffered для свойства значение true или с помощью SetStyle метода. Дополнительные сведения см. в разделе Практическое руководство. Уменьшение эффекта дрожания изображения посредством двойной буферизации для форм и элементов управления.

Управление буферизацией графики вручную

В более сложных сценариях буферизации, например при анимации или сложном управлении памятью, можно использовать классы .NET Framework для реализации вашей собственной логики двойной буферизации. Класс, ответственный за выделение отдельных графических буферов и управление ими, является BufferedGraphicsContext классом. Каждый домен приложения имеет собственный экземпляр по умолчанию BufferedGraphicsContext , управляющий всей двойной буферизацией приложения по умолчанию. В большинстве случаев для каждого приложения существует только один домен приложения, поэтому для каждого приложения обычно используется одно приложение по умолчанию BufferedGraphicsContext . Экземпляры по умолчанию BufferedGraphicsContext управляются BufferedGraphicsManager классом. Можно получить ссылку на экземпляр по умолчанию BufferedGraphicsContext , вызвав метод Current . Можно также создать выделенный BufferedGraphicsContext экземпляр, который может повысить производительность для ресурсоемких графических приложений. Сведения о создании экземпляра см. в BufferedGraphicsContext разделе руководство. Управление буферизованными графиками вручную.

Вывод буферизованной графики вручную

Экземпляр класса можно использовать BufferedGraphicsContext для создания графических буферов путем вызова метода BufferedGraphicsContext.Allocate , который возвращает экземпляр BufferedGraphics класса. BufferedGraphicsОбъект управляет буфером памяти, связанным с областью отрисовки, например с формой или элементом управления.

После создания экземпляра BufferedGraphics класс управляет отрисовкой в буфере графики в памяти. Изображения можно визуализировать в буфер памяти с помощью Graphics , который предоставляет Graphics объект, который непосредственно представляет буфер памяти. Можно закрасить этот Graphics объект так же, как Graphics объект, представляющий поверхность рисования. После того как все графические объекты будут выведены в буфер, можно использовать BufferedGraphics.Render для копирования содержимого буфера на экран в область рисования.

Дополнительные сведения об использовании BufferedGraphics класса см. в разделе визуализация буферизованной графики вручную. Дополнительные сведения об отрисовке графики см. в разделе Объекты Graphics и Drawing в Windows Forms.

См. также