Pixel 4’s 90Hz screen drops back to 60Hz when its brightness drops below 75%. Google promised to fix it, but hasn’t offered an explanation why this was necessary in the first place. The code commit comments might have managed to fill us in though.
It seems that the display uses different calibration profiles for 60Hz and 90Hz modes. And the display maker hasn’t matched them perfectly, which leads to slightly different brightness levels.
Slight, but still enough for people to notice it when the screen goes from 90Hz to 60Hz or vice versa (and it does switch fairly often, e.g. there’s no reason to render a static screen at 90Hz, but the second you start scrolling it needs the high refresh rate).
The difference in calibration is more pronounced when the screen brightness is low. To make matters worse, our eyes are more sensitive to changes in brightness in the dark.
Anyway, this explains why forcing 90Hz mode from the Developer options avoids this issue – the screen simply never goes back to 60Hz. But it does raise the question of how Google plans to fix things. Will it accept the small change in brightness or has it worked out better profiles for both refresh rates?
Here are the comments from the developers. You can find the originals here.
Due to hardware limitation, flickers are seen when switching between 60 and 90hz at low display and ambient brightness. Force the display to stay at 60hz when ambient and display brightness are low. The display uses different gamma curves for different refresh rates.
It’s hard for panel vendor to tune the curves to have exact same brightness for different refresh rate. So flicker could be observed at switch time. The issue is worse at the gamma lower end. In addition, human eyes are more sensitive to the flicker at darker environment. To prevent flicker, we only support higher refresh rates if the display brightness is above a threshold. And the darker environment could have higher threshold.