![]() |
CRM64Pro GDK v0.20.0
A free cross-platform game development kit built on top of SDL 3.0
|
The ultimate SDL3 companion for 2D games and tools.
CRM64Pro is a modern, free, cross-platform C++17 Game Development Kit built on SDL3, with rendering, particle effects, 2D lighting, audio, video, Scene tooling, CDC archives and the EditorC64 asset workflow. It is designed to help developers create high-performance 2D games, tools and interactive applications through a clean, modular and hardware-accelerated framework.
CRM64Pro is distributed under the zlib license.
Modern core Developed in C++17 and powered by SDL3, featuring fixed-step timing, multi-threaded services, advanced logging utilities, debug windows with live numeric and string watches, an embedded console, and CDCv2 asset archives with compression, >4GB file support, validation, encrypted storage and streaming block I/O. |
Complete toolset Includes an advanced Scene and world management system with native Tiled map support, Scene particles, animated point and spot lighting, persistent Physics collision sets and configurable object overlays. EditorC64 imports Universal VTT maps and animated GIF, WebP and H.264 sources into Tiled-compatible assets. Images can be loaded from BMP, PNG, JPG/JPEG, PCX, TGA and WebP, saved as BMP or PNG, and processed with built-in color, distortion and alpha filters. The full GUI windowing system includes aligned text controls. |
Hardware accelerated Supports Direct3D 11/12, Vulkan, Metal, and OpenGL, ensuring fast and smooth rendering across all supported platforms. |
| Developed by MegaStorm Systems. Visit the official website for updates, releases, and complete documentation. | |
The GDK runs on major operating systems. Thanks to SDL3, it supports a wide variety of hardware-accelerated rendering and low-latency audio drivers.
| Platform | Requirements | Render drivers | Audio drivers |
|---|---|---|---|
| Windows 7, 10 and 11 (64-bit only) | Direct3D 9 Direct3D 11 Direct3D 12 Vulkan GPU OpenGL Software | WASAPI DirectSound | |
| Kernel 4.18+ (64-bit only) | Vulkan GPU OpenGL X11 Wayland Software | PulseAudio ALSA | |
| macOS 10.15+ (Catalina or later for x86_64) macOS 11+ (Big Sur or later for arm64) | Metal Vulkan GPU OpenGL Software | CoreAudio | |
| Android Not available yet Android 5.0+ (API 21+) | OpenGL ES Vulkan | AAudio OpenSL ES |
This section describes how to install and configure the CRM64Pro GDK for development on the supported platforms.
Windows DevelopmentExecutable Installer (Inno Setup) |
1. Download and Install CRM64Pro is distributed as a standard Windows installer created with Inno Setup (for example: CRM64Pro-X.Y.Z-win-x64.exe).
The installer will deploy headers, libraries and the EditorC64 into the selected destination.
The following libraries are provided:
CRM64Pro.lib – Dynamic linking (DLL import library) CRM64Pro.static.lib – Static linking (Release) CRM64Pro.static-debug.lib – Static linking with debug information 2. Configure Visual Studio No global system variables are required. Configure your project locally:
include/ directory to C/C++ → General → Additional Include Directories. lib/ directory to Linker → General → Additional Library Directories. CRM64Pro.lib (Dynamic linking) CRM64Pro.static.lib or CRM64Pro.static-debug.lib (Static linking) 3. Runtime (DLL) When using dynamic linking, ensure that CRM64Pro.dll is located next to your executable or available in the system PATH (the installer allows to update this automatically).
Linux DevelopmentSelf-Extracting Bash Installer |
1. Download and Install CRM64Pro for Linux is distributed as a self-extracting Bash installer (for example: CRM64Pro-X.Y.Z-linux-x64.sh).
Run the installer from a terminal:
The installer places headers and libraries in standard system locations (e.g. /usr/local/include and /usr/local/lib).
2. Compiling Once installed, CRM64Pro can be linked using standard compiler flags:
macOS DevelopmentDMG Package (Universal Binary) |
1. Download and Install CRM64Pro is distributed as a DMG package. The installer provides a universal library supporting both x86_64 and arm64 (Apple Silicon) architectures.
Headers and libraries are installed into standard locations (e.g. /usr/local or /Library).
2. Compiling You can compile from the terminal or configure Xcode normally:
Not available yet.
CRM64Pro abstracts the complexity of modern game loops into a flexible "Governor" pattern (Main::update). This allows developers to choose the synchronization strategy that best fits their game genre, from simple variable time-step loops to high-precision interpolated fixed-step systems.
The main application thread calls Main::update(), runs application logic, owns public GDK state and performs every render operation. Public methods are main-thread operations unless their documentation explicitly says otherwise. See Threading conventions for the API contract.
Internal work never changes that contract. Audio mixing and NetTCP socket I/O run independently, while particle workers run only during a synchronous ParticleMgr update batch. Scene layer state, object transforms, callbacks, resources and all GFX calls remain on the main thread.
Particle update rule:
Update standalone emitters throughParticleMgr::update(). Scene-owned emitters are updated automatically byScene::update(); do not update them separately throughParticleMgr. CallingParticleEmitter::update()directly remains the main-thread serial alternative for a deliberately unmanaged emitter. Every update call returns only after its worker jobs complete.
Game loop methodsFrom basic to professional approaches |
Timing values
Main exposes three timing values. They are intentionally separate because logic updates and rendering do not always run at the same rate:
| Method | Use it for | Fixed logic mode | Variable logic mode |
|---|---|---|---|
| Main::getLogicDeltaTime() | Game simulation, physics, AI, particles, Scene updates and playback advancement. | Returns the fixed logic step, exactly 1.0 / LFR, for every consumed logic update. | Returns the current frame delta. |
| Main::getInterpolationFactor() | Render-only interpolation between the previous and current logic state. | Returns the accumulator fraction in the [0.0, 1.0) range. | Returns 0.0. |
| Main::getDeltaTime() | Wall-clock frame elapsed time, profiling, diagnostics, or effects that intentionally depend on real frame time. | Returns the last engine-frame elapsed time; this is not the logic step. | Returns the current frame delta. |
Rule:
Use Main::getLogicDeltaTime() inside logic code. Use Main::getInterpolationFactor() only while rendering. Use Main::getDeltaTime() only when actual elapsed wall-clock frame time is required.
When the application calls Scene::update(), Scene reads Main::getLogicDeltaTime() internally, so Scene simulation speed is independent from render rate. Video playback is advanced by Main with the same logic delta. Sprite position interpolation uses Main::getInterpolationFactor() during rendering; Sprite animation timing remains internally managed by the Sprite module.
This is the classic "render-as-fast-as-possible" loop. Logic and Graphics updates occur sequentially in the same iteration. The "Main loop" will run at the maximum speed provided by the CPU.
Performance Note:
You can use CRM64Pro::ConfigMgr::setMTFriendly() to specify a minimum wait time (milliseconds) per frame. This yields execution control back to the operating system to avoid unnecessary 100% CPU usage.
Warning: Do not try to use this parameter for "time control" (e.g., setting it to 10ms to get 100fps). OS scheduling is not guaranteed; some iterations could take 10ms and others more, breaking the "smoothness" of the loop.
In this mode, logic runs at a guaranteed deterministic rate (e.g., 20 Hz), while rendering is scheduled independently on the main thread at the monitor's refresh rate (e.g., 144 Hz or VSync). This is scheduling, not a separate rendering thread.
Performance Note:
In this mode, the graphics logic runs without limit (max CPU/GPU speed). On fast systems, CRM64Pro::ConfigMgr::setMTFriendly() can still be used to yield execution back to the OS and avoid 100% CPU usage on unnecessary rendering frames.
This is the gold standard for action games. Logic runs at a fixed, low frequency (e.g., 20 or 30 Hz) for stability, but the Engine renders at maximum framerate by interpolating positions between the previous and current logic states.
Performance Note:
Using the callback function will produce a very smooth graphics output. This callback function can be changed dynamically or disabled using nullptr.
On fast systems, CRM64Pro::ConfigMgr::setMTFriendly() can still be used to avoid unnecessary 100% CPU usage.
Configuration systemBuilt-in launcher and customization |
CRM64Pro includes a built-in "Launcher" window (CRM64Pro::ConfigMgr::setup). This allows end-users to configure hardware settings (Resolution, Monitor, Audio Driver) before the engine initializes the full graphical context.
Key Features:
Workflow
Customization via XML
The launcher layout is data-driven. You can provide a custom XML file (e.g., setup.xml) to override the default look. This allows you to:
In the example above, the window title was changed to "Validation Setup", the 5th resolution option was hidden, and the logo was replaced.
The internal Master XML defines the structure. The element names cannot be modified, but their attributes can be overridden in your custom XML.
Attribute Reference
| Attribute | Description |
|---|---|
| state | 0 (Disabled/Shown), 1 (Enabled/Visible) or 5 (Disabled/Hidden). |
| name | The C64 Sprite resource name (e.g., for logo). |
| x, y | Widget position. Supports CRM64Pro::ePositionHelper. |
| value | The default value for the widget (Checkbox/Slider). |
| text | The label text displayed to the user. |
| action | Used for specific widgets to open a file or URL. |
Log of all notable changes made to CRM64Pro GDK including the date, version, and brief description:
View the Complete Changelog.