Intro:
I'm honestly shocked how much temporal dithering truly is responsible for the vision and fatigue issues I've had with technology for YEARS, and just how much obviously better I can read, see, and just basically function and feel like I actually have energy in general the moment I figured out how to eliminate temporal dithering from the screens I spend the most time on.
When temporal dithering is truly eliminated it feels like some of my reading and concentration issues just "immediately vanish as if they never existed". It feels like magic. Dithering is so obvious to me, the screen is constantly twitching and shimmering colors in the corner of my eye, and feels like trying to read something that never becomes a fully solid object. I can't wrap my head around how most people don't notice this or want it to stop so their screen can feel as still as printed text.
I am about as Gen Z as you can get by the way, so this is not just an "old person thing".
Putting this out here so y'all can know that you are not alone.
Anyway, as macOS is one of the worst offenders in regards to temporal dithering β with it being baked into the OS and being essentially impossible to fully disable β I wanted to find a way to truly use macOS dither-free.
Previously, I've had luck in turning a Retina MacBook Air into a comfortable Windows laptop, which is great for design work as the screen is still very color accurate even with color management disabled.
(Edit: Compared to the 2012 Windows laptop setup detailed in this post, the 2018 MacBook Air is TRASH, LOL, the Air still has some strain even running Windows. But my actual old Windows laptop is close to perfect.)
However, as a developer I often need to rely on Mac apps. I was wondering if it could be possible to set up another device for coding and other text work that both allows me to use macOS and feels even more comfortable than my Windows 10 Air.
I've done it! I decided to set up an old Windows 8 laptop as a remote desktop client for my Intel MacBook Pro. I am using the free NoMachine app. After a week of use for many hours a day, I can safely say that this has enabled me to use macOS apps with zero eye strain.
On remote desktop compression artifacts: at least regarding this setup, they do not bother me at all. Any artifacts remain able to become entirely still while reading and not actively interacting, provided the client is dither-free and everything is set up correctly. I've also just learned to deal with the lag and random frame rate drops lol, owning an e-ink tablet definitely helped my brain get used to that π
I will now post my exact working setup. I'm listing everything for completeness' sake, but I am including the ββ symbol on the lines that are essential to reproduce my working setup.
CLIENT (Windows)
PC specs:
[General]
ββ Lenovo IdeaPad Yoga 13 (2012, Model: Mocca 2.0)
BIOS: 66CN51WW
Processor: Intel Core i7-3537U (Ivy Bridge) @ 2.00Ghz (2.50Ghz)
Memory: 8 GB
Storage: 256GB
Display: 1600x900 IPS (6-bit), Touch
ββ Graphics: Intel HD Graphics 4000
ββ Screen protector: NONE
This is actually important! There was an ancient screen protector on mine and the laptop became SO much more comfortable to look at after taking it off, even after disabling temporal dithering had already increased comfort by a ton already.
[OS details]
ββ OS: Windows 8.1 Pro (Build 9600), clean install done in 2019
Most recent updates: KB3000850 (11/21/2014) and 2019-11 Quality Rollup KB4525252 (12/2/2019)
General drivers: Default drivers installed from the Lenovo website in 2019
ββ Intel graphics driver: 10.18.10.4276 (8/27/2015)
[Windows settings]
ββ Backlight: 100%
ββ Use Windows display calibration: OFF
Mouse pointer shadow: disabled (possibly important as the cursor is GPU accelerated?)
Cursor blinking: disabled
Keyboard remap: Win and Alt key swapped with SharpKeys (for correct Cmd key location when connected to the Mac)
ββ ditherig.exe: Ver 2.1, Disable all dithering functions (IMPORTANT!)
What's amazing and VERY interesting about this Windows laptop is it seems that although the display appears to be 6-bit and uses "FRC" to achieve 8-bit color by default, this FRC is actually "simulated" entirely through the GPU instead of being baked into the display controller.
So when dithering is disabled via ditherig.exe, this doesn't just disable dithering of GPU-accelerated gradients and color adjustments, it also fully reveals the true 6-bit form of the display.
Very noticeable banding appears and the pixels become ENTIRELY stable.
Windows NoMachine client settings:
[Input]
Always show remote cursor pointer: ON (The "cursor trail" effect this creates is actually very relaxing to me)
^ EDIT 10/6/2024: I actually prefer remote cursor off now, since if you leave it on causes the remote cursor to "move around" nearby compression artifacts. However, sometimes NoMachine is finicky and the remote cursor annoyingly stays on (usually restarting the Mac's NoMachine server or the Mac itself can fix this)
[Display]
β Quality: 4th out of 9 notches
β Resolution: 1600x900 non-retina (set via BetterDisplay dummy)
[Advanced Display]
Disable network-adaptive display quality: ON
β Disable multi-pass display encoding: ON
β Disable frame buffering on decoding: ON
β Disable client side image post-processing: ON
β Disable client side hardware decoding: ON
β Request a specific frame rate: 30FPS
[Connection Info]
β Player version (Windows client): 8.4.2
β Server version (Mac server): 8.11.3
β Display: 1600x900, 30 FPS
β Encoding: SW encoding
Audio: Opus 11kHz mono
SERVER (Mac)
Mac specs:
[General]
MacBook Pro (15-inch, Retina, Mid 2015)
ββ OS: Version 12.6.8
Processor: 2.8 GHz Quad-Core Intel Core i7
Storage: 1TB
Memory: 16 GB 1600 MHz DDR3
ββ Graphics: Intel Iris Pro 1536 MB (this is an AMD model, but Intel is forced with gfxCardStatus)
[Mac settings]
ββ Internal display color profile: NULL ICC Profile (this may be important?)
ββ Color depth: 8-bit
When forced to Intel, this is actually the only option in the menu. However, a 10-bit option also appears in AMD mode.
Boot flags: nvram boot-args="dither=0"
This DOES disable Intel gamma table temporal dithering, but doesn't turn off the extra OS-level dithering used by macOS (yes, this is a real thing), so the actual 2015 MBP display looks slightly better but still has noticeable shimmering, glowing, and twitching text, meaning the Mac display is still hard to read.
However, remote desktop data is sent before ANY dithering step is applied, so attempting to disable dithering on the Mac probably doesn't matter anyway.
The type of hardware video encoding and compression algorithm is what matters most for remote connection, so forcing Intel is most important as AMD mode will use a different video encoding method.
Cursor blinking: disabled (Heads up, this seems to be no longer possible on macOS Sonoma.)
defaults write -g NSTextInsertionPointBlinkPeriodOn -float 1000000
defaults write -g NSTextInsertionPointBlinkPeriodOff -float 1
[Apps]
Chrome: 121.0.6167.184 (HW acceleration enabled, sRGB color profile forced in chrome://flags)
VS Code: 1.85.2, Electron 25.9.7 (HW acceleration disabled)
IntelliJ: 2023.2.1, Build 232.9559.62
EDIT 10/6/2024: I am now successfully using Chrome 124.0.6367.218 (running on the Mac server)
ββ NoMachine: 8.11.3
[NoMachine server settings]
ββ Performance: UNCHECK "use acceleration for display processing" (important!) Also disable "use hardware encoding".
[BetterDisplay settings]
Version: 1.4.15 Build 15141
Internal display: LID OPEN (backlight at zero)
ββ Primary display: 16:9 BetterDisplay dummy, 1600x900, mirrored to internal display
Color LCD: software-based video adjustments ON, color table manipulation OFF
Dummy color profile: sRGB IEC61966-2.1 (this seems to not affect anything on Intel, trying to change it resets back to sRGB)
What about using an M1 Mac (Apple Silicon) as the host?
YMMV. Apple Silicon Macs use different hardware video encoding and I couldn't configure an M1 Mac to stream the same way my Intel does. NoMachine offers "H.264" and "VP8" modes for compression on an M1 server, but I wasn't able to get "VT" encoding to show up in connection info like I can with the Intel.
H.264 is very fast, but something about it looks very off to me in a way I can't really place. VP8 feels much more relaxing to look at, but causes lag and compression artifacts can get pretty thick sometimes.
In addition, selecting the "software encoding" option instead (which I don't use anyway) seems to not be functional on M1, since connecting will still show "hardware encoding, H.264" in connection info.
EDIT 10/6/2024: I have now been using this sucesfully with an M1 Air server for a few months. Interestingly, the M1 Air can activate "software encoding" fine which makes it usable now, but the M1 Max MBP I used to have was stuck in hardware encoding mode. Possibly this is fixed for the MBP with newer NoMachine Server versions but I'm unsure.
κ©π