github shanytc/snes9x 1.63.9

latest releases: 1.63.23, 1.63.22, 1.63.21...
one month ago

1.63.9

Run-Ahead (latency reduction)

  • New Emulation → Run Ahead submenu 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
image image image

Don't miss a new snes9x release

NewReleases is sending notifications on new releases.