Set screen refresh rate on Android 11

On Android Application.targetFrameRate=60 should give you the same results as vsync=1 (on devices with 60Hz display).
So as long as you are using a targetFrameRate such as 60, 30, 20, 15 … (for 60Hz) you should not get any additional stutter on mobile.

“Optimized Frame Pacing” always picks the closest possible target frame rate, so e.g. for an “odd” framerate such as 37 we would use 30.

As part of the Android work for Tautvydas’ “deltaTime” changes we also changed the behavior of vsync on Android to match iOS. This means that the vsync setting will be ignored in Unity 2021 and later and it’s always treated as vsync=0, so targetFrameRate should be used. We expect that this will work well with future true variable refresh rate displays on mobile.

Unity’s Android already used the vsync timestamp from Android’s Choreographer API when possible for more stable deltaTime.
So the improvement you will get in 2021 are smaller on Android compared to some other platforms. But issues like https://issuetracker.unity3d.com/issues/android-time-dot-unscaleddeltatime-does-not-match-time-dot-deltatime-when-timescale-is-1 are be fixed.

“Optimized Frame Pacing” uses Google’s “Swappy” (https://android.googlesource.com/platform/frameworks/opt/gamesdk/+/refs/heads/master/src/swappy/).
It does frame pacing but it also does adjust the refresh rate if possible. E.g. on a Galaxy S20 with Display set to 120Hz it would change the refresh rate to 60Hz when Application.targetFrameRate=60).
We are currently not using Swappy’s “auto mode”, which would dynamically adjust the target frame rate based on CPU and GPU times.

Btw there are still some known issues with Swappy on old devices (Android 5.1 and older). We are looking into those.