Я использую System.Windows.Media.RenderCapability.Tier, чтобы показать текущий режим рендеринга в панели диагностики моего приложения. Если я вынужу приложение (3.5sp1) изменить режим рендеринга с помощью следующего кода
HwndSource hwndSource = PresentationSource.FromVisual(visual) as System.Windows.Interop.HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = renderMode;
ни System.Windows.Media.RenderCapability.TierChanged не срабатывает, либо не изменяется свойство System.Windows.Media.RenderCapability.Tier. Однако изменения применяются к приложению. Если я смотрю с Perforator, режим рендеринга был изменен на желаемый режим.
Хотя Ive обнаружил во многих местах, что System.Windows.Media.RenderCapability.Tier может использоваться для обнаружения текущего состояния визуализации (также msdn, см. this), похоже, System.Windows.Media.RenderCapability предоставляет информацию о возможностях, а не о текущем режиме. Это также имеет смысл, если я смотрю на имя класса.
Есть ли другой источник, чтобы узнать, как визуализируется фактическое содержимое wpf, или я делаю что-то неправильно?
Просто объедините RenderCapability.Tier
и HwndTarget.RenderMode
вместе, и вы получите то, что ищете:
RenderCapability.Tier изменяет и запускает TierChanged в любое время, когда поверхность Direct3D переключается на новую видеокарту (например, окно перетаскивается между мониторами или переключается на новый монитор).
HwndTarget.RenderMode изменяется только по коду пользователя, но не имеет механизма уведомления, когда он изменяется. Если вы установите его только в одном месте, вы можете просто сообщить об этом, иначе вам может понадобиться таймер, чтобы периодически проверять его.
В принципе, если HwndTarget.RenderMode == RenderMode.Default и RenderCapability.Tier достаточно высок, у вас есть аппаратное ускорение.