Homebrew  Updated

FPSLocker - set custom FPS target in retail games

An overlay that with SaltyNX 1.2.0+ allows to set custom refresh rate in both handheld and docked mode + FPS in Nintendo Switch retail games.

Disclaimer: Tool is utilizing detection of graphics API to manipulate FPS. It supports special patches that are helping with going above 30 FPS in games using proprietary FPS locks.

You can see here how it works (I was utilizing Witcher 3 dynamic resolution config mod to make anything above 30 FPS available):


More in README (I recommend to read it + also SaltyNX readme if you don't know how it works)
Repo: https://github.com/masagrator/FPSLocker
Releases: https://github.com/masagrator/FPSLocker/releases
Patches: https://github.com/masagrator/FPSLocker-Warehouse
 
Last edited by masagrator,
Hello. I've just downloaded last version of saltyNX 1.5.4 and I saw this interesting quote regarding the new features:

Add to toolbox.json version of sysmodule so Sysmodules 1.4.0+ overlay can show properly sysmodule's version.

I was wondering where can I find the sysmodules 1.4.0 overlay, since I am unable to locate it here:

https://github.com/zdm65477730/ovl-sysmodules

Maybe this version of sysmodules overlay will be released at a later date?

Thanks a lot for your help.
 
FPSLocker 3.2.0/SaltyNX 1.6.2
FPSLocker 3.2.0 was released.

All changes since 3.0.2:
  • Multiple fixes in FPSLocker config to patch conversion related to assembly instructions (no config was affected by it as of 17.10.2025, but this was hindering slightly process of writing them)
    • LDRB and LDRH now don't return error when instruction has provided fixed offset
    • TBZ and TBNZ now support goto labels
    • All conditonal branches are now supported
  • Fix config to patch conversion in scenario where MASTER_WRITE's asm_a64 type included BL instruction with direct offset (this fixes an issue with config for Kirby's Dream Buffet)
  • Fix Halt unfocused game state not being saved in certain situations.
  • Now if game has no config available on sdcard, in Advanced settings below provided TID and BID you will see also game versions:
    • Developer game version | Internal game version's major value / Raw internal game version
  • When using the Check/Download config file, information will be sent to my own tracker. This will provide a clearer view of what people would like to be available in the Warehouse. No personal data or hardware data is sent.
    • To avoid introducing a visibly worse experience when using the Check/Download config file, I set the connection to terminate if it takes longer than 1 second.
  • Added compatibility for Atmosphere 1.10.0+
  • When using Check/Download config file and when config file was not found, but it was confirmed that game is listed in Warehouse with different version, now newest listed update is printed.
  • Games list titles now load faster by 35% on average on FW 19.0.0+
    • Found a different way to retrieve titles which is faster than original function. Added PR to libnx so other people can use it.
  • If you are using old enough SaltyNX for BID to show only zeroes, Check/Download config file will instantly time out.
  • Updated Chinese Simplified translation. Thanks to @naicfeng
  • Add an alternative source "Gitee" for downloading FPSLocker configs that is not blocked by China and other countries that block Github/are blocked by Github. I used it as first source because it's universally available, though it may be a bit slower to use for people located further from China.
    • Big thanks to sskyNS for hosting automated clone repository on Gitee (because it requires Chinese phone number to create repository).
    • So first is checked Gitee, if config was not found it checks readme on gitee. If game or its version was not found in readme on Gitee, it moves to github to check for config and if not found, it checks readme on Github.
  • Now you can exit Advanced settings even in the middle of Check/Download config file connection, session will be terminated before going back to main menu.
  • When config file is not found in Warehouse, percentage indicator will show up when downloading README.

