Почему при каждом изменении размера окна WPF возникает черная задержка?

Другие вопросы по SE касаются того, как ускорить изменение размера вложенных элементов управления пользовательским интерфейсом, но что если нет никаких элементов управления?

При перетаскивании края окна WPF, даже основного окна без содержимого, черные полосы кратковременно мерцают во время перетаскивания. Это создает вялое чувство, которое я не хочу причинять покупателям:

Изменение размера окна WPF

Он становится все медленнее и тяжелее с полным пользовательским интерфейсом. Это даже не влияет на то, насколько некрасиво это выглядит при изменении размера с использованием верхнего или левого края. Windows Forms- даже с самым тяжелым пользовательским интерфейсом, который я когда-либо создавал - никогда не выглядит так плохо с самого начала.

Что можно сделать, чтобы производительность по изменению размера окна WPF была сопоставима с выигрышными формами?

(У меня Windows 7 x64 и система с тремя мониторами на AT Radeon HD 7470.)

2 ответа

Решение

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

Первое, что сделает WPF - очистит грязную область, которая будет перерисовываться. Цель грязных областей - уменьшить количество пикселей, отправляемых на выходной этап слияния конвейера графического процессора. Здесь мы видим черный цвет. Само окно в этой точке не имеет цвета фона, или его цвет фона установлен прозрачным, поэтому для нас графический процессор рисует черный фон. Все работает асинхронно в wpf, что хорошо.

Чтобы исправить это, вы можете установить фиксированный цвет, такой как "Белый" для окна. Затем система WPF очистит грязную область, но автоматически заполнит ее белым, а не черным цветом. Это обычно помогает.

Подберите цвет окна или цвет самого верхнего слоя. Не позволяйте графическому процессору использовать черный, и у вас все должно получиться. Кстати Wpf быстрее, чем WinForm, так что не волнуйтесь.

Выглядит действительно вялым, особенно при использовании верхней или левой границы.

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

Хотя я не могу ответить на конкретную сумасшедшую медлительность перерисовки WPF, я по крайней мере могу дать некоторое представление о том, почему вы видите черный цвет, откуда он исходит, и можете ли вы перейти на менее раздражающий заливной цвет.

Оказывается, существует множество разных источников черного и плохого поведения при изменении размера из разных версий Windows, которые объединяются вместе. Пожалуйста, ознакомьтесь с этими вопросами и ответами, в которых объясняется, что происходит, и даются советы о том, что делать (опять же, не только для того, чтобы сделать WPF быстрее, но и просто посмотреть, что вы можете сделать, учитывая вашу скорость):

Как сгладить уродливый джиттер / мерцание / прыжок при изменении размеров окон, особенно перетаскивая левую / верхнюю границу (Win 7-10; bg, bitblt и DWM)?

Другие вопросы по тегам