[Can't decide what docking hardware to buy? Click for a comparison of many popular docking options]
Skip down to the bottom for a regkey workaround and a tutorial on how to setup your Surface Pro 3 for a seamless multi-mon experience.
Update: Check out our demo video of this hack in action with the new 3-in-1 Dock:
Windows multi-monitor support has improved quite a bit over the years and provides a great productivity experience that is, frankly, superior to other operating systems on the market. The experience is excellent when using multiple monitors of the same type and pixel density (dpi). But what if you have an old low-dpi monitor and a new hi-dpi monitor and want to pair them together? Or what if you buy a new laptop or tablet like the Surface Pro 3 with a beautiful hi-dpi screen but want to use it with your old monitors? Sometimes it just doesn't look right:
You might think that it would be easy to just make stuff a bit bigger on one screen and a bit smaller on the other screen to get them to match up. But behind the scenes its quite a bit more complex than that.
Windows Desktop scaling:
Portions of Windows rely on a set of bitmap graphical assets that are designed to-the-pixel to look awesome. What this means is that if the asset is 40x40 pixels and displayed at 100% scaling on screen, it takes up 40x40 pixels and looks exactly as the designer intended. Depending on the physical dpi of the screen, that 40x40 pixel bitmap might be 2 inches tall (84" 1080p television) or 1/10" tall (Google Nexus 5 1080p phone). To account for different physical screen dpi and typical viewing distances, Windows has the ability to scale the size of these bitmap assets. If you scale to 200%, that 40x40 image becomes 80x80. Many of the assets in Windows are stored at multiple scaling levels so that they do not need to be scaled on the fly. This saves processing time and allows the assets to be optimized for each scaling level exactly rather than relying on a generic anti-aliasing or interpolation scheme. For Desktop, these pre-set scaling levels, or plateaus are 100%, 125%, 150%, 200%, 250% etc. When using these scaling plateaus with monitors that have different dpi, Windows 8.1 can set one scaling level for one monitor and another scaling level for a different monitor so that the sizes match up as closely as possible. This setting is done behind the scenes and uses a formula that takes into account the physical screen size and physical dpi to get the best match. Windows 8.1 does not expose an interface to the user to choose different dpi scaling per monitor. (Windows 10 does but still has some limitations.) Most of the time, the automatic matching works great, but not always. Windows has the ability to set an arbitrary system-wide scaling factor as well such as 107% but this disables the ability to set independent scaling factors per monitor and the scaling is done on the fly which can have a minor impact on performance but potentially a major impact on visual quality for some applications. Other portions of Windows use vector graphics which are suited to scaling by their very nature and work well across all scaling schemes.
Microsoft Office and many 3rd-party applications are designed with dpi-scaling in mind and work well at the various pre-set dpi-scaling plateaus. Some 3rd-party apps and legacy Microsoft apps that are dpi-unaware don't look very good when scaled. Sometimes certain UI elements or fonts look a little blurry because of the generic anti-aliasing/interpolation scheme being used. In other cases, certain portions of the UI may be scaled and other portions are not. MSDN has provided developer guidance on how to account for dpi-scaling since the Introduction of Windows Vista Beta in 2005. 9 years later, most applications are following this guidance pretty well, but some still fail miserably.
More on viewing distance vs physical dpi:
Typical laptop/tablet users have the screen placed about 20-25" away from their eyes. Desktop monitors are typically pushed back to 30" or so. That extra 5-10" is a big difference and the visual system has a much harder time distinguishing individual pixels at that distance. Windows takes advantage of this fact and makes assumptions about the typical viewing distance based on the monitor size, then chooses a dpi-scaling factor based on the viewing distance and physical-dpi combined. The goal is to have on-screen UI look approximately the same size across a wide variety of use cases. There are some standard approaches for choosing the ideal screen viewing distance based upon the properties of the screen, content being displayed and the abilities of the average human visual system: https://en.wikipedia.org/wiki/Optimum_HDTV_viewing_distance#Human_visual_system_limitation The key takeaway is that the closer your eyes are to the screen, the more dpi matters. What this means in practical terms is that if the screen is too far away you may not be able to see any additional detail with fancy 4k monitors.
This approach breaks down when you pair a large monitor optimized for a 30" viewing distance with a laptop optimized for 20" viewing distance and the result is that objects on one screen look larger than than on the other. The results look even worse if the physical dpi of the two screens are vastly different as is the case with modern laptops vs regular 1080p monitors. So what can be done?
We already know that Windows works really well for most applications when the default scaling plateaus like 150%, 200% are used. What if you have a monitor with 100dpi and another with 115dpi, what scaling factor should be chosen for optimal results? Using the default scaling plateaus, it will be impossible to get the sizes to match up exactly. For example, if you have both screens at 100%, then UI will appear 13% smaller on the 115dpi screen (100/115=87%). If you choose 100% on the 100dpi screen and 125% on the 115dpi screen, the sizes match up closer but there are potential side effects. For example depending on the application, dragging a window from one screen to the other will cause an artifact where the window size will change as you cross over to the other monitor and all the text will re-align to be optimized for the other monitor. Because applications may handle this differently (FireFox vs Internet Explorer is a good example) user perception is an overall inconsistent experience. Many people don't mind, but it certainly isn't ideal.
To avoid some of these issues, you can choose monitors that either have the same physical dpi, or choose monitors with a pixel density that maps to the scaling plateaus like 125% or 150% very closely. Also there are some tricks where you can change the screen resolution to something other than the native panel resolution (something that is usually discouraged for visual quality reasons) yet achieve better results than built-in dpi-scaling.
Case study: Surface Pro 3 multi-mon:
The Surface Pro 3 screen is wonderful with a 2160x1440 resolution in just 12" (216dpi). Given all the info above, how would you choose a monitor to pair with it? The ideal monitor would have the exact same dpi. Unfortunately, there are few monitors on the market with ~216 dpi:
- IBM T221/ViewSonic VP2290B 3840x2400 resolution @204dpi costs $1000 used on ebay
- Dell UltraSharp 27" 5K 5120x2880 resolution @218dpi costs $1650
But what if we target half that dpi? It turns out that a few standard monitor sizes are about half the dpi and quite economical:
- 21.5" 1920x1080 HD panels @103dpi ~$120 (Asus VS229H-P)
- 27" 2560x1440 WQHD panels @109dpi ~$400-$700 (Dell U2713HM)
- 39" 3840x2160 4K panels @102-113dpi ~$400 (39-43" UHD HDMI 2..0 monitors)
Ok so what? Half the dpi still doesn't match. Well If we could set 100% scaling on the desktop monitor and 200% on the tablet screen that would be ideal. Unfortunately because of the assumptions Windows 8.1 makes about screen size and viewing distance, the SP3 screen is set at 150% instead, so it doesn't match up.
But there is a simple workaround. We already know that the further away the screen is, the less dpi matters. If the SP3 screen is ~30" away right next to your desktop monitors, why not avoid software dpi scaling altogether and let the GPU and panel take care of it? Instead of using the native 216dpi, you can drop that in half to 108dpi to match the external monitor. GPUs and panels are *really* good at scaling to even integer divisors of the native resolution and look quite crisp. With the SP3 oriented in portrait configuration and held by hand right next to a 21.5" panel it matches almost exactly:
Unfortunately, the Surface Pro 3 does not let you set this resolution or other 3:2 aspect ratio resolutions by default. You can set some lower-resolution 16:9 aspect ratio resolutions but that will result in letterboxing or black bars on screen. So we need to tweak things around to get the proper resolutions. The same methods can be used for other premium laptops.
- backup your system (use at own risk - modifying the registry can have side effects and precautions such as backing up your data should be taken before modifying your PC
- download the .reg file
- double-click the .reg file and click OK to import it into your registry
- Having trouble importing a .reg file when downloading via the MS Edge browser in Windows 10? That's probably because it is auto-renaming to .txt for safety. You can rename it back to .reg or import the .txt file from within regedit.exe. Or just download with Internet Explorer or FireFox instead.
- Reboot OR follow these steps to reset the Intel display driver
- open Device Manager
- open the Display Adapters
- right-click "Intel HD Graphics..." GPU and click "disable"
- click "Yes"
- after the monitors stop flashing, right-click the Intel GPU again and click "enable"
- open System - Display - Advanced display settings in control panel and choose your preferred resolution
Add custom resolution to Surface Pro 3 (manual method):
- disconnect all external monitors and set the Surface Pro 3 screen to default scaling settings of 150%, then log off and log on
- download the latest 64-bit .zip package for the Intel 4th gen Core graphics driver: https://downloadcenter.intel.com/search?keyword=Intel+HD+4600
- unzip the driver and use the "Have Disk" method to force install over the default Surface Pro 3 driver:
- start Device Manager
- expand - "Display Adapters"
- right-click on the Intel HD Graphics entry and select "Update Driver Software"
- click "Browse my computer for driver software"
- click "Let me pick from a list of device drivers on my computer"
- click "Have Disk"
- browse to the unzipped driver driver folder \Graphics\igdlh64.inf or similar
- click "Open" then "OK" then "Next"
- after the driver installation completes, reboot
- Right-click on the desktop and select "Graphics Properties"
- Connect all your desktop monitors and use the Display control panel to switch the Surface screen to the new 1080x720 landscape or 720x1080 portrait mode
- On the start screen type in "adjust screen resolution" to open the Display control panel
- Click on the representation of the Surface Pro 3 screen
- Click the Resolution drop down box and select your newly added resolution, then click "apply"
- Click on the representation of the external monitor and click the "make this my main display" checkbox and click "apply"
- Move the representations of the two monitors around to your liking
- Close the Control panel and enjoy!
Low res for desktop, full res for mobile - switch automatically without logoff/login!
A benefit of this approach is that Windows remembers all the different multi-monitor configurations (topologies) that have been used in the past. So even though 1080x720 is set when connected to your specific external monitors, once you unplug those monitors, the SP3 will go back to the native 2160x1440 mode with 150% scaling. So you don't have to sacrifice the fantastic screen. You get hi-dpi when using the SP3 closer to your eyes in tablet/laptop mode, and low-dpi when using it further away where you can't see the individual pixels anyway. Its the best of both worlds! And you don't need to logoff/login to switch back and forth. Just dock and un-dock.
Modern apps in Win 8.1 - use 1152x768 instead:
When the Surface screen is in low-res docked mode at 1080x720, it is lower than the minimum resolution required to run a modern app (1024x768) and you'll get a resolution error. You can work-around this by switching the start screen to the desktop monitor and by making the external screen your main display so that apps open on that monitor instead. If you only use desktop applications, this isn't an issue. but you can also try setting one of the other 3:2 aspect ratio resolutions like 1152x768 to re-enable modern apps on the SP3 panel in docked mode.
Other settings to try:
You may want to experiment with different dpi-scaling settings in addition to the resolution settings. For example, I keep the "system dpi setting" at 150% which is the default. When the tablet is not docked, everything is scaled to 150%. When the tablet is docked, the tablet screen resolution drops and its scaling factor is set to 100% as is the external screen. But if you run dxdiag.exe in docked mode and click "save all info", you'll see the "system dpi setting" is still 150%. This way often works well but you may notice many Adobe applications look too big when run in docked mode because they are honoring the system dpi setting of 150% instead of the per-monitor dpi setting. That is the fault of the application, not the Surface or Windows. One workaround for these programs is to right-click on the .exe file, and on the compatibility tab under settings, ensure that "disable display scaling on high DPI settings" is checked. You may notice that if you keep programs open when docking and undocking, their on-screen size may change after the transition. If this bothers you, just close the app and re-start it. This gets better with the most recent Windows 10 update, but it is not entirely solved. In any case this is what works for me with Windows 8.1 and Windows 10 and I love my Surface Pro 3 even more with these simple tweaks.
- Windows 8 dpi scaling overview: http://blogs.msdn.com/b/b8/archive/2012/03/21/scaling-to-different-screens.aspx
- Windows 8.1 dpi scaling overview: http://blogs.windows.com/bloggingwindows/2013/07/15/windows-8-1-dpi-scaling-enhancements/
- Hi-dpi support for IT pros: http://technet.microsoft.com/en-us/library/dn528842.aspx
- DPI aware MSDN guidance: http://msdn.microsoft.com/en-us/library/ms701681(v=vs.85).aspx
- DPI-aware multi mon WPF application guidance: http://msdn.microsoft.com/en-us/library/windows/desktop/ee308410(v=vs.85).aspx
- My surfaceforums dpi tweak thread: http://www.surfaceforums.net/threads/sp3-multi-mon-dpi-scaling-tweak.10806/
- HDTV ideal viewing distance formula: https://en.wikipedia.org/wiki/Optimum_HDTV_viewing_distance#Human_visual_system_limitation
Back to main blog: https://dancharblog.wordpress.com