Shipping a game¶
A SimVX game reaches players by three routes. None of them is a fallback for the others: pick the one that matches your audience.
Route |
What the player gets |
Install burden |
|---|---|---|
Source and wheel |
|
Needs Python |
Standalone executable |
A folder (or one file) they double-click |
None |
Web export |
A URL |
None; also the mobile answer |
Web export is covered in its own page, Web Export. This page covers the other two.
Source and wheel¶
Build a wheel for your game, publish it, and a player with Python installs it like any other package:
uv build --wheel
pip install dist/your_game-1.0.0-py3-none-any.whl
your-game
This is the path with the least that can go wrong, because nothing repackages your dependencies: numpy, the Vulkan loader and the engine’s native extensions are installed by pip exactly as their authors built them.
Standalone executable¶
For players who will not install Python. The editor’s Export dialog offers a Standalone
Executable target, and simvx uses PyInstaller underneath.
The engine has native pieces that a bundler has to carry: numpy, the Vulkan loader, and the shared
libraries of the audio, texture and Jolt physics accelerators. It also loads shaders, fonts and
default assets through importlib.resources, which a bundler cannot see by reading import
statements, so a bundler invoked with no options produces a binary that dies on its first frame with ModuleNotFoundError: No module named 'simvx.graphics.shaders'.
So the collection flags are not optional:
pyinstaller --collect-all simvx --collect-all vulkan --collect-all glfw --collect-all freetype \
--hidden-import miniaudio --hidden-import _cffi_backend \
game.py
Most of a one-directory build is numpy, Pillow and the engine’s own assets. It starts about as fast as running the game from a virtualenv, because the engine’s Vulkan setup dominates.
--onefile produces a smaller file, at the cost of unpacking into a temporary directory on every
launch, which adds to each start. Ship one-directory unless the single file matters to you.
One-directory writes a folder named after your game, with the executable inside it next to an
_internal/ directory. dist/mygame/mygame is the thing you run; dist/mygame/ is the thing you
ship, and it must be shipped whole.
A bundle is host-only. PyInstaller does not cross-compile, so a Windows .exe is built on Windows
and a macOS app on macOS.
A bundle does not hide your code¶
The engine ships as readable .py files under _internal/simvx/. Your own modules are
byte-compiled into the executable, which anyone can read back with the standard library (marshal,
dis): strings, constants and the full logic. Do not ship secrets in a bundle. If your business
depends on an opaque client, SimVX does not provide one.
Mobile¶
Play the web export in a mobile browser. That is the supported mobile path today: touch input is captured and the WebGPU renderer runs on current mobile browsers.
The editor’s Export dialog also lists an Android APK target. It runs android/build.sh, which only
a source checkout provides, so it is not available from a pip install.