Documentation
Known Bugs/Issues:
All version 1.5.80 apps can crash after suspend/resume when audio plackback starts, version 1.5.81 is releasing soon with a fix
Saturn.emu version 1.5.80 has various VDP glitches due to a multithreading bug, version 1.5.81 is releasing soon with a fix
All apps incorrectly show the "Scan for Wiimotes/iCP/JS1" even on OS versions that don't support this function leading to a crash when selecting this option, as a workaround set Options -> GUI -> Show Bluetooth Menu Items -> Off
About Save States & Backup Memory:
The app stores the main autosave state with backup memory and manual save states in the root save folder (Options -> File Paths -> Saves). When additional autosave slots are created, they're stored in a sub-folder with the content's name. For example, given some content named Game.zip, a possible save layout is as follows (file extensions will vary based on emulator):
Game.sta <- state for main autosave slot
Game.sav <- backup memory for main autosave slot
Game.*.sta <- manual save states
Game/saves/My save slot/auto-00.sta <- state for user created autosave slot
Game/saves/My save slot/auto.sav <- backup memory for user created autosave slot
About Common Options (Last updated for version 1.5.80).:
Frame Timing
Frame Rate Target: The ratio of emulated frames to output. Select a smaller ratio to save power or reduce processing load if you device can't handle the full rate (ex. select 1/2 for original 60fps content to display as 30fps). The Full (No Skip) option additionally causes emulation to slow down instead of skip frames when the frames are rendered late.
Frame Rate: The output frame rate during emulation, audio will be re-clocked to this rate
Auto: Use the refresh rate of the display supplied by the OS to avoid judder, if the difference between the screen and emulated system's rate is too great then the system's original rate is selected instead (see below)
Original: Use the original frame rate of the system, ideal for emulating at the exact speed of original hardware but will cause judder if it doesn't match the display's refresh rate, also useful when using VRR or no vsync
Detect Custom Rate: Run a frame rate test and use the result as the frame rate, useful if your device reports the wrong refresh rate
Frame Clock: Sets the method used to throttle the emulation frame rate
Screen: Throttles based on events triggered by the display's refresh rate. On Android this uses the Choreographer API, on Linux it uses the DRM vblank API if available or falls back to a timer
Timer: Throttles based on the system clock not connected to the refresh rate, recommended for VRR displays
Renderer: Throttles based on OpenGL buffer swapping, not recommended unless the device has an issue with the Screen method
Present Mode: Controls the OpenGL swap interval, "Queued" is the default while "Immediate" uses a setting of 0 which prevents the OS compositor from holding multiple frames if it falls behind and may offer less input lag but can also cause frame drops depending on the device.
Precise Frame Pacing: (Android-only) Use presentation time to improve frame pacing at fractional frame targets when set to Basic. Setting to Full also applies this when running at the full frame target and will prevent the compositor from buffering multiple frames in advance if misses an update due to high system load. The default is Basic due to some devices dropping frames in Full mode.
Allow Blank Frame Insertion: When the device supports an exact higher multiple of the system frame rate, black frames are drawn in between actual frames to help reduce motion blur. Note if the device cannot maintain a stable frame rate this won't work properly and only creating flickering.
Override Screen Frame Rate: (Android-only) Switch to the specified refresh rate instead of letting the OS decide, useful if the system runs at a frame rate in between the rates supported by the device (ex. running WonderSwan @ 75Hz on a device that supports 60Hz and 90Hz). Additionally, on fast devices with 120Hz screens, the scan out latency of 60Hz content is reduced from 16ms to 8ms when set to 120Hz.
Video
GPU Copy Mode: Affects how the emulated video is copied to the GPU, leave on auto unless you're trying to diagnose video issues, not all devices support all modes
System Memory: Copy from system memory using glTexSubImage2D
OpenGL PBO: Similar to above but use a pixel buffer object instead to avoid extra copying in the OpenGL driver
Hardware Buffer: (Android-only) Use shared CPU/GPU memory to avoid OpenGL driver overhead
Display Color Format: Color depth of the app's final output framebuffer, if using an sRGB format then filtering is performed with gamma correction
Render Color Format: Color depth of the emulated system's framebuffer
Effect Color Format: Color depth of any intermediate shader effects
External Screen: (Android-only) The behavior when a physical or virtual screen is connected (USB to HDMI cable, screen capture software, etc.), OS Managed usually mirrors the screen exactly while Emu Content will use it as an independent screen and show only the emulated video.
Sound
Buffer Size In Frames: Set the approximate amount of video frames worth of audio to buffer. Lower values reduce audio latency but increase the chance of audio skipping when frames drop. Not all devices can reliably handle low buffer sizes so you may need to experiment with different values.
System
Autosave Launch Mode: How to handle autosave when opening content
Main Slot: Use the state & backup memory from the main slot
Main Slot (No State): Same as above but skip loading the state and only load backup memory, the state is still accessible via Load Autosave State
No Save Slot: When this slot is active, no autosave states or backup memory are saved
Select Slot: Start on the No Save slot and show the autosave slot menu
Autosave Timer: How many minutes of emulation before the autosave state and backup memory are written to disk
Autosave Content: What to save in each autosave slot
State & Backup RAM: The default behavior
Backup RAM: Only save the backup memory, any states must be saved manually
Performance Mode: (Android-only) When on Sustained mode, ask the OS to limit the max CPU clock rate for possibly reduced heat and battery usage at the cost of performance
Configure CPU Affinity: Sets the emulation thread to only run on specific CPU cores
Auto: Use only performance cores for more consistent frame times. If running on Android 13+, use PerformanceHintManager to manage CPU affinity and speed.
Any: Use any core, on systems with different CPU types like ARM big.little, this may cause the emulation to jump between cores and cause unstable frame times so this option isn't recommended.
Manual: Use cores set from the menu, for convenience all cores set to off is equivalent to all on.
GUI
Title Back Navigation: Places a back shortcut icon in the top left of the title bar
Default Menu: Which menu to open when pausing emulation
Dim OS Navigation: (Android-only) Dims the navigation bar (aka "Lights Out Mode")
Hide OS Navigation: (Android-only) Hides the navigation bar on devices that allow it
On-screen Input Setup: Fine-tune virtual controls, a preview image is shown in the background
Button Size: Physical size of a single face button (A, B, etc.) which is also used to calculate the size of other elements via a multiplier
Spacing: Physical size of the gap between the face buttons. Increasing spacing makes it easier to push 2 buttons at once with your thumb since the gap area contains a bounding box that triggers both buttons.
Stagger: Horizontal/vertical multipliers used when arranging face buttons. A value of 0 arranges buttons in an even grid while 1 gives a diamond shape similar to a SNES controller.
Extended H & V Bounds: Extends the horizontal/vertical bounding box for face buttons by (Button Spacing + Button Size * Overlap), "Gap-only" adds just Button Spacing.
Show Bounding Area: Shows exact screen areas used for detecting input, the d-pad is color coded: white = single direction, green = diagonal, red = deadzone
Blend Amount: Control translucency, a higher percentage makes the controls more solid (not shown in the preview)
Key/Gamepad Input Setup: Includes configuration settings for key-based input devices supported by the app & OS
Auto-detect Device To Setup: Lets you quickly jump to an input device's sub-menu by pushing any key on it
Delete Saved Device Settings: Deletes any per-device data stored in the config file. This includes anything you've changed in the device's sub-menu except for the custom key profiles
[Device Names]: This is a list at the bottom of the menu showing all input devices available, selecting a device goes to its specific sub-menu with the following options
Player: The player the device represents. To use one device with multiple players, such as two people playing on a single keyboard, select "Multiple" to reveal additional key categories.
Profile: Select from one of the built-in or custom key profiles
Set [name of key category]: Assign keys to various in-game actions and emulated inputs for the current profile. Profiles are shared between devices so if you have 2 of the same controller, you only need to assign the keys once and switch the player/profile option in the 2nd controller's menu. If you have a controller that's split into multiple devices by the OS (ex. some Android gaming handhelds where the d-pad & buttons are 2 separate devices), use a single custom profile for both devices to keep their keys linked together.
iCade Mode: If the device uses the iCade protocol as listed on the device documentation, enable this to recognize input from it
Handle Unbound Keys: If on, don't pass any unassigned key presses to the OS in case they trigger unwanted functions