必须自备 PS1/PS2 BIOS ROM 镜像,模拟器不附带,需从自己的主机 dump。自行编译前要先下载 dependencies 包并解压到 dep/prebuilt。Windows 7/8/8.1 无法运行,最后可用版本为 v0.1-5624。
duckstation
stenzek活跃维护用 C++ 写的高性能 PlayStation 1 模拟器,支持 x86-64、AArch32/AArch64 和 RV64,靠 JIT 编译与 Vulkan/OpenGL 硬件渲染流畅跑 PS1 游戏。
Fast PlayStation 1 emulator for x86-64/AArch32/AArch64/RV64
下载 GitHub Releases 的预编译包直接运行;自行编译 Linux 版:cmake -B build-release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -G Ninja && ninja -C build-releaseCPU 需为 x86_64、AArch32/armv7、AArch64/ARMv8 或 RISC-V/RV64;x86 普通版需支持 SSE4.1,较老 CPU 可用 SSE2 版。GPU 需支持 OpenGL 3.1/GLES 3.1/D3D11 FL10.0/Vulkan 1.0,近十年设备基本满足。Windows 需 10/11 1809 以上,macOS 需 13.3+。
快速且兼顾精度的 PlayStation 1 模拟器,面向低端设备也能流畅运行
用 C++ 写的高性能 PlayStation 1 模拟器,支持 x86-64、AArch32/AArch64 和 RV64,靠 JIT 编译与 Vulkan/OpenGL 硬件渲染流畅跑 PS1 游戏。
核心能力
- CPU 重编译器 JIT 覆盖 x86-64、ARMv7、AArch64、RV64
- 硬件渲染支持 D3D11、D3D12、OpenGL、Vulkan、Metal
- PGXP 提供几何精度、纹理校正与深度缓冲模拟
- 支持存档状态、runahead 与倒带
- Qt 前端加 Dear ImGui 全屏电视 UI
容易踩的坑
- previewLatest Preview Buildpre-release2026-11-08 · 2026-11-08 04:25 UTC
查看更新说明
Commits
- Add physical disc read speed override (Stenzek)
- latestLatest Rolling Release最新正式版2026-11-07 · 2026-11-07 03:09 UTC
Commits
- 8962d8436 GPU/HW: Add missing logging of depth clears
- 20916bd89 FullscreenUI: Activate toggle buttons on release instead of press
- c3b58f256 FullscreenUI: Support drag/swipe scrolling with inertia
- 968d20a41 dep/imgui: Don't smooth scroll requests made while window is appearing
- fd8bcdcf1 FullscreenUI: Fix ForceKeyNavEnabled() clobbering gamepad nav source
- 7d64f8223 FullscreenUI: Include directory selector in open dialog checks
- 414d8f204 FullscreenUI: Clear all dialogs on shutdown
- 49a2ff938 FullscreenUI: Fix indeterminate progress bar sweep range
- aa9916b88 FullscreenUI: Avoid inverted std::clamp() bounds in dropdown width
- f4fe9de23 FullscreenUI: Pass button flags through in MenuButtonFrame() overload
- ae4658a7b FullscreenUI: Pass p_open through in BeginBlurWindow()
- b73f8b273 FullscreenUI: Keep horizontal menu/sidebar state balanced when hidden
- 9bbf341be FullscreenUI: Copy/move checkable choice dialog callback before invoking
- 92a7758b5 CDImageCHD: Use generated subchannel Q for virtual pregaps
- b2b68c3ce CDImageCCD: Fix LBA count including pregaps twice
- cde17ace5 CDImageCueSheet: Fix single-file pregap and LBA count
- 0b5b8774c Common: Add PackedOptionalArray
- 296d48a67 ImGuiManager: Ensure DeltaTime can never be negative
- dff25dbc3 FullscreenUI: Improve drag scrolling
- 0d1b014cc ImGuiManager: Don't hover pointer for touchscreens
- 5d4772417 System: Sync to host refresh rates that are a multiple of the console's
- e48f86ab9 SDLInputSource: Fix sensor enable early return
- 84e1db587 FullscreenUI: Fix clear binding button clearing all
- dc623cafe Spanish (Spain) translation update 2026/10/25 (#3814)
- f78ecb81c Settings: Fix VSync/frame pacing help text
- ae250ebeb D3D12Device: Use frame latency waitable in exclusive fullscreen
- 3c81431b4 Qt: Use X11 server size for surface size
- 6cd67d7ef Qt: Round Wayland surface size as per fractional-scale-v1
- 4b524740d OpenGLContextEGL: Don't query surface size
- 60a5c21f4 GPUDevice: Report swap chain resizes from present calls
- 1e7b6d796 Qt: Accept wayland-egl/wayland-brcm platform names
- 360a35ed1 Qt: Remove sync()/processEvents() hack
- ae7895dae Qt: Pick up X11 window size changes from configure events
- 8c68d4778 Improve Swedish vertex terminology (#3815)
- 16be09afe Qt: Skip setting rounded corner state on Windows 10
- e7efd4261 Qt: Recheck surface size when restoring from minimized
- a4f3e5ff7 VideoThread: Ignore zero-sized render window resizes
- 076b133a6 CocoaTools: Use native display mode for real scaling factor
- 5d936496a System: Disable vsync while fast forwarding if it can be switched cheaply
- 637ff514c VulkanSwapChain: Switch between FIFO and immediate without recreating
- 2a0e92fe3 FullscreenUI: Fix 0 point display when achievements disabled
- a78082b8c Qt: Add descriptions to post-processing page
- e0f6fa82b Qt: Remove 'Post Processing Chain' groupbox
- 0310f59ac XInputSource: Poll disconnected slots periodically
- e41bcd36d InputManager: Device notification fixes
- f591ef20e Common: Fix heap overflow when shrinking DynamicHeapArray
- 526b4a128 Clarify Swedish automatic setting descriptions (#3816)
- d38183754 Improve Swedish translation quality (#3817)
- eb68a7d22 AudioStream: Make ApplyVolume() public
- cf5890e26 SoundEffectManager: Add volume control
- 3171f3be9 Cheats: Add block write code types
- 8cc2ef4a7 Scripts: Add psx-exe to elf converter
- 25ff3364c Cheats: Merge runs of constant/match writes into vectorised block writes
- 94cdf91c0 Qt: Update machine translations
- 831fef0e3 Qt: Fix reset audio settings clearing from base ini
- e700391c4 Qt: Rename PromptForAddress() to PromptForHexValue()
- 3f8df8b78 Qt: Allow editing CPU registers in debugger
- fc48940aa CPU: Only intercept TTY syscalls in interpreter with BIOS TTY logging
- ca184adb3 System: Don't apply cheats or update achievements until the game starts
- b292b8477 Scripts: Regression test UI
- 09f61b9
- v0.1-124422026-10-25 · 2026-10-25 02:59 UTC
查看更新说明
Commits
- 1b79c8b44 Deps: Update to 20261010
- 6a9c29604 Achievements: Extract bucket names out of FullscreenUI
- e468c8084 Achievements: Separate login and credential saving steps
- 3856bf0c3 SettingsInterface: Guard against copying to self
- 8af1da4fc Threading: Add WaitFor() to ConditionVariable
- fdb7e8f7b GameDatabase: Sort disc sets by save title
- 363da8d4f GameList: Don't persist cache map between refreshes
- deaa4a44b GameList: Allow use of external SettingsInterface
- 43cf72faa GameList: Synchronize settings between FullscreenUI and Qt
- b8ce9b4df System: Provide content details to OnSystemStarted()
- de2dd2b68 StringUtil: Fix possible integer overflow in EncodeAndAppendUTF8()
- aa03edcd1 Settings: Add a dedicated key for overlays
- 594155010 Settings: Don't copy controller type to game
- bd44b2a43 Core: Don't reset folders when resetting settings
- 03f731681 FileSystem: Backport additional helper functions
- 1b123c397 FileSystem: Make OpenSharedCFile() wrap OpenCFile() on non-Windows
- 84d511d18 FileSystem: Add error parameter to FTell64()
- 230b4788c FileSystem: Extract find result sorting to function
- 98c25ab78 FileSystem: Use shared file open for ReadBinaryFile/ReadFileToString
- 7d618a582 FileSystem: More RVO optimizations
- f20b39bd0 FileSystem: Add more ReadFileToString() overloads
- a6a22baff CPU/Recompiler: Respect load delays when swapping NOP slots
- 10525f926 CPU/Recompiler: Cancel pending loads on self moves
- 19d507707 CPU/Recompiler: Keep link-register delay slots in order
- 95102c364 CPU/Recompiler: Dispatch interpreter fallback exceptions
- cc6f410b0 CPU/Recompiler: Trap constant signed arithmetic overflow
- 00adf511d CPU/Recompiler: Preserve pending loads on memory exceptions
- 96c75771c CPU/Recompiler: Correct misaligned indirect jump exceptions
- c714922a5 CPU/Recompiler: Fix ARM32 VIXL debug builds
- 501fe22ed CPU/Recompiler: Mask constant variable shift counts on ARM
- 05c811f4e CPU/Recompiler: Truncate ARM64 multiplication results in LO
- b224f7a8e CPU/Recompiler: Decode ARM32 load exceptions from r0
- 63cbd900d CPU/Recompiler: Align ARM32 backpatch thunk calls
- 22a3b0674 CPU/Recompiler: Use 32-bit ARM64 fastmem LUT indices
- 38651d400 CPU/Recompiler: Handle large ARM64 backpatch cycle counts
- 5b37f3d91 SPU: Fast-path ADPCM blocks without predictors
- 16fa96940 SPU: Skip reverb output filtering at zero volume
- fd8574a84 SPU: Pack reverb FIR coefficients into 16-bit lanes
- 5a5bb3db4 SPU: Extract reverb-master-enable out of loop
- 22a06c8a4 GTE: Add regression tests
- 953285bf5 GTE: Only sign extend MAC results on overflow
- 769f4330b GTE: Force inline matrix/lighting/projection helpers
- d6d1373c5 GTE: Specialize instruction handlers on sf/lm
- 9a5bb3d85 GTE: Factorize NCLIP to use three multiplies
- 79161b097 GTE: Use shift for IRGB/ORGB conversion
- 5b3bcf139 GTE: Simplify FLAG error bit update
- 8e4701a5f GTE: Mark saturation branches as unlikely
- e43d2f81a GTE: Use branchless saturation for light matrix multiply
- cf71052c4 CDROM: Vectorize XA resampling
- b70866fba MSBuild: Improve reproducibility
- 7f0b3275b CMake: Improve reproducibility
- 60ab60a03 CPU: Don't stall for GTE with a single cycle remaining
- 645734b13 System: Add optional callback to screenshot save
- a22292bf8 System: Avoid unnecessary mutex unlock->relock
- 217cb9401 ZipHelpers: Fix incorrect error message
- 4beed326e InputManager: Return proper error from GetGenericBindingMapping()
- 70b95a4c0 Settings: Shorten fastmem mode description
- fcd8c7b2f System: Don't use exact sleep on core thread
- 0a93c2305 Settings: Fix inconsistent default values
- 9dc2bd54d Settings: Use constants for section names
- b8a8abae8 Update Swedish Qt translation
- e0deda016 TimingEvent: Relax Assert to DebugAssert
- ee6c200b9 FullscreenUI: Fix deadlock opening game properties
- 9b47014f1 Qt: Fix window icon/title desynchronizing
- 390686a5d MDEC: Fix word alignment of DMA
- v0.1-120832026-10-13 · 2026-10-13 05:31 UTC
查看更新说明
Commits
- 2781502e0 SPU: Streamline per-voice flag processing
- 690ead7ee SPU: Vectorize Gaussian interpolation
- 5a7a301a7 SPU: Consolidate capture buffer writes
- a24350c47 SPU: Decode ADPCM nibbles in pairs
- a4904189c VulkanDevice: Use timeline semaphores when available
- ed6720bbf Tests: Fix core-tests building on Windows
- 025ea24fc GPU/HW: Fix typo in CompilePipelines()
- 88ccab2a2 Achievements: Fix some options potentially not live-updating
- 16452a048 Achievements: Check for login request in LoadStateFromBuffer()
- 3c141418a FullscreenUI: Fix extra uneven height in achievement notifications
- 0910d4edc FullscreenUI: Reduce text size of small-mode category badges
- 96268ab66 Qt: Remove empty widget text
- 390c878f7 GameDB: Persona localizedName
- e26fa6091 Update Italian translation (#3798)
- 563c35513 TaskQueue: Add GetOutstandingTasks() and ExecuteOneTask()
- efecb78db Threading: Add GetProcessorCount()
- 0d2e66235 Core: Make TaskQueue thread count dynamic
- 60b06c0e2 ObjectArchive: Use binary keys instead of strings
- 3151c5256 ObjectArchive: Synchronize access internally
- 79371c47a HTTPCache: Use object archive synchronization
- 5420d699e GPUDevice: Use ObjectArchive for shader cache
- 7951eba8a GPUDevice: Support looking up cached shaders and opaque keys
- f541abb11 GPUDevice: Add LoadPipeline() for supported backends
- 5ebeff9c2 GPU/HW: Use UIDs for shader generation
- 7c239271f GPU/HW: Use UIDs as shader cache keys
- 94e5f08f1 GPU/HW: Use multi-threaded shader compilation
- 74a743a5e GPU/HW: Use multi-threaded pipeline compilation
- 6fe06b99e VideoThread: Preserve command queue empty slot
- 7c173d914 VideoThread: Enforce command producer ownership
- 67d594312 VideoThread: Keep successful software fallback
- e0519a899 VideoThread: Use video-owned fullscreen settings
- 7131d9144 VideoThread: Destroy inline reconfigure commands
- c54f16ae5 VideoThread: Snapshot fullscreen state for resize
- 0cad5f505 VideoThread: Dispatch thread toggle failures safely
- 8c6ff3bfc VideoThread: Propagate thread startup failure
- b5f0fb9c3 FullscreenUI: Tweak separator style
- c81a747ff Qt: Add multi-instruction selection to debugger
- 5cc77ac18 Qt: Persist debugger window state
- 9c335d9e0 Qt: Add icons to context menu
- 0874ed65d Qt: Fix empty debugger toolbar window title
- 5b056fc8d Qt: Fix icon missing on newly-added excluded paths
- 024face27 Qt: Add context menu to game list exclusion list
- 28ea031c4 GPU: Add Disable Upscaled Direct Textures option
- 63d72ac15 GameDB: DisableUpscaledDirectTextures for Fear Effect
- d7036f347 Qt: Persist use-serial-file-names in cover downloader
- 6ef27141f MSBuild: Force SHA256 source file hashes
- ef86bf11c InputManager: Add hotkey flag for UI-activatable
- 396dae923 InputManager: Release cancelled hold bindings
- 3d1646517 InputManager: Clear bindings when input is lost
- 0ccc553df InputManager: Fix effect sync device matching
- 3af2d36d6 ImGuiManager: Track text input separately
- 500599143 InputManager: Type button transitions
- e0e692023 FullscreenUI: Add 'Toggle Pause Menu' hotkey
- 142bdc8c8 FullscreenUI: Make cheats/achievements/leadboards hotkeys toggles
- b54fc14bc FullscreenUI: Synchronize pause menu toggle
- 8051b4f0c PerformanceCounters: Ignore reset boundary sample
- b7e20507b Qt: Remove unnecessary usage of QOverload (#3799)
- 2f4724dd1 D3DCommon: Use once_flag for library loading
- 7137ce2be Threading: Add lightweight Mutex/ConditionVariable wrappers
- f46b6a834 Core: Use lock_guard for settings accessors
- bbeac9cfe Core: Use Threading::Mutex for settings lock
- 3bb2b0b1d CDROMAsyncReader: Use lightweight threading abstractions
- 22072c934 Misc: Replace std::mutex with Threading::Mutex
- 00d407c35 CDROMAsyncReader: Convert to namespace
- dbe144407 GPU/HW: Fix missing mask-or application on texture fallback
- ac0e3a5c8 GPU/HW: Add 'Filter Framebuffer Uploads' advanced option
- aaa8a68df GameDB: Enable backgr
- v0.1-118942026-09-12 · 2026-09-12 12:20 UTC
查看更新说明
Commits
- 9287950af VideoPresenter: Fix prerotation handling with blur/transitions
- b0f7c5c16 Update duckstation-qt_es.ts (#3792)
- 20b626d41 MSBuild: Explicitly list plugins to copy
- e05146d7a MSBuild: Track Qt translation outputs
- 1e2ee51b1 MSBuild: Track Qt resource outputs
- 8c7b74ca2 MSBuild: Fix Qt MOC dependency tracking
- bf15b0df6 MSBuild: Generate Qt MOC files in parallel
- 46364b24b MSBuild: Track QRC asset dependencies
- 7652c0446 MSBuild: Generate Qt translations in parallel
- 78cd1f248 MSBuild: Generate Qt UI headers in parallel
- f34d2c475 Achievements: Add category badge to popup
- f1d54ab74 Qt: Fix trailing slash being added to game directories
- ec81e45b2 Settings: Disable gpu_force_video_timing in hardcore mode
- 274143dfd CI: Update deps to 20260905
- 9c91b9156 Common: Remove unused include
- 7762f953c Build: Use C++23 across the board
- 6f23cc25d System: Allow live-changing console region
- 31948bcb5 Misc: Use static operator()
- 084bc6fb3 Achievements: Fix padding in notifications/lists
- 1cafea4e5 Qt: Slight improvement to track summary list
- b91b9b247 Qt: Add RA Game ID to game properties
- c05866d2b Qt: Add styling to select disc dialog
- ebc51ff0c System: Don't copy non-sensitive user preferences to game settings
- f1f8ee797 System: Disable post-processing when resetting settings
- 75448944d dep/rcheevos: Bump to e871ef5
- d9182a04d Qt: Add threads view to debugger
- 118bb6616 Qt: Add call stack to debugger
- 4a0cdd2dc Qt: Link stack view to memory view
- 5100c5164 Qt: Use QPointer in DebuggerWindow
- 3bc1e8cdf SettingsInterface: Create type aliases for string lists
- 3eee1e61e INISettingsInterface: Don't set dirty if unchanged in SetKeyValueList()
- 92fb83b6a Qt: Save debugger breakpoints to inis
- f5ffb6b51 System: Fix unused function warning
- 5aeeb72e6 VideoThread: Fix rare crash if device initialization fails
- 0d33bd177 Settings: Ensure pcdrv_root is a native path
- 3f44ac2e9 Deps: Bump to 20260906
- f39feb9d8 Image: Load libpng/libjpeg/libwebp dynamically
- fa77cd485 CMake: Don't unnecessarily bundle
- c359ccfcb DynamicLibrary: Log loaded library paths on Linux
- 2179487e5 SDLInputSource: Remove unused variable
- fa935c296 SQLiteHelpers: Format file
- 38751bdf7 SDLInputSource: Load SDL dynamically
- 025872c52 Qt: Warn when LD_LIBRARY_PATH is overridden on Linux
- b42b6981e Qt: Create desktop file before setup wizard on Linux
- f1f6b0ee7 ImGuiManager: Load FreeType/plutosvg dynamically
- 3ccc0c45f Util: Centralize dynlib loading
- 17a721c8f ZipHelpers: Load libzip on-demand
- 1f065b5ea CMake: Make bundle building on MacOS optional
- d9071e49b CocoaTools: Return nullopt if not running from bundle
- 69fe55034 DynamicLibrary: Drop MacOS Frameworks hack
- 0fbd997d4 Misc: Remove atexit() usage
- 0206d926f SDLInputSource: Centralize SDL subsystem loading
- 7d169057d README: Update feature list
- e05b9b9f9 FullscreenUI: Fix 'Use Global Setting' showing in global postfx settings
- 3f5dca5ce FullscreenUI: Use expand icon for dropdowns
- 2cb1bf7b9 GPUDevice: Add SingleTextureAndUBOAndPushConstants layout
- 91c5a79b2 FullscreenUI: Use SingleTextureAndUBOAndPushConstants for blur apply
- 4973361c5 GameList: Add AudioCD type
- 00989b7ec Qt: Make game properties inaccessible for PSF/Audio CDs
- 0cb515fe4 GameList: Reorder list entry types
- 1d07ae225 Update duckstation-qt_es.ts (#3794)
- 73c226615 DynLibs: Fix libjpeg load regression on Windows
- 35d1f0629 Atualização Português do Brasil (#3793)
- 443ef825b Qt: Merge import buttons in the memory card editor (#3795)
- cbe7951be CPU/CodeCache: Remove thread_local recursive guard
- 1ab327d6d GPUDevice: Drop SingleTextureAndUBOAndPushConstants
- 3b30876e9 l10n: update Swedish Qt translation (#3796)
- c66b2694d DynLibs: Fix libwebp loading on Windows
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
DuckStation - PlayStation 1, aka. PSX Emulator
Features | Downloading and Running | Building | Disclaimers
Latest Builds for Windows 10/11 (x64/ARM64), Linux (AppImage x64/ARM32/ARM64), and macOS (13.3+ Universal): https://github.com/stenzek/duckstation/releases/tag/latest
Discord Server: https://www.duckstation.org/discord.html
DuckStation is an simulator/emulator of the Sony PlayStation(TM) console, focusing on playability, speed, and long-term maintainability. The goal is to be as accurate as possible while maintaining performance suitable for low-end devices. "Hack" options are discouraged, the default configuration should support all playable games with only some of the enhancements having compatibility issues.
A PS1 or PS2 "BIOS" ROM image is required to to start the emulator and to play games. You can use an image from any hardware version or region, although mismatching game regions and BIOS regions may have compatibility issues. A ROM image is not provided with the emulator for legal reasons, you should dump this from your own console using Caetla or other means.
Features
DuckStation features a fully-featured frontend built using Qt, as well as a fullscreen/TV UI based on Dear ImGui.
Other features include:
- CPU Recompiler/JIT (x86-64, armv7/AArch32, AArch64, RISC-V/RV64).
- Hardware renderer supporting D3D11, D3D12, OpenGL, Vulkan and Metal APIs.
- Upscaling, texture filtering, and true colour (24-bit) in hardware renderers.
- PGXP for geometry precision, texture correction, and depth buffer emulation.
- Accurate blending via Rasterizer Order Views/Fragment Shader Interlock.
- Texture replacement system in hardware renderers.
- Vectorized and multi-threaded software renderer.
- Motion adaptive deinterlacing.
- Adaptive downsampling filter.
- Screen rotation for vertical or "TATE" shmup games.
- Post processing shader chains (GLSL, Reshade FX and Slang Presets).
- Border overlays/bezels displayed around game content.
- "Fast boot" for skipping BIOS splash/intro.
- Save state support, with runahead and rewind.
- Windows, Linux, macOS support.
- Supports reading directly from CD, bin/cue images, MAME CHD, single-track ECM, MDS/MDF, CCD, and unencrypted PBP formats.
- Preloading of disc images to RAM to avoid disk sleeping hitches.
- Merging of multi-disc games in game list/grid with memory cards shared between discs.
- Automatic loading/applying of PPF patches.
- Direct booting of homebrew executables.
- Direct loading of Portable Sound Format (psf) files.
- Time stretched audio when running outside of 100% speed.
- Digital and analog controllers for input (rumble is forwarded to host).
- GunCon and Justifier lightgun support (simulated with mouse).
- NeGcon support.
- Controller presets and per-game configuration.
- Qt and "Big Picture" UI.
- Automatic updates with preview and latest channels.
- Automatic content scanning with English and native game titles.
- Optional automatic switching of memory cards for each game.
- Memory card editor and save importer.
- Emulated CPU overclocking.
- Cheat database with support for over 4,000 games.
- Patch database with visual, frame rate and aspect ratio enhancements.
- Live memory scanning and editing.
- ISO browsing and file extraction.
- Integrated and remote debugging.
- Multitap controllers (up to 8 devices).
- RetroAchievements.
- Discord Rich Presence.
- Video capture with Media Foundation (Windows) and FFmpeg (All Platforms) backends.
- Free camera function.
- Parallel port cartridge emulation.
System Requirements
- A CPU faster than a potato. But it needs to be x86_64, AArch32/armv7, AArch64/ARMv8, or RISC-V/RV64.
- A GPU capable of OpenGL 3.1/OpenGL ES 3.1/Direct3D 11 Feature Level 10.0/Vulkan 1.0. So, basically anything made in the last 10 years or so.
- SDL, XInput or DInput compatible game controller (e.g. XB360/XBOne/XBSeries). DualShock 3 users on Windows will need to install the official DualShock 3 drivers included as part of PlayStation Now.
Downloading and running
Binaries of DuckStation for Windows x64/ARM64, Linux x86_64/ARM32/ARM64 (in AppImage format), and macOS Universal Binaries are available via GitHub Releases and are automatically built with every commit/push.
As per the terms of CC-BY-NC-ND, redistribution of unmodified releases and code is permitted. However, we would prefer if you linked to https://www.duckstation.org/ instead. Please note that pre-configured settings and packages are considered modifications.
For x86 machines (most systems), you will need a CPU that supports the SSE4.1 instruction set for the "normal" build. This includes all Intel CPUs manufactured after 2007, and AMD CPUs manufactured after 2011. If you have a CPU that is older, you will need to download the "SSE2" build from the releases page, which has lower performance but still supports these CPUs.
The main releases page is limited to the last 30 releases due to automatic updater limitations. Older releases can be downloaded from https://github.com/duckstation/old-releases/releases.
Update Channels
The automatic updater in DuckStation has two channels: "Stable" and "Preview".
- "Stable Releases": Less frequent updates, and tracks the "latest" release on GitHub. Releases in this channel have had more testing.
- "Preview Releases": Built whenever a commit is pushed to the repository, and tracks the pre-release on GitHub. This channel contains builds which have had minimal testing, and may contain bugs or issues.
By default, the updater will track the channel you downloaded from. You can change the channel in Settings -> Interface -> Updates.
Windows
DuckStation requires Windows 10/11, specifically version 1809 or newer. If you are still using Windows 7/8/8.1, DuckStation will not run on your operating system. Running these operating systems in 2026 should be considered a security risk, and I would recommend updating to something which receives vendor support. If you must use an older operating system, v0.1-5624 is the last version which will run. But do not expect to receive any assistance, these builds are no longer supported.
Windows builds are provided in two formats:
- Installer (.exe, recommended): An installer which extracts DuckStation to your user-local programs directory, and optionally creates Start Menu/Desktop shortcuts.
- Archive (.zip): A zip archive containing the prebuilt binary. Choose this option if you want a "portable" installation, or do not want to run an installer.
To use the installer, simply download the installer from the releases page, run it, and follow the prompts.
- Direct download link: https://github.com/stenzek/duckstation/releases/download/latest/duckstation-windows-x64-installer.exe
- ARM64 download link (Snapdragon laptops): https://github.com/stenzek/duckstation/releases/download/latest/duckstation-windows-arm64-installer.exe
- Legacy SSE2 installer (for pre-2008 CPUs): https://github.com/stenzek/duckstation/releases/download/latest/duckstation-windows-x64-sse2-installer.exe
The installer is still a new addition, so if you encounter issues please let us know via Discord.
To use the archive or portable installation, follow these steps:
- Download https://github.com/stenzek/duckstation/releases/download/latest/duckstation-windows-x64-release.zip. If you have an ARM64 Windows machine such as Snapdragon, download
duckstation-windows-arm64-release.zipinstead. - Extract the archive to a subdirectory. The archive has no root subdirectory, so extracting to the current directory will drop a bunch of files in your download directory if you do not extract to a subdirectory.
- If you want a portable installation (see User Directories), create an empty file named
portable.txtin the same directory as the executable. - Once downloaded and extracted, you can launch the emulator with
duckstation-qt-x64-ReleaseLTCG.exe. Follow the Setup Wizard to get started.
If you get an error about vcruntime140_1.dll being missing, you will need to update your Visual C++ runtime. You can do that from this page: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist. Specifically, you want the x64 runtime, which can be downloaded from https://aka.ms/vs/17/release/vc_redist.x64.exe.
Linux
DuckStation is provided for x86_64/ARM32/ARM64 Linux in AppImage formats.
AppImage
The AppImages require a distribution equivalent to Ubuntu 22.04 or newer to run.
- Download https://github.com/stenzek/duckstation/releases/download/latest/DuckStation-x64.AppImage. If you have an ARM64 Linux machine, you should download
DuckStation-arm64.AppImage. - Run
chmod a+xon the downloaded AppImage -- following this step, the AppImage can be run like a typical executable. Alternatively, in your file manager of choice, enable execute permissions via the file properties dialog. - When running the AppImage for the first time, it will prompt to create a launcher shortcut.
If you were previously using the Flatpak package, to migrate your data from the Flatpak to the AppImage, you can run the following command:
mv ~/.var/app/org.duckstation.DuckStation/config/duckstation ~/.local/share
You will need to re-add your game directories after switching to the AppImage.
macOS
Universal macOS builds are provided for both x86_64 (Intel) and ARM64 (Apple Silicon).
macOS Ventura (13.3) is required, as this is also the minimum requirement for Qt.
To download:
- Download https://github.com/stenzek/duckstation/releases/download/latest/duckstation-mac-release.zip.
- Extract the zip by double-clicking it.
- Open
DuckStation.app, optionally moving it to your desired location first.
If you receive a message about the app being from an unidentified developer:
- Open System Settings -> Privacy & Security, or enter "Gatekeeper" in the search bar.
- Under the "Security" section, there should be a message about DuckStation being blocked. Click "Open Anyway".
Unfortunately this is required as Apple requires code signing for apps to be run without warnings, and I do not have a code signing certificate since a yearly cost is out of the question for a project which brings in zero revenue.
Android
You will need a device with armv7 (32-bit ARM), AArch64 (64-bit ARM), or x86_64 (64-bit x86). 64-bit is preferred, the requirements are higher for 32-bit, you'll probably want at least a 1.5GHz CPU.
Download from Google Play: https://play.google.com/store/apps/details?id=com.github.stenzek.duckstation
No support is provided for the Android app, it is free and your expectations should be in line with that. Please do not email me about issues about it, or ask for help, you will be ignored.
To use:
- Install and run the app for the first time.
- Follow the setup wizard.
If you have an external controller, you will need to map the buttons and sticks in settings.
LibCrypt protection and SBI files
A number of PAL region games use LibCrypt protection, requiring additional CD subchannel information to run properly. libcrypt not functioning usually manifests as hanging or crashing, but can sometimes affect gameplay too, depending on how the game implemented it.
For these games, make sure that the CD image and its corresponding SBI (.sbi) file have the same name and are placed in the same directory. DuckStation will automatically load the SBI file when it is found next to the CD image.
For example, if your disc image was named Spyro3.cue, you would place the SBI file in the same directory, and name it Spyro3.sbi.
CHD images with built-in subchannel information are also supported.
If you are playing directly from a disc and your CD/DVD drive does not support subchannel reading, or has a skew with the returned SubQ, you can place the SBI file in the subchannels directory under the user directory, with the serial or title of the game.
Cheats and patch database
DuckStation ships with a built-in cheat and patch database, both provided by the community. Contributions to these are welcome at https://github.com/duckstation/chtdb.
Each release includes the latest version of the database, however you are free to manually update to the latest version as well.
Building
Windows
Requirements:
- Visual Studio 2026 or newer with the "Desktop development with C++" workload installed.
- Clone the repository:
git clone https://github.com/stenzek/duckstation.git. - Download the dependencies pack from https://github.com/duckstation/dependencies. You'll need the
deps-windows-x64.7zfile, anddeps-windows-arm64.7zif you want to cross-compile for ARM64. Extract these archives todep\prebuilt. - Open the Visual Studio solution
duckstation.slnxin the root (recommended), or "Open Folder" for CMake build (not recommended/supported). - Build solution.
- Binaries are located in
bin/x64. - Run
duckstation-qt-x64-Release.exeor whichever config you used.
Linux
Required Dependencies
Ubuntu/Debian package names:
autoconf automake build-essential clang cmake curl extra-cmake-modules git libasound2-dev libcurl4-openssl-dev libdbus-1-dev libdecor-0-dev libegl-dev libevdev-dev libfontconfig-dev libfreetype-dev libgtk-3-dev libgudev-1.0-dev libharfbuzz-dev libinput-dev libopengl-dev libpipewire-0.3-dev libpulse-dev libssl-dev libudev-dev libwayland-dev libx11-dev libx11-xcb-dev libxcb1-dev libxcb-composite0-dev libxcb-cursor-dev libxcb-damage0-dev libxcb-glx0-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-util-dev libxcb-xfixes0-dev libxcb-xinput-dev libxcb-xkb-dev libxext-dev libxkbcommon-x11-dev libxrandr-dev libxss-dev libtool lld llvm nasm ninja-build pkg-config zlib1g-dev
Fedora package names:
alsa-lib-devel autoconf automake brotli-devel clang cmake dbus-devel egl-wayland-devel extra-cmake-modules fontconfig-devel gcc-c++ gtk3-devel libavcodec-free-devel libavformat-free-devel libavutil-free-devel libcurl-devel libdecor-devel libevdev-devel libICE-devel libinput-devel libSM-devel libswresample-free-devel libswscale-free-devel libX11-devel libXau-devel libxcb-devel libXcomposite-devel libXcursor-devel libXext-devel libXfixes-devel libXft-devel libXi-devel libxkbcommon-devel libxkbcommon-x11-devel libXpresent-devel libXrandr-devel libXrender-devel libXScrnSaver-devel libtool lld llvm make mesa-libEGL-devel mesa-libGL-devel nasm ninja-build openssl-devel patch pcre2-devel perl-Digest-SHA pipewire-devel pulseaudio-libs-devel systemd-devel wayland-devel xcb-util-cursor-devel xcb-util-devel xcb-util-errors-devel xcb-util-image-devel xcb-util-keysyms-devel xcb-util-renderutil-devel xcb-util-wm-devel xcb-util-xrm-devel zlib-devel
Building
- Clone the repository:
git clone https://github.com/stenzek/duckstation.git,cd duckstation. - Download the dependencies pack from https://github.com/duckstation/dependencies. You'll need the
deps-linux-x64.tar.xzfile, and the cross variants if you want to cross-compile for ARM. Extract these archives todep\prebuilt. - Run CMake to configure the build system. Assuming a build subdirectory of
build-release, runcmake -B build-release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_EXE_LINKER_FLAGS_INIT="-fuse-ld=lld" -DCMAKE_MODULE_LINKER_FLAGS_INIT="-fuse-ld=lld" -DCMAKE_SHARED_LINKER_FLAGS_INIT="-fuse-ld=lld" -G Ninja. If you want a release (optimized) build, include-DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON. - Compile the source code. For the example above, run
ninja -C build-release - Run the binary, located in the build directory under
./build-release/bin/duckstation-qt.
macOS
Requirements:
- CMake
- Xcode
- Clone the repository:
git clone https://github.com/stenzek/duckstation.git. - Download the dependencies pack from https://github.com/duckstation/dependencies. You'll need the
deps-macos-universal.tar.xzfile. Extract the archives todep\prebuilt. - Run CMake to configure the build system:
cmake -Bbuild-release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON. - Compile the source code:
cmake --build build-release --parallel. - Run the binary, located in the build directory under
bin/DuckStation.app.
User Directories
The "User Directory" is where you should place your BIOS images, where settings are saved to, and memory cards/save states are saved by default. An optional SDL game controller database file can be also placed here.
This is located in the following places depending on the platform you're using:
- Windows:
AppData\Local\DuckStation(old installs will useDocuments\DuckStation). - Linux:
$XDG_DATA_HOME/duckstation, or~/.local/share/duckstation. - macOS:
~/Library/Application Support/DuckStation.
If you wish to use a "portable" build, where the user directory is the same as where the executable is located, create an empty file named portable.txt in the same directory as the DuckStation executable.
A shortcut to open the user directory is available by selecting Open Data Directory from the Tools menu.
DuckStation allows you to override certain resources by placing files in the resources subdirectory of the user directory. This includes images and sound effects (e.g. menu navigation/achievement unlock). Please refer to https://github.com/stenzek/duckstation/wiki/Resource-Overrides for more information.
Bindings for Qt frontend
Your keyboard or game controller can be used to simulate a variety of PlayStation controllers. Controller input is supported through DInput, XInput, and SDL backends and can be changed through Settings -> Controllers.
To bind your input device, go to Settings -> Controllers, and select the virtual controller you want to map. Automatic mapping handles the majority of controllers. However, if you need to manually bind a controller, click the box below the button/axis name, and press the key or button on your input device that you wish to bind to.
SDL Game Controller Database
DuckStation releases ship with a database of game controller mappings for the SDL controller backend, courtesy of https://github.com/mdqinc/SDL_GameControllerDB. The included gamecontrollerdb.txt file can be found in the resources subdirectory of the DuckStation program directory.
If you are experiencing issues binding your controller with the SDL controller backend, you may need to add a custom mapping to the database file. Make a copy of gamecontrollerdb.txt and place it in your user directory (or directly in the program directory, if running in portable mode) and then follow the instructions in the SDL_GameControllerDB repository for creating a new mapping. Add this mapping to the new copy of gamecontrollerdb.txt and your controller should then be recognized properly.
Default bindings
Bindings for controllers and hotkeys can be changed in Settings -> Controllers.
Controller 1:
- Left Stick: W/A/S/D
- Right Stick: T/F/G/H
- D-Pad: Up/Left/Down/Right
- Triangle/Square/Circle/Cross: I/J/L/K
- L1/R1: Q/E
- L2/R2: 1/3
- L3/R3: 2/4
- Start: Enter
- Select: Backspace
Hotkeys:
- Escape: Open Pause Menu
- F1: Load State
- F2: Save State
- F3: Select Previous Save State
- F4: Select Next Save State
- F10: Save Screenshot
- F11: Toggle Fullscreen
- Tab: Temporarily Disable Speed Limiter
- Space: Pause/Resume Emulation
Contributing and Forks
As per the terms of CC-BY-NC-ND, you may redistribute unmodified versions of this repository, and the compiled binaries. This includes GitHub forks without any changes. You are not permitted to publish modified versions of this repository.
Please note that "patches", both binary and source are still considered derivative works, since they literally include the original code as part of the patch.
The following exceptions apply:
- Prior contributors are permitted to push changes to public forks for the purpose of making pull requests.
- Translators are permitted to push changes to public forks and make pull requests, since you own the copyright on your translation.
If you would like to make a contribution, I accept patches via email or the Discord server. Pull requests are restricted to prior contributors.
Previously this was not something that I enforced, but in 2026 with the flood of vibe-coded slop it is a constant problem.
- People who have zero understanding of what they have created expect maintainers to fix, clean up, and maintain their garbage code.
- These people are not even able to answer basic questions about their changes without copy/pasting from an agent.
- Almost every time I have had this happen, they get abusive when told that if they cannot explain their code, it is slop. There is zero respect for the original developers of software.
I'm not anti-AI. I use coding agents myself, including limited usage within DuckStation. The quality of the code written by agents is dependent on the user prompting and steering it, without constant hand-holding they create unmaintainable mess.
If you couldn't write the code yourself, you shouldn't be using an agent to write it. How else can you review it and know that it is correct?
Disclaimers
Icon by icons8: https://icons8.com/icon/74847/platforms.undefined.short-title
"PlayStation" and "PSX" are registered trademarks of Sony Interactive Entertainment Europe Limited. This project is not affiliated in any way with Sony Interactive Entertainment.