Как добиться плавного рисования с помощью C # (например, Paint .NET)?

Как Paint .NET может так быстро рисовать с помощью C #? Пример: периметр эллипса рисуется во время перетаскивания мыши без видимой задержки. В простом приложении Windows Form на C #. Если вы используете событие MouseMove для Picturebox и нарисуете эллипс в зависимости от положения мыши, будет много задержек и мерцания! Итак, как они это делают так гладко?


person Pedro77    schedule 07.02.2012    source источник
comment
Отличный вопрос - вероятно, не относится к S.O., но все же отличный вопрос.   -  person Nick Vaccaro    schedule 07.02.2012
comment
blogs.msdn.com/ b / directx / archive / 2009/08/14 /   -  person ken2k    schedule 07.02.2012
comment
Вот ссылка на ответ, в котором есть советы от автора Paint.NET stackoverflow.com/a/11025428/11425141   -  person Phillip S    schedule 24.09.2019


Ответы (4)


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

person Joel Coehoorn    schedule 07.02.2012
comment
Спасибо. Я буду искать какой-нибудь образец БД, чтобы увидеть, действительно ли он улучшает рисунок. - person Pedro77; 07.02.2012

Paint.NET вызывает Update () после вызова Invalidate (), который вызывает немедленное синхронное WM_PAINT.

person Rick Brewster    schedule 22.03.2012
comment
Чтобы уточнить детали нижнего уровня: Invalidate() в WinForms вызывает встроенную функцию InvalidateRect(). Update() называет родной UpdateWindow(). Refresh() аналогично вызову Invalidate(true), за которым следует Update(). - person Rick Brewster; 15.12.2015

Чтобы рисунок получился гладким, вам необходимо:

  • Использовать двойную буферизацию (http://msdn.microsoft.com/en-us/library/b367a457.aspx)
  • Используйте специальный инструментарий для рендеринга (OpenGL / DirectDraw и т. Д.)

В этом случае лучше всего использовать двойную буферизацию - она ​​поддерживается «из коробки» в .NET framework, требует очень мало работы и устраняет мерцание.

person Dave Kerr    schedule 07.02.2012
comment
Я думаю, что двойная буферизация не решит проблему задержки, которая становится более ясной, когда мышь перемещается быстрее и между ее положением и нарисованным эллипсом начинает появляться зазор. - person Pedro77; 07.02.2012

Вероятно, они используют WPF. Это намного быстрее, чем формы.

person Pedro77    schedule 15.02.2012