Frequently Asked Questions
CNA is the project name. It reflects the C++ nature of the reimplementation and draws on the XNA lineage. It is not an official acronym — think of it as "C++ native approach to XNA" or simply the project identifier for this open-source effort.
No. CNA is a work in progress. XNA 4.0 API coverage is partial, not all backends are complete, and the project has not been validated for production game development. It is suitable for experimentation, engine research, and open-source contribution. Use it to explore the concepts, but do not ship production games with it at this stage.
FNA is an excellent managed C# reimplementation of XNA 4.0. It targets the .NET runtime, is binary-compatible with XNA 4.0, and is used commercially. CNA is a completely separate, C++-only project. It does not provide C# bindings. It targets engineers who need or want native C++ — no managed runtime, no garbage collector. CNA shares the Ms-PL licence with FNA and draws on it as a reference, but the two projects are independent and serve different ecosystems.
MonoGame is a cross-platform C# successor to XNA used commercially to ship games. It is mature, production-tested, and C#-based. CNA is a C++ project with a different target audience — engineers building in C++ who want an XNA-style framework without a managed runtime. Both MonoGame and FNA are better choices if you want to build games in C# today. CNA is for the C++ ecosystem specifically.
Several reasons:
- No managed runtime: C++ avoids garbage collection pauses, managed heap overhead, and JIT warmup. Useful for performance-critical or embedded scenarios.
- Toolchain flexibility: C++ integrates naturally with any C or C++ codebase, LLVM toolchains, console SDKs, and embedded targets that may not support .NET.
- Engine foundation: CNA is the intended runtime base for Nova-3D, which requires the control that only native code provides.
- API preservation: The XNA programming model is genuinely good design. Preserving it in C++ gives the XNA conceptual clarity to the C++ ecosystem.
No. CNA is an independent open-source project with no affiliation with or endorsement by Microsoft Corporation. XNA is referenced as the compatibility target and API inspiration only. XNA is a trademark of Microsoft. CNA does not use any Microsoft or XNA branding assets.
CNA is licensed under the Microsoft Public License (Ms-PL). This is the same licence used by FNA, reflecting that portions of CNA draw on FNA as a reference. The Ms-PL is a permissive open-source licence. See the LICENSE file for the full terms.
For getting started: SDL_RENDERER. It is the most portable and simplest backend. For Linux with custom shader work: EASYGL. For multi-API portability once it is complete: BGFX. The Vulkan backend is a scaffold and not usable yet. See Rendering Backends for a full comparison.
Not yet. Android and Emscripten (WebAssembly) are planned Phase 2 milestones. SDL3 supports both platforms, making them architecturally feasible. Follow the Roadmap for progress updates.
CNA is open source under Ms-PL. The most valuable contributions at this stage are:
- Implementing missing XNA API classes (see XNA Compatibility for the list)
- Improving backend feature parity (bgfx, Vulkan)
- Writing tests for existing implementation
- Testing on Windows, Android, or Emscripten
- Porting games to CNA to expose API gaps
Nova-3D is a higher-level, opinionated 3D engine that is planned to use CNA as its internal runtime and rendering abstraction layer. Nova-3D development is downstream of CNA — it will not begin in earnest until CNA reaches a stable, broadly-tested state. Think of CNA as the "engine below the engine" for Nova-3D.
sharp-runtime is a utility and runtime support library that CNA's internals depend on. It provides primitives that CNA uses internally but does not expose to the game-facing API layer. It must be cloned as a sibling directory to CNA before building. It has no external dependencies and builds cleanly on all supported platforms.
CNA was designed from the start with SDL3, which is the active development branch of SDL. SDL3 brings API cleanups, improved mobile support, and a more consistent cross-platform experience compared to SDL2. Since CNA is a new project rather than a port, it was natural to start with the latest stable version of SDL.