Что можно сделать с рендерингом интерфейса WPF?
К своему разочарованию я обнаружил, что одно из приложений, над которыми я работаю, довольно плохо рендерится на некоторых компьютерах. Статическая графика и текст пользовательского интерфейса страдают от серьезного разрыва без анимации. Это делает текст нечитаемым и, конечно, графика выглядит плохо.
Я заметил эту проблему на разных компьютерах, но тот, который действительно заставил меня задуматься, был более новым ноутбуком Toshiba с видеокартой Radeon Mobility: когда этот ноутбук работает от батареи, нет разрыва - но когда он работает подключенным, все бардак. Так что это похоже на проблему с шумом линии электропередачи, который, очевидно, влияет на видеокарту - я предполагаю, что аппаратно ускоренная графика. Тем не менее, графика не-WPF хорошо выглядит, так как вы говорите пользователям: "Это не мое приложение, а ваш источник питания!"?!
Вы когда-нибудь сталкивались с этим? И есть ли способ это исправить?
Приложение -.NET 4.0, и ноутбук работал под управлением Windows 7.
3 ответа
Проблемы обычно вызываются драйверами для видеокарт ATI. Карты NVidia (хотя у них есть свои проблемы) обычно не отображают эти проблемы.
Самый простой способ исправить это - отключить аппаратный рендеринг. Это может вызвать проблемы с производительностью, но часто не будет иметь заметного значения, а иногда может даже улучшить производительность. Вы должны будете проверить это для своего собственного приложения, чтобы видеть. Чтобы установить из кода окна:
(PresentationSource.FromVisual(this) as HwndSource).CompositionTarget.RenderMode = RenderMode.SoftwareOnly;
Я столкнулся с тем же самым на моем ноутбуке Acer. На самом деле это была проблема с драйвером экрана, и обновление поставщика полностью решило проблему.
Я бы рекомендовал связаться с Toshiba напрямую по этой проблеме. Направьте их на какое-нибудь общедоступное приложение WPF, которое демонстрирует проблему.
Между тем, единственное известное мне "решение" - это полное отключение WPF аппаратного ускорения. В этом посте описывается, как форсировать рендеринг программного обеспечения для всех приложений WPF, что должно исправить разрыв (за счет значительного снижения производительности рендеринга).
Как сказал Рид, это вполне возможно, проблема с драйверами. Однако, я видел это раньше на некоторых картах с современными драйверами, так что это не всегда решаемая проблема, в зависимости от вашего оборудования. Если это проблема с графикой, вызванная определенной видеокартой, вы можете попробовать этот обходной путь...
В regedit вы можете создать или отредактировать следующее значение DWORD в "1" для принудительной программной визуализации всех приложений WPF:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration
В прошлом я обнаружил, что на младших компьютерах (нетбуках и машинах с интегрированной графикой) это часто может заметно повысить производительность приложений WPF, поскольку снижает конфликты памяти между графическим процессором и процессором.