FPS Limiter for Vulkan, OpenGL, DirectX 9, DirectX 10, DirectX 11 and DirectX 12 [v1.2.5]

Vulkan is a great API but framerates can be all over the place, resulting in inconsistent gameplay. Since I couldn't find a framerate control tool that suited my needs I decided to create one. It was a good choice since it took less than 30 minutes and worked great, so well in fact that I added support for more APIs and now use it for most games.

Features

  • Supports Vulkan, OpenGL, DirectX 9, DirectX 10, DirectX 11 and DirectX 12.
  • High-precision timing (usually more accurate than the game's built-in limiter).
  • In-game adjustments via keyboard shortcuts.
  • Very lightweight and efficient.
  • No installation / drivers / administrative privileges required. Just extract the files and run.
  • Wide compatibility with overclocking tools and overlays.

Instructions

  • Edit the file fpslimiter.cfg to set the initial limit and other settings. If the limit setting is missing or invalid default is 60.
  • Run fpslimiter64.exe to start the loader for 64-bit games, and/or fpslimiter32.exe to start the loader for 32-bit games. It will enable the limit for any games launched while the respective app is active. If the game is started with administrative privileges the loader(s) should also be launched with the same permissions, but that's a bad security practice.
  • Press Control+Page Up in-game to increase limit.
  • Press Control+Page Down in-game to decrease limit.
  • Press Control+End in-game to set/unset toggle limit (e.g. disable or set upper value of variable refresh range). Alternatively use Control+Numpad 0 to reset initial limit, or Control+Numpad 1 to reset toggle limit (Num Lock should be on).
  • Pass the optional "-minimize" parameter to automatically minimize the app when launching.

Download

Follow this link to download the latest version.

Advantages

For those curious why I recommend using this:
  • Improve gameplay smoothness, by avoiding sudden framerate transitions.
  • Avoid unresponsive controls. If the CPU is under constant heavy load the game may start to ignore inputs (usually first noticeable in mouse movement and perceived as deceleration).
  • Control CPU / GPU thermals to avoid throttling.
  • Save power.

Alternative Activation

If you have problems activating the tool in specific games, or prefer to control the exact process loading follow these instructions:
  • The executable files fpslimiter32.exe and fpslimiter64.exe are not necessary, so it's recommended to close them if they're active.
  • For 32-bit games: Copy the files fpslimiter.cfg, fpslimiter32.dll and xinput1_3.dll to the folder of the game executable.
  • For 64-bit games: Copy the files fpslimiter.cfg, fpslimiter64.dll and xinput1_3.dll to the folder of the game executable.
This will work in games that use XInput (most do), but can still be blocked by some anti-cheat drivers. If this happens notify the anti-cheat developers so they can whitelist the files (once enough people request it).

Changelog

Version 1.2.5
  • Fixed compatibility with some DirectX 9 games (e.g. old Call of Duty: Modern Warfare titles). Reported by Anonymous, Ellis et al.
  • Improved compatibility with outdated VirtualBox graphics drivers.
Version 1.2.4 - 1.2.3
  • Improved support for some DirectX 9 games when running under Steam.
  • Improved support for UWP apps (requires manual loading and additional steps).
  • Added feature to toggle a specific framerate limit (requested by Super Kiwi and emoose).
  • Added alternative hotkeys to reset initial/toggle limit (requested by Anonymous).
  • Added information and files for easy alternative activation.
Version 1.2.2
  • Fixed possibly incorrect rate calculation with some DirectX 10, 11, 12 games.
  • Improved support for recent DirectX 9 games.
  • Added command line option to minimize to tray (e.g. for shortcuts/scripts).
Version 1.2.1 - 1.2.0:
  • Improved game compatibility.
  • Improved compliance with some anti-cheat systems.
  • Minor latency optimizations with V-Sync disabled.
Version 1.1.1 - 1.0.4:
  • Improved game compatibility and DirectX 12 support.
  • Added option to increase compatibility with process monitoring apps.
  • Miscellaneous optimizations.
  • Reduced possibility of games terminating if loader stopped with games still active.
  • Support for multiple rendering windows in same app.
  • Added notification area (system tray) support.
  • Added option to force resource cleanup.
Version 1.0.3 - 1.0.1:
  • Improved game compatibility.
  • Added 32-bit games support.
  • Fixed possible games terminating if loader stopped with games still active.
  • Modified keyboard shortcuts to avoid interfering with some games.
  • Minor optimizations.

Forum threads


Comments

  1. Tried this out and it doesn't work. I have the 64 bit version of this and I tried it on 5 different games to no avail. No OSDs were up too.

    ReplyDelete
    Replies
    1. Hi. In those cases there's something in your system blocking it. Usually it's an incompatible overlay or overclocking tool but it could be something else. Unless that software leaves some information in the logs it may be hard to identify the problem, as the blocking is done by software out of my control and this tool never gets to load for the games.

      As an alternative you can try to use the ReShade version (see thread link at end of this page). Some users with similar problems managed to get that working at least.

      Delete
  2. Hello!
    I just discovered your framerate capping utility.

    Why not announce on the Blur Busters Forums? We all do a lot of bleeding-edge experimentation on various frame rate capping utilities, especially RTSS.

    Cheers,
    Mark Rejhon
    Chief Blur Buster

    ReplyDelete
    Replies
    1. Oh by the way -- I don't know if it's within scope, but.... I made a suggestion to Guru3D about using D3DKMTGetScanline() to create a raster-based framerate capping feature in RTSS that controls the exact location of tearlines. Which led to the development of a tearingless VSYNC OFF mode by putting tearlines in VBI. (In fact, we can even more quickly deliver refresh cycles via the same method HDMI 2.1 Quick Frame Transport does: large blanking intervals, and delaying pageflip to very late in VBI -- now possible with scanline framerate-capping techniques). It does require several tricks that we learned, but it created an ultralow-lag VSYNC ON mode that works wonderfully with many older games that have frametimes that are usually no more than roughly half a refresh cycle.

      But we'd love to collaborate as we're idea machines for frame rate capping utility programmers!

      Delete
    2. Thanks. There is now an official thread for the tool at BlurBusters forums. Obviously it's a trusted and recommended site.

      Delete
  3. error General 0xE0010160 on overwatch

    ReplyDelete
    Replies
    1. It seems the game's anti-cheat system is detecting an unknown modification and doesn't like it. Maybe they'll allow the tool once they have an opportunity to review it.

      Delete
  4. Frame pacing isn't great when it's on

    ReplyDelete
    Replies
    1. The vast majority of feedback is actually the opposite. Consistency is the main advantage of this type of tool and most people state this one provides smoother gameplay compared with others. Your issue could be related with the way the tool you're using measures frame pacing or likely a side-effect of other settings, but I would need more information to try and give any helpful suggestions.

      Delete
  5. I like this tool, it works for me using Fallout 4

    Is it possible, though to change from 60 to for example 120/144 fps with a single button?

    Holding the shortcut keys works but is less accurate to get it right on the mark.

    If it's not a thing I would love to see that as a feature, to me that would add more value to it than in it's current state :)

    ReplyDelete
  6. Hi! Tried it with Forza Horizon 4(borderless windowed game) and nothing. The process is running but no capping going on. And there is no way to troubleshoot..

    ReplyDelete
    Replies
    1. Thanks for the information. Someone already reported that game as not working. I have an idea of the problem but I'll have to test to confirm (hopefully before next week). You may want to try GameForce which was just updated and should work better now with recent games. The GUI is not available for DirectX 12/Vulkan yet but the FPS limit will still work for those games.

      Delete
    2. Thank you for answering! Yes, I tried both of your apps. Game mode off, no overclocking tools running, just bare windows setup. Yeah, the problem most definitively in the game itself, it doesn't like RTSS at all also - just crashing when it runs.

      Delete
    3. I read somewhere that game appears to have very aggressive anti-tampering/DRM. If that's the case it's unlikely these tools will work, which is why I didn't consider it a priority, but I'm still going to test it and see what can be done.

      Delete
  7. Super good tool!
    The ONLY thing that doesn't seem to work is , in League of Legends the Hotkey doesn't react at all. So I have to manually edit cfg before launching League if I played another game before.
    The FPS is being correctly limited in League but no matter if I ALT-Tab out and back in again, or if I switch between windowed and fullscreen in-game. The FPS is not adjustable... :(

    ReplyDelete
    Replies
    1. Thanks for the report. It helps create a better tool. That seems like a side-effect of the game's anti-cheat system. You can try the ReShade version (thread link is at end of page) or alternatively GameForce (those features work with AMD cards too), since they have differences that could affect that. I'm also reaching out to companies like Valve to increase compatibility with online games.

      Delete
    2. Yes thank you for the advice with your "GameForce" tool.

      This works perfectly!

      It is interesting to me what difference there is.
      Is one method of limiting more accurate (or less impacting) than the other?
      Cheers

      Delete
    3. The differences in input processing are related with the fact GameForce is a full overlay and performs more extensive modifications. In contrast FPS Limiter is more passive and therefore may be more compatible with specific online games, so they have different (dis)advantages.

      Regarding the framerate limiting features, they're almost identical in both tools, but currently FPS Limiter has an experimental latency optimization in DirectX games meant for professional players. It may be disabled anyway due to lack of feedback.

      Delete
  8. hey wat about input lag bro ?
    does this frame limiter has less input lag then in game framelimiter for dota2 ?
    and one more thing this is not working on dx9 api when i launch the game in dx9 on dota2

    ReplyDelete
    Replies
    1. Hi. The tool has a latency optimization in DirectX games which could be an advantage, but keep in mind it may not make much difference even between professional players. In general results will be similar with all tools, but in some cases the game engine limiter could have slightly lower lag if the engine applies smoothing internally.

      The lowest lag configuration isn't always better. Different settings invariably imply a trade-off between latency and smoothness, which is why developers enable those features. Significant lag is the result of smoothing features applied at the game engine or as result of DirectX / sync settings. This tool doesn't introduce any extra lag apart from the synchronization delay itself, or otherwise modify any lag-inducing settings. You can find more information about it in the GeForce thread.

      I'll test the dota2 DX9 renderer when I have a chance, thanks.

      Delete
  9. I really prefer using this on games over rtss and any other framelimiter as it seems to eliminate the microstutter I get at regular intervals with other fps limiters. Only thing is I can't get it to work with Skyrim SE at all! Has this been reported before? Anyway, thanks for the hard work :)

    ReplyDelete
    Replies
    1. Thanks. I don't have that game for testing at the moment and nobody reported issues with that game. It's possible you could fix it by forcing earlier loading of the dll, for example by modifying the files, or with another tool. Test the old ReShade version to confirm (file links are in the ReShade thread). Regards.

      Delete
  10. Great tool! Works fine with RDR2, though it seems having the limiter on during loading screens makes it take far longer to load for some reason (well for me at least, when limiting to 30FPS)
    I can solve that by using the Control+PgDown/PgUp shortcuts to put the max back at 60 during load, but it's not really the best method IMO since it has to go through each FPS number gradually etc. (and the same for setting max back to 30...)
    If a key shortcut could be added to toggle the whole limiter instead that'd be a lot more ideal, or maybe allowing shortcuts that can set the FPS to a specified number directly, but if not I guess I can make do with the way it works now, thanks a lot!

    ReplyDelete
    Replies
    1. To follow up on this, I noticed after posting that someone else requested the same feature before, so I added it to the Game Dashboard tool and will also be added to FPS Limiter (once I combine other updates), though it's not something I needed so far and may modify it again later.

      Delete
  11. seems to have no effect in street fighter v

    ReplyDelete
    Replies
    1. It's possible the dll gets loaded too late in the game process, which could be fixed by forcing earlier loading (if you have the knowledge/tools) or using the ReShade version (instructions are in the ReShade thread link).

      If that's not clear enough I can add a section about alternative activation that should fix that for most games.

      Delete
  12. Hi, I've recently discovered this tool and I'm interested to know its inner workings. How does it differ from the RTSS framerate limiter?

    ReplyDelete
    Replies
    1. Hi. There isn't much in common since this tool was created from scratch. It's lightweight and was designed to optimize smoothness (and to a lesser degree power consumption), though since I made it public other limiter tools are now appearing/being modified to work similarly (quite a coincidence...). Feel free to test with a few different games. Some people notice improvements more than others.

      Delete
    2. Thank you for answering. I'm not a developer myself, just an enthusiast, so I don't have deep technical knowledge but I like to know how the tools I use work.

      I asked the RTSS developer how does its framerate limiter work and how does it decide when to present new frames and he told me this:
      "It is hooking 3D API frame presentation call, present the frame then stall 3D application's rendering thread by waiting for target frame time. After that control is returned to 3D application. For the application is looks like "long" frame presentation call. It doesn't decide anything. Presentation is initiated by 3D application."

      When asked about how does RTSS calculate frame times he said this:
      "It is delta between succeeded 3D API present calls."

      If I'm understanding this correctly, RTSS is preventing the CPU from submitting a new frame to the GPU until a specified time interval is reached, but it's blocking after the frame has been rendered by the CPU. Also, it calculates frame times by measuring the delta time between two consecutive frames being submitted to the GPU.

      Is that right? I would like to know how does your tool differ from that implementation.

      Delete
    3. That's correct, though those explanations are generic and basically essential logic for any framerate limiting tool. The differences are mostly in how the waiting is done (and secondary things like hooking). There is a lot of misinformation in those forums related to topics like frame timing and people obsessing over the wrong things... If you're interested in learning in more detail what happens when frames go through the graphics pipeline I recommend checking out tools like GPUView from Microsoft (and respective documentation).

      Delete
  13. Thanks for this awesome tool, but i do have one question.

    Is there anyway to get a costum button to toggle between the specific limits? As exampe: control+f1 = InitialFps and control + f2 = ToggleFps, since there is no way to see besides checking the current fps what limit is enabled and which isnt?

    ReplyDelete
    Replies
    1. I agree it isn't completely intuitive, which is why it took some time to add and I'll probably modify that. Mostly I implemented it that way for now because it was requested by several people and is the quickest/less intrusive. A more flexible approach would be to have different slots and hotkeys for each, like what you suggested, but this requires more hotkeys. When several people suggest a feature I usually support it soon.

      Delete
    2. I'll make that change in the next update. Note that you can reset the non-toggle rate meanwhile by using the increase/decrease hotkeys. Thanks for your feedback.

      Delete
    3. Perfect! Any idea when you will release that update? I would love to integrated this in a script im using but currently im unable to check if the limit is toggeled or not, which makes it quiet hard to use :/

      Delete
    4. I usually prefer to accumulate updates, since it also avoid issues if the current files are already whitelisted in anti-cheats, but I'll try to merge other changes and finish it in the next 1-2 weeks. It would also be pretty easy to add an API for integration with other tools/scripts but I have no idea what specific features people are interested in for this.

      Delete
    5. Things that would be awesome:
      - Check if FPS limit toggle is enabled/disabled
      - Hotkey or API to enable/disable the fps limit
      - Change the value of the toggle on the fly

      Delete
    6. Sure, I could enable that via exported functions in the dll, but if you're using AutoHotKey that would have issues since it runs in a separate process and this tool has a decentralized design (each game/process has its own limit settings and additional data), so the functions would have to be called in the right process.

      Delete
  14. What are the instructions for UWP apps?

    ReplyDelete
    Replies
    1. Basically you have to inject the dll manually in the process, and for UWP this means modifying the dll permissions as explained here: https://github.com/Wunkolo/UWPDumper/issues/11

      To make things worse Forza Horizon 4 (one of the few high-profile exclusives) has strong anti-tampering and you have to use thread hijacking.

      I didn't include UWP details because all this is unrelated to the tool and only seems practical for those with technical experience and debug tools.

      Delete
  15. Thank you for this, i have trouble with stutter in The Sims 3, strange thing but AMD CC sometimes work, sometimes dont in limiting fps to 60, this program limited it as soon as game has been started. That is the only game where stutter is so bad it makes game unplayable in larger areas outside of the house.

    ReplyDelete
    Replies
    1. You're welcome. I remember similar problems with some games using other tools, which is one of the reasons I created this.

      Delete
  16. tried it with fallout 4 since its own vsync causes stutters, it worked my fps was always 60 but there was lots and lots of tearing on screen and it was horrible enough for me to uninstall this tool which is a shame really. could you tell me what could have gone wrong there?

    ReplyDelete
    Replies
    1. Hi. When you enable any limiter without vsync it can submit frames anytime, resulting in potential tearing. This means that unless you have variable refresh you need to enable vsync to eliminate tearing, and the limit will only have effect if it's set at or below the refresh frequency. Players use this tool with Fallout 4 and it's fine, so your problem is not related with the tool. Check out the mod that renders Fallout using Vulkan (based on dxvk) to see if it helps you though.

      Delete
  17. Would be awesome to get a blacklist for process names since the Alternative Activation isnt working for me. Hopefully you could add something like that

    ReplyDelete
    Replies
    1. Hi. A blacklist wouldn't help much since the tool has no effect on processes that don't use 3D APIs. You can find a more detailed explanation in the GeForce thread. As for the alternative activation, that is just one way to do it; search for dll injector and you can do it yourself for any process, but I can't vouch for the safety or stability of unknown tools (those on GitHub should be safe).

      Delete
  18. Is there any way to change the hotkeys?

    ReplyDelete
    Replies
    1. Currently they're fixed but there are many free 3rd party tools to achieve that, like AutoHotKey or Corsair iCue.

      Delete
  19. Very good tool, can you add mantle to your fps limiter ?

    ReplyDelete
    Replies
    1. Thanks. I could but there are only a couple of Mantle games and even in those the API doesn't work well. You would probably get better results with DirectX and dxvk (Vulkan rendering).

      Delete
    2. absolutely right, i use the mantle with the old driver (catalyst omega 14.12) if you can please support for mante api

      Delete
  20. Great application!!!! Although I am not a gamer, it helped me a lot with some plugins that are using openGL and they were crashing each time i opened them on second screen (the GUI was black and you could not see anything) and for some reason this FPS limiter fixed it all! Is there a way for this app to run on a windows startup?

    ReplyDelete
    Replies
    1. Hi Aleksandar. By design the tool is portable and doesn't modify the system, but you can easily run it at startup by adding a Windows task or adding/modifying a startup script: set the command to the exe file name(s) and pass the "-minimize" parameter to hide automatically (e.g. "c:\fpslimiter\fpslimiter64.exe -minimize"). I prefer this approach since it allows more options and full control.

      Delete
    2. Thank you so much!

      Delete
  21. Im trying to run your fpslimiter in a virtual machine, however the application crashes with the fpslimiter active. Other fpslimiter software like rtss or dxtory wont cause that. Do you have any idea why that is happening?

    ReplyDelete
    Replies
    1. edit: The issue only occurs with a specific VirtualBox driver that was already discontinued in recent versions, but if someone else is interested in this send a message and I can provide an early update that works with that driver.

      Delete
  22. Is there another way to load the dll other than through xinput1_3?

    ReplyDelete
    Replies
    1. Of course. Newer games use xinput1_4 and older ones XInput9_1_0. I could include those too but xinput1_3 covers the majority. You can load the dll yourself with a tool like Extreme Injector, but note that the normal way of injecting won't work when running inside platforms like Steam/Origin because they relaunch the executable.

      Delete
    2. I tried the injection method, it didn't work, apparently it only works when I use the loader, any suggestions?

      I am doing some experiments in my game (Lithtech engine / D3D9), as it uses an old engine it is impossible to support a higher FPS, so I am looking for an effective and light way to cap / limit, I found this project amazing for accurately setting the FPS without causing problems.

      Delete
    3. I got it working now, is there any way to disable the hotkeys? I wanted to implement the use of the dll but without the hotkeys so no one would find out and go over the limit

      In this case I would implement a mandatory checksum in the configuration file, so they wouldn't edit the value in the file, but since they still have access via the keys (ctrl+pgup)

      Delete
    4. A simple LoadLibrary() will activate the features, but you have to do it before creating the rendering device(s), which is basically what the loader does. There are no checks and it works even if you rename the dll. I also allow integration into open-source projects. For simple changes like the keyboard shortcuts I can make an update or provide a custom version; better send a message for things like that.

      Delete
  23. Hi, I've just found this program and have it working in COD BO2 or some d3d11 titles. However i can not get it work on older game like COD4 or Original COD MW2.
    It seems to work fine on d3d11 titles but not d3d9 games on my computer.
    I have also tried the Reshade method and Reshade does load but the limiter does not apply in those games i mentioned above.
    Hope you can help or suggest something to try to work around. Thanks!

    ReplyDelete
    Replies
    1. The tool supports DirectX 9 to 12, but Microsoft keeps modifying the rendering components, so it's possible the tool needs updates periodically. I'll perform some tests with the latest Windows versions when I have a chance, but it's better to include information about the game/platform/OS when reporting issues. Thanks.

      Delete
  24. Is there any difference between this and Game Dashboard, like in accuracy and precision ?

    ReplyDelete
    Replies
    1. Sorry about the delay but I've been busy and somewhat sick. At the moment they're almost identical in those aspects so you'd probably not notice any difference, but there are some pending updates with new features, for example making the keyboard shortcuts largely obsolete. If people show interest I will usually make the features available in this tool as well eventually, so it's a matter of leaving feedback and waiting.

      Delete
  25. NiftuCal your FpsLimiter is amazing! Can you add Directx8 support please. Other tools that I've tried heavily load 1 CPU core, which leads to crashes and input lag. I would like to see your implementation of the solution for DirectX8.

    ReplyDelete
    Replies
    1. edit: DirectX 8 support was added to Game Dashboard and should make it to FpsLimiter once I merge other updates, though I have no idea about the timing currently. Interestingly when I tested those games the "Override Buffers" feature made a big difference in responsiveness, so you could check that too. If anyone wants to try it but they're strapped for cash send a message and I can send some free keys meant for beta-testers...

      Delete
  26. Is there any chance you could add a blacklist? The game I'm using won't work over the x input method, but if I use the fpslimiter64.exe it also injects into stuff that I don't want it to. Would really appreciate it - using your program for a long time now, and I would donate you something for that change

    ReplyDelete
    Replies
    1. I'm assuming you're requesting that because you've seen it in other tools, but in this case it's pretty much useless because of a few technical reasons:
      - DLL resources are shared between processes, so just because it appears in several processes that doesn't mean it consumes additional resources. This tool has no effect unless the process is an actual 3D app.
      - The way Windows hooks work means that even if a process was in the blacklist and dll injection stopped Windows would just keep trying to inject the dll again and end up in a cycle as long as monitoring is enabled. This results in unnecessary CPU load.
      - You can use the alternative activation method. If xinput doesn't work for you I can add other dlls for the remaining cases, but you can also do it yourself with any dll injection tool.

      Regards

      Delete

Post a Comment