Почему я должен делать двойную буферизацию вручную? - PullRequest
7 голосов
/ 08 сентября 2010

Я работаю над игрой на C # (либо 2.0, либо 3.5 еще не решили).Игра будет вестись на карте с гексагональной сеткой.Я ценю, что пользовательский интерфейс для этой карты должен использовать двойную буферизацию (много слоев, поэтому медленное рисование).Я знаю, что могу включить двойную буферизацию через стиль или создать свой собственный буфер и обрабатывать его самостоятельно.Большинство рекомендаций, которые я нахожу в Интернете, - справляться с этим самостоятельно.Мне интересно почему?Очевидно, это позволяет мне избежать допущений, которые присущи двойной буферизации элемента управления, но я не знаю, что это за допущения.

Опять же, я не ищу код, объясняющий, как удвоить буфер моего элемента управленияа точнее, зачем мне самому строить это вместо того, чтобы использовать стиль двойной буферизации и позволять классу CLR / Control обрабатывать это?

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010

С MSDN :

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

РЕДАКТИРОВАТЬ : я также нашел эту статью Боба Пауэлла, которая может быть полезна

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

Во-первых, не создавайте новый обратный буфер каждый цикл розыгрыша. Только создать или уничтожить растровое изображение, когда окно размер клиента меняется. Во-вторых, только создать растровое изображение нужного вам размера. Очистка пикселей занимает время, и поэтому, если пикселей больше, чем нужно, ты просто тратишь процессорные циклы. Наконец, используйте самый простой метод рисования скопировать растровое изображение на экран. DrawImageUnscaled - это путь здесь.

РЕДАКТИРОВАТЬ : Другая причина в том, что вы можете захотеть, чтобы приложение контролировало буферизацию, а не сами элементы управления.

Источник: Pro .NET 2.0 Windows Forms и пользовательские элементы управления в C #

3 голосов
/ 08 сентября 2010

В WFA двойная буферизация снижает производительность без полного устранения мерцания в пользовательских графических областях.Для встроенных элементов графического интерфейса, например, если вы создаете игру, созданную из ImageButtons и Labels, встроенный режим двойной буферизации отлично подходит для сокрытия перерисовки дерева элементов управления.Однако при использовании его для пользовательской области рисования существует пара основных проблем:

  • Буфер рисования, созданный при настройке приложения для рисования с двойной буферизацией, используется для рисования всего окна ивсе дочерние элементы управления, а не только пользовательская область рисования, поэтому вы добавляете накладные расходы на перерисовку каждого элемента GUI в заднем буфере перед перелистыванием страницы.
  • Если что-то делает элемент управления недействительным, вызывается метод Paint.Вы можете не закончить рисование, когда это произойдет, и поэтому вы получите неполное изображение, отображаемое пользователю (не очень хорошо для графики в реальном времени).

Сохраняя графический интерфейс основного окна с одиночной буферизацией, но при создании области, в которой вы управляете буферизацией, обе эти проблемы сведены к минимуму.

Методы двойной буферизации могут быть такими же простыми, как создание объекта Bitmap в качестве заднего буфера и его рисование в области рисования.когда вы готовы и готовы, или создаете отдельный BufferedGraphicsContext для управления буферизацией вашей пользовательской области рисования.

...