Tick cannot go lower than 16ms

I’m trying to build play with MonoGame and I’m trying basing this regarding the GameTime steps. In my main Game class that is being run in the main entrypoint of my project, I’m doing something like that:

gameScreen.IsFixedTimeStep = true;
gameScreen.TargetElapsedTime = TimeSpan.FromMilliseconds(1000d / 120);

With a TargetElapsedTime at about 8ms, the “Draw” method of my current screen should display an ElapsedGameTime of 8ms but it’s always displaying me 16ms.

Is it normal? Can’t we go lower than 60fps in FixedTimeStep? I’ve tried to make a custom loop on another running at 120 fps (without going through the MonoGame pre/post-draw) and it’s running correctly.

Can you guys give me some hint?

I’ve fetched few answers before asking my question and some people were talking about the Vsync issue. So i’ve set up this:

_graphics.SynchronizeWithVerticalRetrace = false;

But the result is the same

Have you looked at:

Sounds however that you’re already doing the same thing…

Timespan unfortunately rounds in most of its methods, including FromSeconds. You can get a very precise framerate with
TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond * fps)), where fps is the number of frames per second. I’ve had success with it; let me know how this works out for you.

I think there is an issue with your method, shouldn’t it be TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond / fps)) ? Otherwise it seems kinda off and the graphics update are very slow.

But… I think that the link of Olivierko helped me !
I’ve changed my GraphicsDeviceManager init by adding this line:
_graphics.PreparingDeviceSettings += (sender, e) => { e.GraphicsDeviceInformation.PresentationParameters.PresentationInterval = PresentInterval.Immediate; };

And the updates are done at 8ms! My question now is, what does that do ? Why changing this parameter switched my main game loop from 16ms to 8ms ?


My bad, I didn’t link accurate code for doing it. Here’s a method I use:

public static TimeSpan GetTimeSpanFromFPS(in double fpsVal)
    //Return TimeSpan.Zero for values less than or equal to 0
    if (fpsVal <= 0d) return TimeSpan.Zero;

    //Round to 7 digits for accuracy
    double val = Math.Round(1d / fpsVal, 7);

    //TimeSpan normally rounds, so to be precise we'll create them from ticks
    return TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond * val));

About the Immediate present interval, according to the comments:
The driver updates the window client area immediately. Present operations might be affected immediately. There is no limit for framerate.