Scaling Windows - The DPI Arms Race
by Brett Howse on April 15, 2014 2:00 PM EST- Posted in
- Operating Systems
- Windows
- Microsoft
- Windows 8.1
- High DPI
Where It All Falls Apart
As with many things in Windows, the operating system is too trusting of developers. Of course not all developers fall into this trap, but many applications in Windows (including many written by Microsoft) don’t follow the best practices on how to deal with High DPI displays. Let’s take a look at one example – VLC player.
VLC 1.0 is what is referred to as a DPI-unaware application. The application was created to render at 96 DPI and it just expects the display to match. This makes the application undersized on a High DPI display, but thanks to DPI Virtualization Windows can automatically scale the application up to match the DPI settings of the display. This does introduce some blurriness to the appearance, but all menu controls and fonts are the correct size for the screen as seen here:
Looking at that image, it’s clearly upscaled but it’s also completely usable. So what’s the issue? VLC is a media player. With DPI Virtualization, media being played back through the application is also rendered at 96 DPI, and then scaled up off screen. This produces a video that appears blurry to the end user, which is not what VLC wants. To correct this issue, the VLC developers changed the application to declare it as System DPI-aware. This disables Windows’ scaling of the application, and Windows expects the application to scale itself. However, in the case of VLC player it doesn’t actually do any scaling at all as you can see in these screen shots of VLC 1.1.1 and the most current version 2.1.3:
Here, any of the UI elements that are handled by the operating system are scaled to the correct DPI settings, but the rest of the application is not scaled at all, which results in an application with unequal proportions. I’m not picking on VLC player here – it is just one of many applications that do exactly the same thing. It’s a great example to show the progression of when a coding choice was made to enable the flag and view the results of the change, as older versions of the software are still readily available. Also in VLC’s favor is the fact that their UI elements are somewhat oversized to start with. This could easily have been a design decision that their application was already usable at High DPI, so it’s not worth scaling the UI at this time.
Let’s look at another application which has long been called out for having issues when Windows is run on a High DPI system – Google Chrome. The oddest thing about Chrome not scaling well is that Chrome does actually support High DPI. Chrome OS, Mac OS X, and obviously the Android versions of Chrome all scale well. But on Windows? There are issues. Here’s a screenshot of Google Chrome taken on my Lenovo Yoga 2 Pro at 3200x1800 with Windows scaling set at 200% (the default setting from the factory):
To see the issues, you’ll likely have to open the full resolution version of that screenshot. At first glance all seems pretty nicely scaled with Chrome – the “chrome” of the browser is not tiny, tabs appear to be the correct size – but look at the actual text on the webpage.
With the cropped image, you can instantly see that the font that Chrome is using is not scaling very well. Text in Chrome on a High DPI system is very poor, and defeats the purpose of using a high resolution screen since you actually lose fidelity rather than gain it.
Chrome, unlike many other apps, does have some workarounds to this issue; unfortunately it’s not something the average computer user would ever be able to figure out. First, you have to open chrome://flags setting page and then enable HiDPI Support Windows. Next, you have to right click the Chrome icon on your desktop, choose properties, and then the configuration tab. Here you need to check the box that says “Disable display scaling on High DPI settings” and apply.
What this checkbox does is actually disable the DPI Virtualization on a per-application basis. Chrome will now use XP style scaling. If you don’t check this box, Chrome will disregard the flag in its own settings, and continue to render text very poorly. The only reason I can think of for Chrome to not use the newer DPI awareness API and instead use the old XP style DPI setting request would be because Chrome is still supported on XP. It’s a strange decision though because running a High DPI system on Windows XP is not a great experience. It’s unfortunate for Chrome users because most of them will never know just how poor of an experience they are getting on newer systems. However, with these changes in place, Chrome now renders correctly.
Next, let’s compare Chrome to an application which does follow best practices – Internet Explorer 11. IE11 correctly queries the operating system for the current DPI setting. When it receives the response, it rescales the UI elements as necessary, and then uses its Zoom feature to enlarge the actual web page. The result is a web page that looks exactly as it should.
IE11 also uses the queried DPI level of the operating system to set the default zoom level, so if you are a heavy keyboard user and you like to use Ctrl+0 to get back to 100% zoom, fear not. This still works, but the default zoom will be a higher number than 100% depending on the scaling factor chosen. Here’s another screenshot of IE11 with the resolution set to 3200x1800 and the DPI set at 96 DPI.
At first glance, it looks hilariously bad, but in fact it is doing exactly what it is supposed to. IE has queried the operating system for the DPI level (now set at 96) and scaled correctly to that level. Not all of Microsoft’s applications do this, but most are not as high profile as Internet Explorer.
114 Comments
View All Comments
Antronman - Tuesday, April 15, 2014 - link
4k display on a notebook would have to be achieved with top-end mobile graphics.The display would likely need a 30Hz refresh rate to avoid screen tears. It would really only be something practical for 2D artists who do a lot of their work on the go.
As far as scaling, I imagine it would work exactly the same as on an external monitor.
darthrevan13 - Wednesday, April 16, 2014 - link
Being a week before the Toshiba Satellite P55t no one has any answer but looking at their 65L9300U UHDTV with 60hz and real HDMI 2.0 that launched not too much time ago things aren't looking so bright because when put on a lower resolution things get a little blurry. The scaler is hardware based (to keep up with the enormous resolution and refresh rate) not software based so until someone makes a silicon that viably handles 4K, 1080p and 720p you'll be stuck.B3an - Friday, April 18, 2014 - link
I don't know why people like you think that 4k is hard to do. An average GPU can easily handle 4k @ 60hz. It's only for gaming that requires something more powerful.B3an - Tuesday, April 15, 2014 - link
Brett - nice article. One thing i wanted to point out though is that the workaround you mention for Chrome does not work. Turning on HiDPI still has issues. The UI is messed up and pixelated, and text still isn't rendered correctly - the spacing of the letters is messed up. You can also see this in your text screenshot, look at the word "committing", the two M's are too close together. With other letters some are too far apart (depends on the word). Chrome is just screwed up, it's best you FF or IE. FF has small issues though but the text atleast renders correctly.Tujan - Wednesday, April 16, 2014 - link
Perhaps the ideas about a notebook,or a tablet concerning the displays are somewhat different than a standalone monitor with different manufactured possibilities. That is a Hi ppi on a notebook is not 'exactly' a PNP device. It may even be moreso (not pnp) presently when graphics cards,and monitors have several different plugs available HDMI,Display Port,VGA,DVI ect. . At least more presently,the high PPI for purposes of updating applications might be considered something other than PNP - to that requiring a driver from the manufacturer. Or that would provide a foundation for its feature set.I say this not necesarily as a priority. But in a role model that would consist of running with the display driver,and would as well become consistant with the programming coordinates.
The System wide DPI thing as with XP,this was one example of a the difference in application independent resolutions. The application itself,the system menus,title bars,start menus,desktop fonts as well as default texting was something wich was system wide among ALL applications.
You also said that Apple applications are PPI aware. And that exactly takes the coding to create applications for the PPI in use.
Then that the 'SetProcessDPIAwareness',a setting in the Windows newer application programming base is something that can do pretty much the same.
Funny thing about VLC,is that I'm wanting to ask what file type the video was which had anything to do with the DPI.
And with this,most of the modern day programing I'm suspecting is the standardization of,and off of the XML type 'Webbies coding. And this is a complete modernized code based from the W3C,type and formerly HTML type standards. Then those standards would be instilled to the screen programming.
Thus not C+,C++,python etc.
With the Adobe,the picture there,it isn't said if the screen was a 24"4K,or a 12" hi PPI screen.
I'll wrap my comment up with what I noted at the first, is the monitors they are PNP (are they not ). Or are they just 'not exactly pnp'. There is video drivers but not a monitor driver.I'm just looking to show where you would 'map the platte',for /from .
So where am I going ? With Windows code base as XML - the webbies. There is still the matrix of the PNP monitor. That perhaps isn't pnp- or shouldn't be. Now there are graphics drivers for other programming (Try OpenGL) . That are plenty more than just page elements.
Windows also has some apps which is Dirx capable. That is perhaps a solution. But I suspect there is some fantastic code that needs to run independent DPI/PPI. That is requiring the metrics to do so. With whichever/whatever operating system is being used. Or what monitor is being used.
Try running for example,a legacy 640x480 dimension ,that scales in leisure on that 4K monitor. You can of course turn on ,and turn off whichever monitor pixel you want. But look,it scales in inches. The application.
Try running a legacy 800x600 resolution to the same. See it is the 'monitor',that is stuck in its resolution . It is somewhat might be the same,as having a virtual op.sys.run in a virtual window for a different second virtualize op.sys. .
You can run virtualized monitors,in application space,that scales to suffice the viewing logistics.
MOst of this article has put across the independent applications space. But not yet the independent resolution of a the application in the monitors dynamic space. And everybody needs those numbers.
I would say the monitors must be able to use independant low resolution in dynamic space .
Just saying.
P.S.Thanks for the charts.
Tujan - Wednesday, April 16, 2014 - link
mean if you need 96 ppi . You have it . If you need 640x480 in 24 inches . You have x amount of dots/pionts per inch to address. Either use those pixels. Or dont use them. You may in fact have a window doing x amount of hrz. . Then another window doing a different hrz . Just to make things easier to understand .Pinkynator - Wednesday, April 16, 2014 - link
I have a reasonable idea: don't invent custom DPI.If an old 23-24" monitor is 1920x1080 (that's 96 DPI, IIRC), a new model should be 3840x2160 (which should then be double, 192 DPI, and that's more than enough for a desktop monitor for anyone in the world not to notice individual pixels).
Don't have a high-DPI app? Just scale assets in both dimensions by exactly 2. Your toolbar icons don't get blurry due to resizing. Fonts don't get blurry, either.
Have a high-DPI app? Okay then, let the app give Windows its new high-res icons and let it render fonts with greater accuracy.
Movies and games? They can render at 1920x1080 and will look exactly the same as they previously used to. No blurring because of resizing algorithms: every pixel gets quadrupled, plain and simple.
With this "solution", everything looks just like it used to (no compatibility issues whatsoever), except when app developers explicitly decide to make things look better - and handling a straight-up 2x scale is a lot easier than today.
"But wait!", I hear you cry, "I like my 125 DPI on this screen! It shows more of the UI!"
Let me know how that goes in a few years, when your vision starts deteriorating due to aging, and you find even 96 DPI to be a wee bit too small.
DarkXale - Wednesday, April 16, 2014 - link
I really recommend you actually, you know, read the article?Pinkynator - Wednesday, April 16, 2014 - link
I did. You didn't understand what I wrote :)You're not looking at the big picture. Handling DPI issues is insanely hard on legacy systems, which is why the only painless solution is to quadruple everything - based on 96 DPI. Then you get 192 DPI (or 288 DPI) "for free".
Everything else is going to be hacks. We're still not truly in the era of high-DPI Windows machines, so there's STILL time to just unhack everything and go for easily-dealt-with multiples of 96.
UsernameAlreadyExists - Wednesday, April 16, 2014 - link
>"Handling DPI issues is insanely hard on legacy systems, which is why the only painless solution is to quadruple everything"And this here is the reason for the Retina display (and also the rather crazy current iPhone resolution), as the iPhone apps do not handle scaling at all. This was probably the cause for the rather low resolution with the last Symbian phones, 4x would have required 25% more pixels than iPhone 4, and would have been too expensive at the time of their release.
However, I think going forward and just breaking things is the correct way. Winforms have their problems, but XAML makes rather many things easy. (The paradigm shift is rather big though)