Forge and NeoForge at half the FPS on NVIDIA: the one-line fix
On Windows with an NVIDIA card, Forge and NeoForge run at about half of Fabric's
frame rate when many mobs are on screen. The cause is not the loader's code: the NVIDIA driver
has a Minecraft profile that it only applies when it sees net.minecraft.client.main.Main
on the Java command line. Fabric puts it there; Forge and NeoForge don't. Add one JVM argument
and the driver recognises the game again.
Measured October 4, 2026 in the Modkeel lab. Corrections are welcome on GitHub.
The fix
In your launcher, open the settings of the Forge or NeoForge installation and add this at the end of the JVM arguments, after a space. Keep everything that is already there.
--enable-native-access net.minecraft.client.main.Main
- Minecraft Launcher: Installations, the installation's … menu, Edit, More options, JVM arguments.
- Prism Launcher: right-click the instance, Edit, Settings, Java, tick Java arguments.
- Modrinth App: the instance's settings, Java and memory, Custom Java arguments.
- CurseForge app: Settings, Minecraft, Java Settings, Additional Arguments (applies to every profile).
The driver only matches the class name when it stands as a word of its own, with spaces
around it. Shorter forms such as -Dnvidia.app=net.minecraft.client.main.Main gave
no gain in the lab. This form is two ordinary arguments, so every launcher passes it on
unchanged. Java answers with one harmless line in the log:
WARNING: Unknown module: net.minecraft.client.main.Main specified to
--enable-native-access. It needs Java 17 or newer, which Minecraft 1.18 and later
use.
What it changes
What decides the frame rate is whether the driver recognises the game. Each loader is shown as installed and with that one thing flipped: the text added to NeoForge and Forge, removed from Fabric. The "text added" rows use Fabric's own wording of it. The argument above did as well in runs side by side on a quiet machine: Forge 1.20.1 with 300 mobs in view reached 82 and 78 FPS with it, 82 and 79 with Fabric's wording.
| Loader | Driver recognises the game | Terrain | 300 mobs in view | 300 mobs behind a wall |
|---|---|---|---|---|
| Minecraft 1.21.1 | ||||
| Fabric, as installed | yes | 306 | 107 | 90 |
| Fabric, text removed | no | 272 | 51 | 43 |
| NeoForge, as installed | no | 245 | 53 | 45 |
| NeoForge, text added | yes | 309 | 94 | 76 |
| Minecraft 1.20.1 | ||||
| Fabric, as installed | yes | 225 | 87 | 58 |
| Forge, as installed | no | 153 | 47 | 34 |
| Forge, text added | yes | 222 | 83 | 58 |
The test works both ways: taking the text away from Fabric drops it to NeoForge's level, and adding it to NeoForge or Forge brings them up to Fabric's. Nothing else changed between runs: same computer, same NVIDIA driver (591.44), same world, no mods besides the loader.
How it was measured: a real client on a laptop with a GeForce GTX 1650 and a Core i7-10750H (an entry-level gaming laptop from 2020), Windows 11, 1280x720, render distance 24, VSync off. Each number is the median second of 20-second scenes over 2 to 4 runs; runs without mods differ by up to 23%, so read the size of the gap, not the exact figure. On a faster computer the frame rates are higher; the gap is largest where the processor, not the graphics card, is the limit, as it is with many mobs. Desktop NVIDIA cards were not measured yet.
Why it happens
NVIDIA drivers carry settings for each known game and pick them by the program's name. Every
Minecraft runs as javaw.exe, so the driver's Minecraft profile looks at the
command line instead: it lists net.minecraft.client.main.Main, the game's own
entry point, and net.minecraft.launchwrapper.Launch, which old Forge (1.12 and
earlier) used. With the profile, the driver does the OpenGL work on a thread of its own; without
it, the game's render thread waits for every call, and a frame with hundreds of mobs, which
needs hundreds of draw calls, takes about twice as long.
Fabric adds -DFabricMcEmu= net.minecraft.client.main.Main to the command line,
a property no code reads, so the driver matches. Forge since 1.17 and NeoForge start through
their own bootstrap classes, which are not on the driver's list. Users noticed the slowdown when
it appeared in Forge 1.17, but without a cause it was put down to outdated drivers. In our
tests the driver was current and identical in every run; only the text changed.
Don't just turn on Threaded optimization
The usual advice is to set Threaded optimization to On in the NVIDIA Control Panel. For Java without the argument, that made NeoForge 1.21.1 much slower: 10 to 15 FPS with mobs instead of 53. Copying every setting of the Minecraft profile that the driver lets programs read gave 57 to 65. Only the argument, which makes the driver treat the game as Minecraft, reached 94.
Lab data for every version
The Modkeel lab measures frame rates with and without popular mods on each Minecraft version, and records which mod releases crash.
Questions
Why is Forge or NeoForge slower than Fabric with mobs?
On Windows with an NVIDIA graphics card, the driver has a game profile for Minecraft that it applies only when it finds net.minecraft.client.main.Main on the Java command line. Fabric puts that text there; Forge since 1.17 and NeoForge start the game another way, so the driver does not apply its Minecraft profile. In the Modkeel lab that halved the frame rate with 300 mobs in view.
Should I turn on Threaded optimization in the NVIDIA Control Panel instead?
No. In the Modkeel lab, forcing Threaded optimization on for Java without the argument dropped NeoForge 1.21.1 from 53 to 10-15 FPS with mobs. Copying every readable setting of the driver's Minecraft profile only reached 57-65 FPS. Only the argument, which lets the driver recognise the game, gave the full 94.
Is the argument safe?
Yes. It asks Java to allow native access for a module named net.minecraft.client.main.Main, which does not exist, so Java only prints a warning in the log and changes nothing else. Its effect is that the class name appears on the command line as a word of its own, which is what the driver looks for. Java 17, 21 and 25 all accept it.
Does this affect AMD or Intel graphics?
The profile that matches the command line is NVIDIA's. The Modkeel lab measured it on an NVIDIA card only; on AMD and Intel the argument does nothing that we know of.