Also SaltyNX changes since 1.5.3 to 1.6.2:
  • Add support for reading resolutions from nvnCommandBufferSetScissor and nvnCommandBufferSetScissors, resolutions are pushed as Viewport. Any resolution passed to Scissor(s) is ignored that was the same as last resolution pushed via nvnCommandBufferSetViewport and nvnCommandBufferSetViewports. This fixes an issue with reading resolution in games on Pokemon Engine which are using Scissors for dynamic resolution.
  • Core32 now is using hard float ABI, making it faster and smaller.
  • Fixed a bug in 64-bit Core with FPSLocker patches that were using negative offsets in addresses (fixes an issue with WARRIORS OROCHI 4 / 無双OROCHI3 patches).
  • Change method of forcing game into pause (FPSLocker's Halt unfocused game), now Core only manages how game should handle focus state, leaving to kernel maintaining game in pause state which should have better compatibility than previous method
  • Change method for retrieving focus of Application
    • It doesn't change anything in Core so perfect compatibility is maintained
    • Now CPU usage doesn't spike drastically while some games are running, causing sysmodule to be randomly unresponsive - if user decides to enable 60 HZ in HOME Menu in FPSLocker
  • Added compatibility for Atmosphere 1.10.0+
  • Streamlined compiling Core and Bootstrap so 32-bit and 64-bit share now the same source code with few ifdefs
  • Fix an issue with some games not reporting file read speed (f.e. Saints Row The Third)
    • Replaced a function pointer for reading file that is used when GlobalFileDataCache is enabled.
  • Add support for reading resolutions from Vulkan's Scissor functions (Similar to nvn, reported as Viewport)
    • It fixes an issue with some games not reporting resolutions, f.e. Blades of Time
 
3.3.0
Released FPSLocker 3.3.0

Changes since 3.2.1:
  • Fix an issue with game specific "Delete settings" option not deleting settings for different programs than main one (limited to first 16 IDs).
  • Fix 0x207 error showing up for some people
    • It was a combination of using nx-ovlloader in 4MB mode and overlay using too big socket buffers which I increased recently when debugging some other errors, which resulted in socket buffers taking 4x more space.
  • Fixed an issue where running game with different program than main one resulted in no game version showing up in Advanced Settings
  • Add Traditional Chinese language
  • Fixed numerous issues that occured when using sys-dock sysmodule
  • Fixed an issue with emoji indicator next to HBR mode that was not properly aligned in different languages than English
  • Changed emoji behavior next to HBR mode so ❌ occurs only for HBR mode with 2 DP lanes, in case of 4 DP lanes or HBR2 it will show ✅.
  • Updated internal titleid base.
For Switch OLED users that want to play in docked mode at high refresh rates and can't get past 75 Hz: new sysmodule has been released to fix your issues - it's called sys-dock. This can fix your issues. Read README properly!

Also SaltyNX changes since 1.7.0 to 1.7.4:
  • Reduced sysmodule RAM usage from 752 kB to 432 kB without removing any functionality (this is like the hard limit without doing some optimization shenanigans or reducing functionality, ram usage is now completely independent from Core's size)
  • Reduce Cores sizes by 20%
  • Fix elf plugins support broken in 1.7.0 release
    • This also fixed issues with loading elf plugins to all retail games that were added as exceptions, so now those games are fully compatible with SaltyNX instead of partially compatible:
      • Alien: Isolation
      • Company of Heroes Collection
      • EA SPORTS FC 24
      • GRID: Autosport
      • Immortals Fenyx Rising
      • Luigi's Mansion 3
      • Mario Strikers: Battle League
      • Olympic Games Tokyo 2020 – The Official Video Game
      • Plants vs. Zombies: Battle for Neighborville
      • Stubbs the Zombie in Rebel Without a Pulse
      • The Lara Croft Collection
  • Fixed an issue with Unreal Engine games not setting properly on boot Fake Docked mode saved with ReverseNX-RT
    • Issue comes from engine's strict order in processing notifications, OperationMode must be processed before PerformanceMode
  • Properly fix an issue with GetAllModuleInfo function introduced in 20.x SDK instead of using workaround (Thanks to @nvnprogram for solution). This function is mainly used by Unity 6 games.
    • Because of this change if you use any ELF Plugins, you may be forced to recompile it with libnx_min from this repository for it to work with 20.X.X SDKs and newer.
  • Expose dock DP lane count via IPC (necessary to introduce some changes in FPSLocker)
  • Don't block max refresh rate to 75 Hz in case of detecting HBR mode in 3rd party dock with active 4 DP lanes
 
Hello, is it possible to set custom refresh rate for homebrew also, i really like tsvitch and my in region is 25fps channels, so i have to manually set it to 50hz every time.

Also i noticed in my oled with original dock, if i change the refresh rate there is a bag, the switch send full rgb color with signal to tv or monitor to set limited, of course after that there is mismatch. Is that happens only with my oled unit? On 144hz and up it send full rgb with signal full so it is correct. Also if in hos settings i put limited it also correctly send signal to monitor to set limited on all refresh rates.
 
Last edited by AlexArt87,
Hi, does anyone here have experience doing 1080p 120hz with a V2 Switch and a 3rd party Newdery Switch Dock?. I have the newest version of fpslocker and sys-dock but no matter what flags I toggle and patch after a restart I can't get refresh rates over 60 fps to populate or the display overclock wizard. Only the underclock Wizard shows and myDP link rate only shows with HBR and a red X. Also I have a TCL QM7K 144hz tv. Thanks
 

Site & Scene News

Popular threads in this forum