Blitz3D+ programs use the same language and the same commands on every platform, so most programs run unchanged on a desktop computer, on a phone or tablet, and in a web browser. A few features depend on what a platform allows: a phone has no windows to open, and a web page cannot reach the computer's folders or start other programs. The tables below show what works where, so you can choose features that suit the platforms you want your program to reach.
In the tables, Yes means the feature works there, Partly means it works with the limits given, and No means it is missing. When a feature is missing explains what your program sees then.
The Original edition, for Windows 32-bit, runs programs in Original mode only. It makes Windows programs, and has none of the newer features in these tables.
Linux is the newest platform. It has been tested on Ubuntu 24.04, with software graphics and test devices; other distributions, graphics cards' own drivers, sound hardware and physical controllers have not been tried yet. A Linux program needs the libraries Ubuntu 24.04 has, such as GTK 4, WebKitGTK and libcurl, on the computer that runs it.
Each IDE runs programs on its own computer, and the Mac IDE also runs them on the iOS Simulator, an iPhone or iPad, and an Android device or emulator, choosing the one in its Run On menu.
| To make | Windows IDE | Mac IDE | Linux IDE | Online IDE |
|---|---|---|---|---|
| A Windows program (.exe) | Yes | No | No | No |
| A Mac application (.app) | No | Yes | No | No |
| A Linux program | No | No | Partly: the IDE runs programs; to keep one, build it with blitzcc -o in Terminal, for the computer's own processor | No |
| An iPhone or iPad application | No | Yes: needs Xcode; also an App Store archive or a local IPA | No | No |
| An Android application (.apk or .aab) | No | Yes: needs the Android SDK, NDK and a Java JDK | No | No |
| A web build | Partly: your own shaders are left out | Partly: from Terminal, with blitzcc --target web | No: the Linux installation has no web runtime | Yes: your own shaders are included while you are signed in |
Blitz3D+ on Mac and iOS and Android APK export explain how to set up each one.
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| Extended language | Yes | Yes | Yes | Yes | Yes | Yes |
| Original mode | Yes: in the Original edition, or with blitzcc --mode original | Partly: with blitzcc --mode original in Terminal | Partly: with blitzcc --mode original in Terminal | No | No | Partly: with blitzcc --mode original --target web |
| Debugger: breakpoints, stepping and variables | Yes | Yes | Yes | Yes: a device must reach the Mac over the same network | Partly: DebugLog and errors with their file and line only | Partly: in the online IDE, but not when the Windows IDE runs a program in the browser |
| Memory reports in the debugger: snapshots, a baseline and comparisons | Yes | Yes | Yes | Partly: the program can read a report with MemorySnapshot$ | Partly: the program can read a report with MemorySnapshot$ | Partly: in the online IDE |
| World Editor | Yes | Yes | Yes | No | No | Partly: in the online IDE, without Maplet+ |
| MCP support in the World Editor, for MCP clients such as Claude Code, Codex and Cursor | Yes: b3dworldmcp.exe, set up from the IDE's Program menu | No | Yes: bin/b3dworldmcp, which needs Node.js 22 or newer | No | No | No |
Editing a running program's world (DebugWorld) | Yes: also from the debugger's toolbar | Yes: call DebugWorld in the program | Yes: call DebugWorld in the program | No | No | No |
A memory report counts what the program has allocated, such as Type objects, strings, arrays, collections, banks and JSON, with their totals and peaks. Take one at the menu as a baseline, play and leave a level, and compare a second with it to see what is left behind. Reports can be saved as JSON, for bug reports and automated checks.
Every platform draws the same 2D and 3D graphics, models, animation, materials, lights, shadows, terrain, particles and physics. Windows has a few extra rendering features; elsewhere a program that uses them runs without those effects, or on Linux does not build (see When a feature is missing).
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| Drawn with | Direct3D 12 | Metal | Vulkan; programs with only 2D graphics draw in software | Metal | Vulkan | WebGPU |
| 2D and 3D graphics, models, materials, shadows, terrain, particles and physics | Yes | Yes | Yes | Yes | Yes | Yes |
| A window or full screen | Yes: full screen is a window that covers the screen | Yes: full screen uses the Mac's own full screen | Yes: full screen uses the desktop's own full screen | Partly: always full screen, with other shapes letterboxed | Partly: always full screen, with other shapes letterboxed | Partly: in the page; a full-screen program asks the browser when the player first clicks |
Your own shaders (.b3shader) | Yes | Yes: translated for Metal | Yes: translated when loaded, so a program you give away needs b3dshaderc beside it | Yes: translated for Metal | Yes: translated when the app is built | Partly: only in web builds made on a Mac or in the online IDE |
| MSAA and TAA anti-aliasing | Yes | Partly: FXAA instead | Partly: FXAA instead | Partly: FXAA instead | Partly: FXAA instead | Partly: FXAA instead |
Planar reflections, EntityHighlight, and the outline, reflection and motion-blur effects | Yes | No | No | No | No | No |
| GPU particles | Yes | No | No | No | No | No |
Movies (OpenMovie) | Partly: the picture only, without sound | No | No | No | No | No |
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| WAV and Ogg sounds and music, and 3D sound | Yes | Yes | Yes | Yes | Yes | Yes: sound starts after the player's first click |
| MIDI music | Yes | Yes | No | No | No | No |
| Audio effects: filters, reverb, echo, EQ and mixes | Yes | No | No | No | No | No |
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| Keyboard and mouse | Yes | Yes: Command reports the scan codes of the Windows keys | Yes | Partly: the first touch acts as the mouse | Partly: the first touch acts as the mouse | Yes: the browser keeps some shortcuts, such as Ctrl+W, F5 and F11 |
| Multi-touch | No | No | No | Yes | Yes | Partly: on phones and tablets |
| Accelerometer | No | No | No | Yes | Yes | No |
| On-screen gamepads and keyboards | Yes: clicked with the mouse, one control at a time | Yes: clicked with the mouse, one control at a time | No | Yes | Yes | Yes |
| Joysticks and gamepads | Yes | Yes | Yes | Yes | Yes | Partly: the Gamepad commands need a controller the browser maps as standard |
| Controller vibration | Yes | Yes | Yes | Yes | Yes | Partly: only where the browser supports it |
Mobile Input and Virtual Controls and Controller Input explain these commands.
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| GUI windows, menus, gadgets and canvases | Yes | Yes: the Mac's own controls, with menus in the menu bar | Yes: GTK controls; on Wayland the desktop decides where windows go | No | No | Yes: windows are frames inside the page |
Message boxes (Notify, Confirm, Proceed) | Yes | Yes | Yes | Yes | Yes | Yes |
File requesters (RequestFile, RequestFiles, RequestDir) | Yes | Yes | Yes | Partly: they return an empty string, as if cancelled | No | Partly: a dialog in the page over the program's own files, which can add files from the computer and download saved ones |
| Colour and font requesters | Yes | Yes | Yes | No | No | Yes |
Native UI documents (LoadNativeUI) | Yes | No | No | No | No | No |
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| Loading the program's own files | Yes | Yes: they go inside the application | Yes: names match whatever their case | Yes: they go inside the application | Yes: they go inside the application | Yes: they go inside the web build |
| Saving files | Yes | Yes | Yes | Yes: in the app data folder; the program's own folder is part of the application and cannot be changed | Yes: in the app data folder, kept when the app is updated | Partly: kept in the browser for that site; clearing the site's data removes them |
An app data folder (SystemProperty("datadir")) | No: save beside the program | Yes: in Application Support | No: save beside the program | Yes: in Application Support | Yes: in the app's private files | No |
Web requests (HttpRequest) | Yes | Yes | Yes | Yes | Yes | Partly: only to servers that allow requests from other sites, without cookies |
| TCP and UDP streams | Yes | Yes | Yes | Yes | Yes | No |
| Shared World multiplayer | Yes | Yes | Yes | Yes | No | Yes |
Classic network games (StartNetGame, SendNetMsg and the rest) | Yes | No | No | No | No | No |
Starting programs and opening pages (ExecFile) | Yes | Partly: opens a file or web address in its application, but runs no command lines | Yes: runs programs, and opens files and web addresses in their applications | Partly: opens web addresses | Partly: opens http, https and mailto addresses | Partly: opens http, https and mailto addresses in a new tab |
Where there is an app data folder, save there; on an iPhone or iPad it is the only folder where saved files are sure to be kept. Where SystemProperty("datadir") returns an empty string, save beside the program as before. Removing an app from a phone or tablet removes its folder too.
On an iPhone, iPad or Android device, a game can use the store's own services: Game Center on Apple's devices, and Google Play Games and Google Play Billing on Android. They need an app set up with each store, which App Setup in the Mac IDE's Create Executable dialog records for your program; Game Services explains how. They have not yet been tried against the real stores, so try them with your own store test accounts and devices before you release a game. On other platforms the same commands build, and report that the service is not available.
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| Achievements and leaderboards | No | No | No | Yes: Game Center | Yes: Google Play Games | No |
| Cloud saves | No | No | No | Yes: Game Center saved games, in iCloud | Yes: Google Play Games saved games | No |
| In-app purchases and subscriptions | No | No | No | Yes: the App Store, checked by your own server | Yes: Google Play, checked by your own server | No |
| Haptics, sharing, review prompts and local notifications | No | No | No | Yes | Yes | No |
| Integrity checks and verified links | No | No | No | Yes: App Attest and Universal Links | Yes: Play Integrity and App Links | No |
| Feature | Desktop | Mobile | Web | |||
|---|---|---|---|---|---|---|
| Windows | Mac | Linux | iPhone and iPad | Android | Browser | |
| Background jobs (Worker Functions) | Yes | Yes | Yes | Yes | Yes | Partly: jobs run one at a time between frames, so a job that runs until it is cancelled cannot work |
Userlibs (DLL functions declared in .decls files) | Yes | No | No | No | No | No |
| VR headsets | Partly: experimental, through a PC OpenXR runtime | No | No | No | No | No |
Some commands do not exist on a platform at all, and building for that platform stops with an error that names the command. These are:
EntityHighlight, GPU particle emitters, and the audio effects other than InitAudioEffects, which returns False;DebugWorld on phones, tablets and in the browser.Every other command builds on every platform, and where its feature is missing it says so when the program runs, so one program can run everywhere and work around what is missing. For example, PlayMusic returns 0 for a MIDI file where MIDI does not play, InitAudioEffects returns False where there are no audio effects, TouchAvailable returns False on Windows and the Mac, and GameServiceSupported returns False everywhere but on an iPhone, iPad or Android device. A program can try a MIDI tune and fall back to an Ogg recording of it:
music = PlayMusic("theme.mid")
If music = 0 Then music = PlayMusic("theme.ogg")
SystemProperty("os") names the platform the program runs on: "Windows", "macOS", "Linux", "iOS", "Android" or "Web". Use it to choose what suits each one, such as on-screen controls on a touch screen:
os$ = SystemProperty("os")
If os$ = "iOS" Or os$ = "Android"
Print "Running on a phone or tablet"
ElseIf os$ = "Web"
Print "Running in a browser"
Else
Print "Running on " + os$
EndIf