Gfx.PresentFrame and Gfx.WaitForPresent

  • It depends on how you measure/calculate your FPS. E.g. if you count frames and divide them by time, you’ve effectively averaged the FPS and if the frames flip-flop between hitting the 16.66 ms mark or the 33.33ms one, well the average is going to be somewhere in between.

  • It’s not fixed to 60,30,15 fps for all phones. Some phones have odd screen refresh rates like 45hz, 50hz or 90hz so their vBlank interval is different to a 60/30hz one. You can check Screen.currentResolution.refreshRate to find out the refresh rate. Also see the description for Application.targetFrameRate for slightly more details.

I hope you’re not taking my elaborations for point 1 as a captain obvious answer but most FPS display solutions and scripts out there do some averaging of the frame time, which might not be obvious if you didn’t check how they work under the hood.

Also, what is fixed to the vBlank frame over frame is the time at which the Render thread recieves the OK to continue and work on the next frame. The main thread should be roughly following that but there could be some frames where it doesn’t. The Profiler’s Timeline view is usually the best way to look at this to form a better understanding. There’s also some minor [disturbances in the stability of Time.deltaTime based on the way the update loop used to be organized pre 2020.2]( https://discussions.unity.com/t/639394 page-8#post-5756152) that could affect such measurements.