Mac FPS locked at 60

Mac FPS locked at 60

FPS is locked at 60 in the shipped game in Development and in Shipping builds. t.MaxFPS 0 and t.MaxFPS 120 don’t make any difference. r.VSync is 0.
Here’s the video demonstration on an empty game mode, empty level and Scalability settings set to Low:

As you can see, the game takes ~2 ms, the GPU takes ~2ms, so I should be getting around 250 FPS.

How to get more than 60 FPS on Mac?

1 Like

Was the Mac connected to a power source when you made the tests? it could be a power saving issue.

Yep. It’s always connected. Also the AMD gpu is used and not the built-in one, at least that’s what Activity Monitor reports.

Can anybody on Mac confirm that they can or cannot get more than 60 FPS? So I understand if it’s everyone’s problem or just on my machine and project?

I just tried the recommendation from this thread: Why is t.MaxFPS 0 locked to 60fps? - #2 by MrGoatsy

r.DontLimitOnBattery 1 did not work.

I added this function:

void UBlueprintFunctionLibrary::ReportMaxFPSAndTickRate() {
    GEngine->AddOnScreenDebugMessage(0, 0, FColor::Yellow, FString::Printf(TEXT("Max FPS From Engine: %f"), GEngine->GetMaxFPS()));
    GEngine->AddOnScreenDebugMessage(1, 0, FColor::Yellow, FString::Printf(TEXT("Max tick rate From Engine: %f"), GEngine->GetMaxTickRate(0)));
}

And called it on tick on game mode, and it reports 0 for both. After setting t.MaxFPS 120, it reports 120 respectively.
Here’s another video which shows that updating t.MaxFPS and the engine reporting max FPS and max tickrate of 120 doesn’t make any difference:

It appears that something else somehow else limits FPS on Mac. PostRenderOpsFX seems to be eating all the available time. That might be what is causing the freeze and locking the FPS.

Any ideas where to look?

This function returns the static MaxFPS. And since it does return 120 after setting t.MaxFPS to 120, I think the system is most likely forcing the 60 FPS.
Does the AMD gpu have a software similar to Nvidia’s control panel? did you check if there are any system/GPU options that can limit FPS universally? I’m sorry but the last time I had an AMD gpu Hitman Blood Money was just released. :smiley:

Thank you, that seems to be what’s happening here. I started looking into it and that’s what seems to be happening here: the system is forcing VSync by default and there’s some Quartz Debug tool that can disable VSync until restart:
https://www.reddit.com/r/geometrydash/comments/lx900l/macos_fps_bypass_download_links_in_comments/

That’s pretty lame that the system doesn’t let users customize this setting out of the box and per application.

Oh wow, I looked up the tool then thought it was a good idea to search GitHub for a solution similar to what the tool does… I thought maybe you could replicate what it does when your game launches, and since it resets on restart it wouldn’t be very intruding, but this seems to be a real problem for so many Mac users! WHY?

P.S. How can I erase the image of the desktop from the Reddit post from my head? :sweat_smile:

I tried this Quartz Debug program and disabled the vsync checkbox but no difference in the game: still locked to 60 FPS.

Unity guys are having the exact same issue: Mac M1 stuck at 60 FPS? - #10 by Tautvydas-Zilys - Unity Engine - Unity Discussions


There’s also preferredFrameRateRange | Apple Developer Documentation and preferredFrameLatency | Apple Developer Documentation

It looks like Metal library is used in Unreal: https://github.com/EpicGames/UnrealEngine/blob/40eea367040d50aadd9f030ed5909fc890c159c2/Engine/Source/Runtime/Apple/MetalRHI/MetalRHI.Build.cs#L6

In the build configuration it links MetalCPP, MetalShaderConverter, Meta and QuartzCore libraries.

After reading through the list of files and the code a little, I found the Present function that Unreal uses to draw: https://github.com/EpicGames/UnrealEngine/blob/40eea367040d50aadd9f030ed5909fc890c159c2/Engine/Source/Runtime/Apple/MetalRHI/Private/MetalViewport.cpp#L440C69-L440C81

So I might be able to include a header and then set the variable on an object but atm I can’t find this CAMetalDisplayLink class and preferredFrameRateRange anywhere on github repo and in
source code locally.