Defold 1.10.4 has been released

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.projectNative ExtensionsApp 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 {{build-timestamp}} 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 {{build-timestamp}} token’ by AGulev
New token {{build-timestamp}} 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
:warning: 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 Analyze your build with the APK Analyzer  |  Android Studio  |  Android Developers,
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

21 Likes


Can’t the grid size in gui be reduced?

It can be, but when you tried 0.1, the value was altered because of the camera zoom level. You need to zoom in to see the expected result. If you set something like x=0.1 and y=10 for example, the grid tiles would appear to be squared when you zoom out, to avoid showing a scene packed with lines. I understand that there are cons to this approach. The biggest issue is that in certain configurations, what you see might be unexpected until you zoom in.

5 Likes

Love the QoL improvements on the engine and 3D (#10884) improvements

2 Likes

This is why I love defold. Continuous improvement that is easy to upgrade to. No FOMO because you can’t upgrade to the latest build like many other engines do.

2 Likes

Awesome release with a lot of great things! Thank you!

4 Likes

I’ve added a skinning+instancing example here: GPU Skinning

8 Likes

Thanks for the new release! :heart:


There’s updated Docker images for CI builds: here.

5 Likes

These functions are missing auto-complete functionality in the editor.

Also, the page in the API reference for the font namespace is missing. https://defold.com/ref/stable/font/

This is all caused by the same problem, I think. The font namespace is missing a name in its metadata. So when you run all your automated scripts to generate the script_api and docs, the output is incorrect.

Thanks! I’ll fix in the next release.
Also, the font.font.add_glyphs()/font.remove_glyphs() was not quite what we needed, so I’ll replace those with a similar functionality in one of the upcoming release(s).

I’m fairly sure this started with this release. When I double click Gui/Nodes/Textures text to expand it, the previously open tab opens instead. If I double click the empty space after the text then it expands the “tree”.

1 Like

Thanks for the report. I am looking into it.

1 Like

In 1.10.4. An empty project exports an Android build. It’s 4MB (1.10.3 is 2MB). I know you’ve added some powerful features, but I hope you still consider the build size.

From the release notes:

8 Likes

Having issues building my project on this version (1.10.4). However my project on 1.10.3 builds fine

It sounds like you have a custom app manifest?
You could try to open it and enable/disable the “Profiler” option there?

1 Like

Thanks that fixed it. had to change ‘Profilerext’ to ‘ProfilerExt’

  arm64-osx:
    context:
      excludeLibs: [Profilerext] // CHANGE to ProfilerExt
      excludeSymbols: [ProfilerExt]
      symbols: []
      libs: [profilerext_null]
      frameworks: []
      linkFlags: []

EDIT: I misunderstood what you said… Totally missed the checkbox for profiler :sweat_smile: