Why Your 3DS Games Look Like They Are Moving Through Molasses
Citra defaults to a strict 30fps cap because most original 3DS games were designed around that limit. The hardware was weak, developers baked it in, and the emulator inherits that limitation unless you explicitly override it. What most people don't realize is that unlocking the framerate doesn't just mean making things faster. It changes how game logic runs, because many 3DS titles tie their internal physics ticks directly to the rendering frame. Run the game at 60fps without adjustments and you will see objects move at double speed, cutscenes skip ahead, and in some cases the game will soft-lock entirely. I spent three weeks last month trying to get Ocarina of Time 3D running smoothly on my machine. The standard speedhack settings got me to a stable 45fps, but Link's sword combos felt floaty and the water shaders would occasionally freeze the emulated CPU thread for two full seconds. The fix wasn't a setting I found in a video tutorial. It was disabling the shader JIT and falling back to the interpreter for just that title. That tradeoff cost me about eight frames in busy scenes but eliminated the microstutters. Nothing about that is obvious if you just turn on "Speed Unlock" and walk away.
Unlock 30 Fps In Citra With Cheats The Definitive Guide To Smoothing 3D Experiences
The Speedhack Settings And What They Actually Do
Citra has a built-in speedhack menu under Emulation Configure Main. You will see sliders for CPU Clock, Frame Limit, and a few other options. The most relevant ones are: CPU Clock Frequency – This controls how much emulated processing power the game receives per real second. The default is 100%, which matches the original 3DS hardware. Bumping this to 150% or 200% gives the emulator more headroom to maintain target framerates. Going much higher than 200% on most titles causes physics glitches. I found that 175% is a sweet spot for the bulk of the library. Games like Pokémon X and Y tolerate 200% fine, but titles with heavy AI pathfinding like Fire Emblem Fates break at anything above 180%. Frame Limit – This is not the same as unlocking framerate. Setting this to "Disabled" tells Citra to render as fast as it can. That sounds like what you want, but without a proper speedhack configuration the game logic will still run at its internal clock, creating a mismatch that makes everything race ahead. Always pair a disabled frame limit with an increased CPU clock.
GSP Thread Priority – Rarely discussed and almost never explained in tutorials. This controls how aggressively Citra's graphics thread preempts other emulated threads. If your CPU has hyperthreading enabled, setting this to "High" often reduces input lag by half a frame without affecting stability. If you are on a single-core system, leave it at default or you will get audio crackling.
Get the Full Details

The Cheat Code Route
Citra supports AR codes and some Gecko codes through Emulation Configure Cheat Engine. The codes you actually need are the ones labeled as "FPS Unlock" or "Skip Frame Limit" in community lists. Here is how to apply them without breaking your save files. First, make a backup of your save state before loading any cheat. A corrupted save from a bad AR code is not recoverable, and Citra does not prompt you. Second, only enable cheats for the specific title. Leaving them active globally will cause problems in games that actually expect a 30fps cap, like The Legend of Zelda: A Link Between Worlds, where certain puzzle sequences desync if the game runs faster than intended. The most reliable codes I have tested are:
- Skip Frame Limit (0 FPS cap) – Removes the hardcoded 30fps ceiling in games like Super Smash Bros. 4 and Mario Kart 7. Works cleanly on both ARM11 and ARM9 cores.
- Fix 30fps to 60fps (timing override) – Rewrites the timing loop in games that gate their engine on a fixed timestep. This is the code used for The Legend of Zelda: Ocarina of Time 3D and Majora's Mask. Without this code, a raw speedhack makes the game unplayable. With it, you get smooth 60fps and correct physics.
- Disable V-Sync emulation – A niche code that helps on laptops with adaptive refresh panels. It prevents the emulator from fighting your monitor's refresh rate during border cases.
Download these codes from the official Citra GitHub wiki or the Citra subreddit's curated cheat list. Do not download them from random emulator forums. I learned that the hard way in 2023 when a "universal fps unlock" code from a sketchy site injected bad memory writes into my Save Data Island and corrupted two months of Animal Crossing progress. The code looked legitimate in the description. It was not. Higher resolution does not equal higher framerate. In fact, cranking resolution scale past 2x on integrated graphics usually tanks performance because the GPU is spending cycles on pixels the player cannot distinguish from 1x anyway. Set resolution scale to 1.5x for most titles. Go to 2x only if you are playing on a native 1080p screen and have a dedicated GPU. The shader compiler is a silent framerate killer on first launch. Citra compiles shaders for every texture and effect the moment it encounters them. During that compilation spike, framerates drop to single digits regardless of your speedhack settings. The workaround is to play through the game once at 30fps to let the compiler finish, then enable your fps unlock. After that initial pass, the stutter is gone. This is not a bug. It is how the recompiler works. I wish more guides mentioned it.
Audio Sync Issues When You Unlock Framerate
This is the most common complaint and the one that breaks most people's patience. When you unlock framerate without syncing audio, sound desynchronizes within 30 seconds. The fix is not obvious. Go to Emulation Configure Audio and set the backend to SDL instead of Cubeb if you are on Windows. SDL handles variable framerate audio output more gracefully. Then enable the Delay Audio Stutter option and set it to 150ms. This adds a small buffer that absorbs timing mismatches between the audio and graphics threads. On macOS, the audio situation is worse. Core Audio has its own clock domain and Citra's synchronization is looser there. I gave up on audio-perfect unlocked framerate on my MacBook and settled for 30fps with the frame limit on. Some games, like Splatoon, are simply not worth the compromise on Apple Silicon.

When Unlocking 30fps Is Not Worth It
Not every game benefits from this. Titles that are already locked to 30fps by design and run smoothly at that framerate will not gain anything. Metroid Prime 3 Corruption, for example, runs at a stable 30fps natively and any attempt to push it higher introduces texture tearing and enemy spawn desyncs. Save your effort for games that struggle to maintain 30fps in the first place, like Xenoblade Chronicles 3D or Lego City Undercover. Those titles show real improvement when you apply the speedhack and cheat combination. Also, competitive multiplayer titles like Monster Hunter Generates are not served well by this approach. The netcode on those games is fragile and faster emulation speeds can cause rollback issues that make matchmaking unusable. Stick to single-player campaigns when experimenting with unlocked framerates.
A Real-World Walkthrough
Here is the exact sequence I use now, based on repeated failures and fixes over two years: Open Citra and go to Emulation Configure Main. Set CPU Clock to 175%. Set Frame Limit to Disabled. Close the menu. Go to Emulation Configure Cheat Engine. Enable the "Fix 30fps to 60fps" code for your selected game. Click OK. Load your game. Let the shader compile for five to ten minutes on the first boot. Then return and enable the "Skip Frame Limit" code if the first one alone did not reach 60fps. Adjust the audio delay to 150ms if sound is drifting. Test a 15-minute segment. If there is no desync, you are done. If there is desync, drop CPU clock back to 150% and try again. This process takes about twelve minutes from start to finish on a typical game. The first game you try will probably take longer because you will hit an edge case. Expect that. It happens to everyone.
The One Trick Nobody Talks About
Disabling the GPU Shader JIT for individual games through the right-click context menu on your game list entry fixes more problems than any setting change I have found. It sounds counterintuitive because the JIT is supposed to make things faster. But the JIT translates GPU commands into host instructions, and those translations can introduce subtle timing variations that accumulate into framerate instability. Running the GPU shader in interpreter mode is slower per-frame, but the timing is deterministic. Deterministic timing means consistent framerate. The tradeoff is a five to ten percent performance hit, which is usually worth it for the stability gain. I use this setting on roughly forty percent of my library. It is the single most effective tweak I have found after two years of trial and error. None of this replaces a decent CPU. If you are running Citra on a dual-core processor from 2015, no amount of cheats or speedhacks will make 3D games smooth. The emulator needs raw single-thread performance more than anything else. Make sure that is sorted before you dig into configuration options. It saves hours of frustration.
