Anwendungen auf Windows 8.1 unscharf/blurry

Nachdem Microsott IT so nett war, mit System Center Configuration Manager meinen Laptop über Direct Access im Expresstempo auf Windows 8.1 umzustellen, bin ich bei meiner Hardware auf ein Problem gestoßen, dass uns in der Zukunft noch eine Weile beschäftigen wird:

Anwendungen erscheinen unscharf auf hochauflösenden Displays.

Damit jeder verstehen kann, was ich meine, zeige ich als erstes einen Screenshot. Ein Bild sagt bekanntlich mehr als tausend Worte:

Screenshot

Der Screenshot stammt  von meinem primären Arbeitsgerät, einem Samsung Ativ 700T1. Bei einer Größe von 11,6 Zoll beträgt die Auflösung 1.920 x 1.080 Pixel (Full HD). Bei so einer hohen Pixeldichte stelle ich die Größe aller Elemente auf 125%.

In Windows 8.1 erfolgt das automatisch. Manuell einstellen lässt es sich in der Systemsteuerung unter “Darstellung und Anpassung” > “Anzeige”:

SNAGHTML5abe24f

Das Problem, dass ich bis Windows 8 dabei hatte, war der Multi-Monitor-Betrieb. Immer wenn ich im Büro oder Zuhause einen zweiten oder dritten Bildschirm angeschlossen hatte, war auf dem die gleiche Vergrößerung im Einsatz. Das war vor allem störend auf VGA-Projektoren bei einer Auflösung von 1.024 x 768 Pixeln. Da war kaum noch sinnvoll zu nutzender Platz auf dem Bildschirm. Es ist aber auch ein Problem bei 4k-Displays:

Mit Windows 8.1 wird mit der automatischen Bildschirmskalierung nun alles besser. Damit kann man mehrere Bildschirme gleichzeitig mit unterschiedlichen Pixeldichten betreiben. Windows kümmert sich automatisch um die Skalierung der Fenster.

An sich eine tolle Sache, wäre da nicht ein Haken: Das Problem bei hohen Pixeldichten waren schon immer die Anwendungen. Sind diese nicht HighDPI-fähig, kann Windows nur durch Bitmap-Vergrößerung/Verkleinerung skalieren. Dadurch schlagen wir uns dann mit unscharfen Bildern herum.

Die Alternative sind Fehler in der UI wie zum Beispiel falsche Zeilenumbrüche, nicht mehr erreichbare Buttons, etc. Das Problem ist nicht von Windows allein lösbar – die Anwendungen müssen hier auch mitspielen. Das ist übrigens auch ein Grund, warum Ribbons Einzug gehalten haben in Windows. Ribbons sind optimale Controls zur Verwendung bei unterschiedlichen Pixeldichten:

Wer als Anwendungsentwickler näheres zur Programmierung von HighDPI-fähigen Anwendungen erfahren will, sei auf das Whitepaper Writing DPI-Aware Desktop Applications in Windows 8.1 und den Artikel Writing High-DPI Win32 Applications verwiesen.

Wenn man den Screenshot von oben in voller Größe betrachtet, kann man sehen, dass links der Internet Explorer 11 glasklar zu lesen ist, während rechts in Google Chrome Schrift und Programm-UI unscharf dargestellt werden. Ich habe ihn in voller Auflösung als Anhang unten an den Beitrag angehängt.

Die Ursache des Problems ist die Tatsache, dass Google Chrome sich als nicht HighDPI-fähiges Programm gegenüber dem Betriebssystem ausweist. Wen die Hintergründe interessieren, der sei auf den Blogeintrag Scaling to different Screens vom Building Windows 8-Blog verwiesen.

Für Google Chrome stammt der entsprechende Bugeintrag vom 16.09.2012. Bisher ist der Bug aber immer noch nicht gelöst. Er hat als unangenehme Nebenwirkung, dass die Bedienung durch Touch mit Google Chrome nicht richtig funktioniert.

Für Retina-Displays gab es in der Mac OS X-Version recht zügig einen Workaround, was einfacher war, weil es dort nur zwei verschiedene Pixeldichten zu beachten gibt. Retina-Displays sind nicht umsonst genau 2x größer als die vorher verwendeten Displays.

Windows-PCs dagegen gibt es mit unterschiedlichsten Displaygrößen. Mit der Vielfalt unseres Ökosystems, das dem Kunden echte Wahlfreiheit bietet, gibt es eben auch einen größeren Arbeitsaufwand für Programmierer. Hier eine Statistik über die übliche Bildschirmauflösungen bei Windows-PCs…

…und der üblichen Auflösungen und Bildschirmgrößen in Windows 8:

Nachdem für Google Chrome die Aussage der Entwickler “Gene will hopefully be fixing this up in the next few days, or at least ascertaining what needs to be done.” etwas optimistisch war (das ist demnächst auch schon ein Jahr her), habe ich mich umgeschaut, welche anderen Möglichkeiten heute als Workaround sich anbieten.

Als erstes kann man natürlich die systemweiten Einstellungen verändern. Wenn man die Option “Manuell eine Skalierungsstufe für alle Anzeigegeräte auswählen” aktiviert, bekommt man das frühere Verhalten wieder zurück und alle Anwendungen verhalten sich mehr oder weniger konsistent.

SNAGHTML5c9fa89

Der Nachteil ist der Verlust der automatischen Skalierung bei mehreren Bildschirmen. Wer nur einen Bildschirm oder mehrere Bildschirme mit ähnlicher Pixeldichte hat, für den mag das gehen. Da ich gerade eine Lösung für unterschiedliche Pixeldichten brauche, hilft mir das nicht weiter.

Zweite Lösung ist das Abschalten der automatischen Skalierung auf Anwendungsebene. Dazu muss man in der Programmverknüpfung die Option “Skalierung bei hohem DPI-Wert deaktivieren” setzen. Am Beispiel von Google Chrome geht man in den Ordner

"%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Google Chrome"

und ändert die Einstellungen in den Eigenschaften der Verknüpfung von Google Chrome auf dem zweiten Tab:

SNAGHTML5cf7b69

Danach muss man zwar die Programm-UI von Chrome möglicherweise mit der Lupe bedienen, aber den Webseiteninhalt kann man mit STRG + PLUS vergrößern. Die Schriften und Grafiken werden dann wieder glasklar dargestellt und die Toucheingabe funktioniert auch wieder.

Natürlich kann man auch gleich zu einem HighDPI-fähigen, modernen Browser wechseln. Internet Explorer 11 wird von uns mitgeliefert und zeigt keines dieser Probleme ;-)

Ich hoffe, dass jetzt durch Windows 8.1 der Druck auf Anwendungsentwickler soweit erhöht wird, dass diese seit mehr als 10 Jahren sträflich vernachlässigte Funktion als Standardfall beim Testen mitberücksichtigt wird.

Have fun!
Daniel

Screenshot.png