Releases / v0.98.0
v0.98.0 Stays Smooth
2026-09-26 Latest
Exported games with animated characters run for as long as you play them, models load without stopping the game, and a settings screen can reach the effects players most often want turned off.
Exported games keep running
A game with animated characters (first-person arms, animated enemies) slowed down steadily as an export, then stopped drawing parts of the level and closed after a minute or two. Play in the editor was unaffected, so it only showed up in builds. Exported games now run as smoothly at the hour mark as at the start.
Two more things reach exported games now. The project's vsync setting and
app.setVsync apply; a build used to keep vsync on whatever they said. And a
game that crashes writes crash.txt into its save folder, beside its save.*
files, saying what went wrong. On Windows, where a game has no console, that
file is the only record of a crash.
Models load without freezing the game
Giving a node a model with node.model, or spawning a prefab that brings one,
loaded the model on the spot, and spawning several at once could freeze the
game for a moment. Models now load in the background: the game keeps running,
and the node appears as soon as its model is in. Loading is faster too, since
a model's textures are now decoded once instead of twice.
When a model has to be there on the very frame it is used, the parts of a ragdoll for example, load it earlier, on a menu or a loading screen:
assets.preload({ "models/arm.glb", "models/leg.glb" }, function(failed)
-- every model is in; `failed` lists any that could not load
end)
perf.ms("models") shows how much of a frame loading models takes.
A settings screen that turns off what players ask for
getComponent("PostProcess") now reads and writes chromatic aberration, lens
distortion and film grain (aberration, distortion, grain; 0 is off), and
the whole colour grade: exposure, contrast, saturation, temperature,
tint, lift, gradeGamma and gain. Setting the grade back to neutral is
0 for the first four and 1 for the rest.
Dragging a slider fires onChanged (and ui.changed) on every frame its value
moves, with the new value already on the slider. It never fired before, so a
volume slider moved but saved nothing. A slider also stays where the player
dragged it when the screen redraws, while a Reset button that changes the
value still moves it.
ui.make builds a list with no items as an empty element instead of raising
an error, so a leaderboard or a replay list with nothing in it yet needs no
special case.
The signed-in player is there from the first frame
account.state() finds a player who signed in, in your game or in the Hub, the
first time you ask, in any scene, without a network call. While it looks it
answers "starting" rather than "signedOut", so a Sign in button shown
only to signed-out players never flashes at somebody who is signed in.
Ambient occlusion leaves the distance alone
Screen-space ambient occlusion laid dark patches over faraway ground that shimmered as the camera moved, and showed through fog. It now fades out with distance and with fog. Contact shadows up close look the same as before.
Smaller fixes
- A body teleported by another script calling its function (a Restart
button, say) reads its new position from
node.tickPoson the very next physics step, including whilephysics.pauseis on. It could read the old spot for a step or two, long enough for a check there to fire. floptle shotandfloptle runuse the project's UI style sheets, so a headless screenshot shows menus as the game does. A sheet with an error in it is reported byfloptle run.
Upgrading
Nothing to do. A node given a model mid-game now draws nothing for the few
frames the model takes to load; if that shows, preload the model. If you were
loading models yourself on a menu to avoid a freeze, assets.preload does the
same and tells you when it is done.
Floptle Hub
Engine
The binaries are not signed yet. On macOS, right-click the app and pick Open the first time. On Windows, if SmartScreen appears, pick More info then Run anyway.