Blog Posts
Blog Posts
2025-08-04

⇠ More posts

Defold release 1.10.4

By Björn Ritzl on Aug 04, 2025

Tagged as: Release notes


Defold 1.10.4

Important notes

Please pay attention that this version includes fixes which affect the app manifest.
If you use one in your project (check if it’s specified in game.project -> Native Extensions -> App Manifest), open it and reconfigure it again using the properties panel.

Summary

  • NEW: (#10627) Added core engine support for runtime generation of SDF fonts (by JCash)
  • NEW: (#8759,#10868) Improve callback invalidation (by AGulev)
  • NEW: (#10884) Added an option to not create game objects for the bones of a model (by britzl)
  • NEW: (#10915) Set size of pose matrix cache only once per frame if needed (by britzl)
  • NEW: (#6090) Added `` token (by AGulev)
  • NEW: (#10947) Moved GetAbsoluteIdentifier to dmSDK (by britzl)
  • NEW: (#10854) Bob performance optimizations for sequential builds (by AGulev)
  • NEW: (#10974) Allow debugging of macOS builds (by britzl)
  • NEW: (#8407,#6421,#6420) Make scene grid configurable (by sprocketc)
  • NEW: (#6685) Pull up or push down property overrides in the editor (by matgis)
  • NEW: (#10821) Fix unnecessary notifications for conflicting folders (by vlaaad)
  • NEW: (#10857) Enhance curve colors (by sprocketc)
  • NEW: (#10865) Fix layout restore on Linux (by sprocketc)
  • NEW: (#10235) Add scene context menu to editor scripts (by sprocketc)
  • NEW: (#10740,#9306) Edit node id in outline (by sprocketc)
  • NEW: (#10725) Allow users to cancel an ongoing build in the editor (by matgis)
  • NEW: (#10949) Added new LiveUpdate publisher mode “Folder” (by AGulev)
  • NEW: (#10739) Asset Picker optimizations (by matgis)
  • FIX: (#10980) Reworked profiler api to better support multiple imlpementations at once (by JCash)
  • FIX: (#8320,#4675) Fixed issue when using a resource from a library in custom custom_resources (by AGulev)
  • FIX: (#10897) Fix glitches on the first frame of the GPU-skinned instanced animation right after spawn. (by AGulev)
  • FIX: (#10910) Optimize Bone Matrix Texture Packing for Skinned Models (4x3 Matrix Storage, Memory & Bandwidth Savings) (by AGulev)
  • FIX: (#10771) Fix memory leak when using custom vertex attributes (by AGulev)
  • FIX: (#8767) Make sure the Windows bundle works when run via Proton (by AGulev)
  • FIX: (#10938) Improved the callstack generation for Windows crashes (by JCash)
  • FIX: (#10953) Added WebGPUGetInstance and WebGPUGetAdapter to dmsdk/graphics/graphics_webgpu.h (by JCash)
  • FIX: (#10958) Fixed a Windows-specific issue causing assertion failures with luaL_error-based functions (by AGulev)
  • FIX: (#10965) Faster LiveUpdate build (by AGulev)
  • FIX: (#10976) Change Android bundling process to be compatible with the new “Support 16 KB page sizes” requirement. (by AGulev)
  • FIX: (#10951) Fix crash when using invalid render target settings key (by britzl)
  • FIX: (#10957) Do not render mesh if it was deleted in the same frame as it was created (by britzl)
  • FIX: (#10987) Fix issue where the same image can’t be used more than once in a cubemap (by AGulev)
  • FIX: (#10989) Resolve dependencies faster when bundling using Bob (by AGulev)
  • FIX: (#10684) Add option to disable OpenGL ES 2.0 shader compilation (by vlaaad)
  • FIX: (#10918) Edit go files using editor scripts (by vlaaad)
  • FIX: (#10925) Edit collections using editor scripts (by vlaaad)
  • FIX: (#10932) Fix exceptions caused by changing file extensions during renames (by vlaaad)
  • FIX: (#10920) Split physics app manifest settings into 2D and 3D (by vlaaad)
  • FIX: (#10970) Filter out nil items from tree selection (by sprocketc)

Engine

NEW: (#8759,#10868) ‘Improve callback invalidation’ by AGulev Ensure that callbacks properly track whether they are still valid and avoid situations where the wrong callback could be accidentally destroyed under certain conditions.

NEW: (#10884) ‘Added an option to not create game objects for the bones of a model’ by britzl The model component now has an option to not create one game object per bone of a skeleton. When bone creation is disabled it is possible to have a high number of animated and skinned models in a scene (example with 15k models):

image

image

In addition to the above change the engine will now also warn if the bone pose matrix texture cache is too small so that the developer can take action and increase the max size in game.project (model.max_bone_matrix_texture_width and model.max_bone_matrix_texture_height).

NEW: (#10627) ‘Added core engine support for runtime generation of SDF fonts’ by JCash In this release we’ve added support for runtime generation of signed distance field fonts. The main benefits are smaller bundle size, and runtime memory footprint. The drawback is very slightly longer load times.

It is currently an opt-in, and you can enable it by setting the project variable font.runtime_generation. Our goal is to make this our default way of generating fonts, so we’d like our users to please test the this feature out and report any issues.

For the visual before/after comparisons, both the old and new distance field generators have artefacts, and we don’t see any real difference in improvement or degradation. They’re just different, which is expected for a single channel SDF implementation.

The font glyph can prewarm the glyph cache if you’ve deselected “All Characters” on your font, and specified a small subset of characters.

At runtime, you can also add/remove glyphs to the font dynamically by calling font.add_glyphs()/font.remove_glyphs()

You can read more about usage of runtime fonts in the font documentation.

NEW: (#10915) ‘Set size of pose matrix cache only once per frame if needed’ by britzl The pose matrix cache in rig.cpp was resized once per rig instance. This caused a big slowdown when a large number of instances were added in a single frame. The pose matrix size is now calculated once per frame and the cache itself is resized only once per frame if needed.

NEW: (#6090) __‘Added token'__ by AGulev New token added, which can be used in manifests or the index.html template.

NEW: (#10947) ‘Moved GetAbsoluteIdentifier to dmSDK’ by britzl Moved dmGameObject::GetAbsoluteIdentifier(HInstance instance, const char* identifier) to dmSDK. The function is used to get the absolute identifier relative to a game object instance. The returned identifier is the representation of the qualified name, i.e. the path from root-collection to the sub-collection which the instance belongs to.

NEW: (#10854) ‘Bob performance optimizations for sequential builds’ by AGulev This fix speeds up Bob.jar initialization, which is especially useful for sequential builds without many changes (e.g. Cmd+M to Build HTML5 from the editor, or bundling).

  • About 4 times faster initialization. In the test setup, it’s 400 ms vs 1600 ms (for a project with a large file count, it’s 3.5 s vs 20 s)
  • Speed-up of the task creation stage for a small project in the test setup: 900 ms vs 2000 ms (for a large project, about 5%)

NEW: (#10974) ‘Allow debugging of macOS builds’ by britzl This change adds the com.apple.security.get-task-allow entitlement to debug versions of macOS bundles to allow debugging using Xcode Instruments.

FIX: (#10980) ‘Reworked profiler api to better support multiple imlpementations at once’ by JCash We have updated our profiling backend to support multiple listeners. The listeners are implemented using extensions, allowing users to add their own profiler (see extension-profile-counters).

  • The “basic” one, that shows in game profiling, is included on all platforms.
  • For desktop and mobile platforms, you also have Remotery support.
  • For HTML5, we’ve added a new profiler listener, using the web Performance api. To minimize the overhead on HTML5, the Performance API profiler is disabled by default. Enable it with the project setting html5.performance_timeline_enabled = 1

How to use the HTML5 Performance profiler

  1. Enable the html5.performance_timeline_enabled option in the game.project
  2. Launch the Developer Tools in Chrome. (CMD+Shift+I on macOS)
  3. Under the Performance tab, press the Record button. (CMD+E on macOS)
  4. Stop the recording, and it will display the frame profile data in the view.

Start the recording… Screenshot 2025-07-18 at 14 35 52

Stop the recording… Screenshot 2025-07-18 at 14 38 05

The recording is displayed: Screenshot 2025-07-18 at 14 38 11

Zoom into the recording, to inspect the timing values: Screenshot 2025-07-18 at 14 38 54

Migration

For most users, who don’t use custom app manifests or have disabled/enabled the profiler.

For the more technical users, if you have a custom app manifest, you may need to update your manifest as we have updated the profiler libraries.

Simplest way to update is to create an empty appmanifest, disable profiler in that appmanifest, and then compare with your own custom one for any discrepancies. All libraries and symbols should have the name “profile”, so should be easy to find.

Here is a list of the relevant libraries and symbols, and which platform they’re targeting:

  • all platforms:
    • profilerext - library containing symbols:
      • ProfilerExt - the profile.*Lua module
      • ProfilerBasic - the in game profiler view
  • desktop + mobile:
    • profiler_remotery
      • ProfilerRemotery - containing the Remotery profiler
  • html5
    • profiler_js - profiler using the Web Performance API
      • symbol:ProfilerJS

Note: the remotery library has been removed. That functionality is now contained within profiler_remotery.

FIX: (#8320,#4675) ‘Fixed issue when using a resource from a library in custom custom_resources by AGulev Now using a directory or a resource from a library (connected as a dependency) is possible not only in the editor, but also when bundling.

FIX: (#10897) ‘Fix glitches on the first frame of the GPU-skinned instanced animation right after spawn.’ by AGulev It also increases performance for GPU-skinned instanced animation by about 30–50%, depending on the platform and the specific case.

FIX: (#10910) ‘Optimize Bone Matrix Texture Packing for Skinned Models (4x3 Matrix Storage, Memory & Bandwidth Savings)’ by AGulev Improved performance and reduced memory usage for skinned models: The engine now uses a more efficient way to store bone matrices for animated models, reducing the required memory and GPU bandwidth by 25%. This can result in better performance (10-15%), especially when using many animated characters.

FIX: (#10771) ‘Fix memory leak when using custom vertex attributes’ by AGulev

FIX: (#8767) ‘Make sure the Windows bundle works when run via Proton’ by AGulev Fixed an issue where running a Windows project bundle on Linux via Proton would close with Could not find gl function 'glGenPrograms'.

FIX: (#10938) ‘Improved the callstack generation for Windows crashes’ by JCash Fixed a double crash during callstack writing that messed up the text representation of the crash.

FIX: (#10953) ‘Added WebGPUGetInstance and WebGPUGetAdapter to dmsdk/graphics/graphics_webgpu.h’ by JCash This allows for easier checking of the GPU capabilities at runtime.

FIX: (#10958) ‘Fixed a Windows-specific issue causing assertion failures with luaL_error-based functions’ by AGulev Fixed an issue where functions like CheckVector3, CheckHashOrString, etc., that use luaL_error or similar functions may behave differently when used in extensions and compiled on Windows.
In combination with DM_LUA_STACK_CHECK, this could result in an assertion failure.

FIX: (#10965) ‘Faster LiveUpdate build’ by AGulev Use multithreaded setup when creating the LiveUpdate archive to speed up the build.
It speeds up LiveUpdate archive creation by about 50%.

FIX: (#10976) ‘Change Android bundling process to be compatible with the new “Support 16 KB page sizes” requirement.’ by AGulev ⚠️ This fix changes the default for android.extract_native_libs to false, which is a requirement for API 35.
It will increase your AAB/APK size, but according to https://developer.android.com/studio/debug/apk-analyzer,
it doesn’t affect the download size from the Play Store, because it uses its own compression: CleanShot 2025-07-18 at 15 26 17@2x

FIX: (#10951) ‘Fix crash when using invalid render target settings key’ by britzl The engine would crash with an unbalanced Lua stack if an invalid key was used when creating a render target.

FIX: (#10957) ‘Do not render mesh if it was deleted in the same frame as it was created’ by britzl If a mesh component is created and then deleted in the same frame (for instance by calling go.delete() in init()) it should not be rendered.

FIX: (#10987) ‘Fix issue where the same image can’t be used more than once in a cubemap’ by AGulev Fixed issue where attempting to bundle a project with a cubemap that uses the same image more than once resulted in a null pointer exception.

FIX: (#10989) ‘Resolve dependencies faster when bundling using Bob’ by AGulev With this change, Bob uses two threads to resolve dependencies. Two simultaneous connections to a remote server will not be treated as “Too many requests” but will double the speed of dependency resolution (it depends on the connection, but even when all the dependencies are in the cache, cache checking goes twice as fast).

Editor

NEW: (#8407,#6421,#6420) ‘Make scene grid configurable’ by sprocketc customizable-grid

The grid toggle was moved from the visibility dropdown, at the top level of the scene toolbar. A dedicated grid options dropdown was added next to the toggle, to allow users to configure the size per axis, the visibility plane, the color, and the opacity, on a project by project basis. A default keyboard shortcut (Ctrl+G) that toggles the grid was also introduced.

NEW: (#6685) ‘Pull up or push down property overrides in the editor’ by matgis

  • The Clear Override button next to an overridden property in the Properties View has been moved into a dropdown menu available by clicking on the property label.
  • You can now pull up property overrides to ancestors, or push down overrides to descendants in the editor. These commands are available from the property label dropdown menu, or from the context menu when right-clicking on an overridden object in the Outline View.
  • Pull Up and Push Down Overrides buttons have been added to the Search Results view that appears when Show Overrides… is selected for an object or property.
  • Fixed various small positioning and size issues around controls used in the Properties View.

NEW: (#10821) ‘Fix unnecessary notifications for conflicting folders’ by vlaaad

NEW: (#10857) ‘Enhance curve colors’ by sprocketc

NEW: (#10865) ‘Fix layout restore on Linux’ by sprocketc

NEW: (#10235) ‘Add scene context menu to editor scripts’ by sprocketc

NEW: (#10740,#9306) ‘Edit node id in outline’ by sprocketc rename-id

Node ids can be edited in place on the outline tree, by pressing F2 or with a delayed double click. The keyboard shortcut is customizable.

NEW: (#10725) ‘Allow users to cancel an ongoing build in the editor’ by matgis You can now cancel the build process in the editor by clicking the Stop button next to the progress indicator in the status bar.

NEW: (#10949) ‘Added new LiveUpdate publisher mode “Folder”‘ by AGulev Added new LiveUpdate publisher mode “Folder” and settings for this mode.
This mode may be useful in case you need to post-process files before upload and plan to pack them into an archive yourself.

NEW: (#10739) ‘Asset Picker optimizations’ by matgis Shortened the time it takes before you see the results when filtering in the Asset Picker.

FIX: (#10684) ‘Add option to disable OpenGL ES 2.0 shader compilation’ by vlaaad New game.project property shader.exclude_gles_sm100 allows skipping shader compilation to OpenGL ES 2.0 / WebGL 1.0 (GLES SM100) language.

FIX: (#10918) ‘Edit go files using editor scripts’ by vlaaad It’s now possible to edit components of a game object file using editor scripts. The components come in 2 flavors: referenced and embedded. Referenced components use type reference and act as references to other resources, only allowing overrides of go properties defined in scripts. Embedded components use types like sprite, label, etc., and allow editing of all properties defined in the component type, as well as adding sub-components like shapes of collision objects. For example, you can use the following code to set up a game object:

editor.transact({
    editor.tx.add("/npc.go", "components", {
        type = "sprite",
        id = "view"
    }),
    editor.tx.add("/npc.go", "components", {
        type = "collisionobject",
        id = "collision",
        shapes = {
            {
                type = "shape-type-box",
                dimensions = {32, 32, 32}
            }
        }
    }),
    editor.tx.add("/npc.go", "components", {
        type = "reference",
        path = "/npc.script"
        id = "controller",
        __hp = 100 -- set a go property defined in the script
    })
})

###

FIX: (#10925) ‘Edit collections using editor scripts’ by vlaaad Now it’s possible to edit collections using editor scripts. You can add game objects (embedded or referenced) and collections (referenced). For example:

local coll = "/char.collection"
editor.transact({
    editor.tx.add(coll, "children", {
        -- embbedded game object
        type = "go",
        id = "root",
        children = {
            {
                -- referenced game object
                type = "go-reference",
                path = "/char-view.go"
                id = "view"
            },
            {
                -- referenced collection
                type = "collection-reference",
                path = "/body-attachments.collection"
                id = "attachments"
            }
        },
        -- embedded gos can also have components
        components = {
            {
                type = "collisionobject",
                id = "collision",
                shapes = {
                    {type = "shape-type-box", dimensions = {2.5, 2.5, 2.5}}
                }
            },
            {
                type = "component-reference",
                id = "controller",
                path = "/char.script",
                __hp = 100 -- set a go property defined in the script
            }
        }
    })
})

FIX: (#10932) ‘Fix exceptions caused by changing file extensions during renames’ by vlaaad

FIX: (#10920) ‘Split physics app manifest settings into 2D and 3D’ by vlaaad

FIX: (#10970) ‘Filter out nil items from tree selection’ by sprocketc