1.63.9
Run-Ahead (latency reduction)
- New
Emulation → Run Aheadsubmenu with five options: 0 (off), 1 frame, 2 frames, 3 frames, 4 frames - Reduces apparent input latency by the selected number of frames using bsnes's approach: commit a hidden frame, save
state, peek N-1 frames into the future, display that preview, then restore to the committed state - Works with audio (preserves hermite filter continuity — no clicks, pops, or distortion from the hidden frames)
- Automatically skipped during rewind, turbo, and pause
- FPS counter reports the logical game frame rate (~60), not the internal emulation throughput, so it stays meaningful
at every run-ahead setting
Color Correction
- New
Video → Color Correction…dialog - Toggle "Enable Color Correction (accurate SNES colors)" applies a 1.8/2.2 gamma curve to the palette, approximating
the SNES DAC output as seen on a CRT — richer, more accurate colors
Gamma / Contrast / Saturation adjustments
- Photoshop-style sliders in the same dialog, each ranging from -100 to +100 (centered at 0 = no change)
- Master "Apply Adjustments" checkbox to enable/disable the three sliders independently of Color Correction
- Gamma: symmetric exponential (2^(-v/100)) — slide left for darker, right for brighter
- Contrast: linear (1 + v/100) — -100 flattens to gray, +100 doubles contrast
- Saturation: linear (1 + v/100) — -100 gives grayscale, +100 doubles saturation
- "Defaults" button resets both toggles and all three sliders
- Applied at the palette level so it catches all rendering paths (standard palette, direct-color mode, and live CGDATA
writes)
Performance
Run-ahead was tuned for minimal overhead on a typical displayed frame:
- State-buffer size cached on first use instead of recomputed every frame
- FastSavestates mode enabled during the run-ahead block (skips the 512 KB screen memset and memory zeroing on load)
- Embedded screenshot dropped from the serialized state (~500 KB saved per freeze)
- S9xSyncSpeed skipped for hidden frames via a new Settings.InRunAhead flag
- Audio sample callback detached during hidden frames so their audio never reaches the OS buffer (otherwise the buffer
fills 2× faster than it drains and throttles the iteration rate) - Resampler state (ring pointers, phase accumulator, hermite history) snapshotted across the hidden block so the
displayed frame's output flows seamlessly from the previous displayed frame's
