What Works Where: Desktop, Mobile and Web

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.

Where you can make each kind of program

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 makeWindows IDEMac IDELinux IDEOnline IDE
A Windows program (.exe)YesNoNoNo
A Mac application (.app)NoYesNoNo
A Linux programNoNoPartly: the IDE runs programs; to keep one, build it with blitzcc -o in Terminal, for the computer's own processorNo
An iPhone or iPad applicationNoYes: needs Xcode; also an App Store archive or a local IPANoNo
An Android application (.apk or .aab)NoYes: needs the Android SDK, NDK and a Java JDKNoNo
A web buildPartly: your own shaders are left outPartly: from Terminal, with blitzcc --target webNo: the Linux installation has no web runtimeYes: 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.

Language and tools

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
Extended languageYesYesYesYesYesYes
Original modeYes: in the Original edition, or with blitzcc --mode originalPartly: with blitzcc --mode original in TerminalPartly: with blitzcc --mode original in TerminalNoNoPartly: with blitzcc --mode original --target web
Debugger: breakpoints, stepping and variablesYesYesYesYes: a device must reach the Mac over the same networkPartly: DebugLog and errors with their file and line onlyPartly: 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 comparisonsYesYesYesPartly: the program can read a report with MemorySnapshot$Partly: the program can read a report with MemorySnapshot$Partly: in the online IDE
World EditorYesYesYesNoNoPartly: in the online IDE, without Maplet+
MCP support in the World Editor, for MCP clients such as Claude Code, Codex and CursorYes: b3dworldmcp.exe, set up from the IDE's Program menuNoYes: bin/b3dworldmcp, which needs Node.js 22 or newerNoNoNo
Editing a running program's world (DebugWorld)Yes: also from the debugger's toolbarYes: call DebugWorld in the programYes: call DebugWorld in the programNoNoNo

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.

Graphics

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).

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
Drawn withDirect3D 12MetalVulkan; programs with only 2D graphics draw in softwareMetalVulkanWebGPU
2D and 3D graphics, models, materials, shadows, terrain, particles and physicsYesYesYesYesYesYes
A window or full screenYes: full screen is a window that covers the screenYes: full screen uses the Mac's own full screenYes: full screen uses the desktop's own full screenPartly: always full screen, with other shapes letterboxedPartly: always full screen, with other shapes letterboxedPartly: in the page; a full-screen program asks the browser when the player first clicks
Your own shaders (.b3shader)YesYes: translated for MetalYes: translated when loaded, so a program you give away needs b3dshaderc beside itYes: translated for MetalYes: translated when the app is builtPartly: only in web builds made on a Mac or in the online IDE
MSAA and TAA anti-aliasingYesPartly: FXAA insteadPartly: FXAA insteadPartly: FXAA insteadPartly: FXAA insteadPartly: FXAA instead
Planar reflections, EntityHighlight, and the outline, reflection and motion-blur effectsYesNoNoNoNoNo
GPU particlesYesNoNoNoNoNo
Movies (OpenMovie)Partly: the picture only, without soundNoNoNoNoNo

Sound

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
WAV and Ogg sounds and music, and 3D soundYesYesYesYesYesYes: sound starts after the player's first click
MIDI musicYesYesNoNoNoNo
Audio effects: filters, reverb, echo, EQ and mixesYesNoNoNoNoNo

Input

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
Keyboard and mouseYesYes: Command reports the scan codes of the Windows keysYesPartly: the first touch acts as the mousePartly: the first touch acts as the mouseYes: the browser keeps some shortcuts, such as Ctrl+W, F5 and F11
Multi-touchNoNoNoYesYesPartly: on phones and tablets
AccelerometerNoNoNoYesYesNo
On-screen gamepads and keyboardsYes: clicked with the mouse, one control at a timeYes: clicked with the mouse, one control at a timeNoYesYesYes
Joysticks and gamepadsYesYesYesYesYesPartly: the Gamepad commands need a controller the browser maps as standard
Controller vibrationYesYesYesYesYesPartly: only where the browser supports it

Mobile Input and Virtual Controls and Controller Input explain these commands.

Windows, menus and dialogs

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
GUI windows, menus, gadgets and canvasesYesYes: the Mac's own controls, with menus in the menu barYes: GTK controls; on Wayland the desktop decides where windows goNoNoYes: windows are frames inside the page
Message boxes (Notify, Confirm, Proceed)YesYesYesYesYesYes
File requesters (RequestFile, RequestFiles, RequestDir)YesYesYesPartly: they return an empty string, as if cancelledNoPartly: 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 requestersYesYesYesNoNoYes
Native UI documents (LoadNativeUI)YesNoNoNoNoNo

Files and networking

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
Loading the program's own filesYesYes: they go inside the applicationYes: names match whatever their caseYes: they go inside the applicationYes: they go inside the applicationYes: they go inside the web build
Saving filesYesYesYesYes: in the app data folder; the program's own folder is part of the application and cannot be changedYes: in the app data folder, kept when the app is updatedPartly: kept in the browser for that site; clearing the site's data removes them
An app data folder (SystemProperty("datadir"))No: save beside the programYes: in Application SupportNo: save beside the programYes: in Application SupportYes: in the app's private filesNo
Web requests (HttpRequest)YesYesYesYesYesPartly: only to servers that allow requests from other sites, without cookies
TCP and UDP streamsYesYesYesYesYesNo
Shared World multiplayerYesYesYesYesNoYes
Classic network games (StartNetGame, SendNetMsg and the rest)YesNoNoNoNoNo
Starting programs and opening pages (ExecFile)YesPartly: opens a file or web address in its application, but runs no command linesYes: runs programs, and opens files and web addresses in their applicationsPartly: opens web addressesPartly: opens http, https and mailto addressesPartly: 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.

Mobile services

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.

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
Achievements and leaderboardsNoNoNoYes: Game CenterYes: Google Play GamesNo
Cloud savesNoNoNoYes: Game Center saved games, in iCloudYes: Google Play Games saved gamesNo
In-app purchases and subscriptionsNoNoNoYes: the App Store, checked by your own serverYes: Google Play, checked by your own serverNo
Haptics, sharing, review prompts and local notificationsNoNoNoYesYesNo
Integrity checks and verified linksNoNoNoYes: App Attest and Universal LinksYes: Play Integrity and App LinksNo

Advanced features

FeatureDesktopMobileWeb
WindowsMacLinuxiPhone and iPadAndroidBrowser
Background jobs (Worker Functions)YesYesYesYesYesPartly: 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)YesNoNoNoNoNo
VR headsetsPartly: experimental, through a PC OpenXR runtimeNoNoNoNoNo

When a feature is missing

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:

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

More about each platform

Back to Guides