A cross-platform game engine built from scratch — Metal backend for iOS/macOS, Vulkan backend for Android.
Written in C++23 with no exceptions, no RTTI, and no engine hiding the details from you.
10,000 animated sprites rendered at 60fps using the engine's sprite batch. Tests draw-call sorting, vertex throughput, and fill rate.
Production-style entry point with UI, particle effects, camera shake, tweening, save data, and touch/mouse hit-testing.
Interactive shader playground with 18+ material modes, hot-reload from .msl files, and on-screen navigation.
Controls: 1-9, C, P, G, Y, S, X, A, F, W switch modes; Q/E or on-screen < PREV / NEXT > cycle pages; R reloads the current lab .msl file.
Widget showcase with 18 pages, live-tune knobs, modal dialogs, and keyboard shortcuts.
Controls: D1-D9, T, A, L, S, G, V, C, O, P switch pages; [Prev]/[Next] buttons or Q/E cycle pages; B toggles button border; Space pauses animations; R rebuilds the current page.
- Renderer abstraction — Metal (iOS/macOS) and Vulkan (Android) behind a unified RHI
- Sokol-style architecture —
markmos_main()as the single cross-platform entry point - Audio via miniaudio
- Memory via rpmalloc
- Job system for multithreaded tasks
- Sprite batching with draw call sorting
- C++23 — no exceptions, no RTTI, no unnecessary abstractions
cd engine
./build-ios.sh./build-ios-sim.shcd engine
./build-android.sh # debug APK
CONFIG=Release ./build-android.sh # release APKengine/
├── core/ # Memory, VFS, job system, utilities
├── render/ # Renderer, shaders, sprite batch
├── rhi/ # Metal/Vulkan backends
├── app/ # Platform entry points (iOS, Android, macOS)
├── thirdparty/ # rpmalloc, miniaudio, simdjson, stb, metal-cpp, VMA
├── shaders/ # GLSL sources (Vulkan)
└── entry/ # Game entry point
MIT







































