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

Мерцание является распространенной проблемой при программировании графики. Графические операции, требующие нескольких сложных операций рисования, могут вызвать мерцание отображаемых изображений или иным образом нарушить их восприятие. Чтобы устранить эти проблемы, .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.

См. также