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.
custom_resources
(by AGulev)luaL_error
-based functions (by AGulev)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):
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).
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).
html5.performance_timeline_enabled = 1
html5.performance_timeline_enabled
option in the game.project
Developer Tools
in Chrome. (CMD+Shift+I on macOS)Performance
tab, press the Record
button. (CMD+E on macOS)Start the recording…
Stop the recording…
The recording is displayed:
Zoom into the recording, to inspect the timing values:
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:
profilerext
- library containing symbols:
ProfilerExt
- the profile.*
Lua moduleProfilerBasic
- the in game profiler viewProfilerRemotery
- containing the Remotery
profilerhtml5
profiler_js
- profiler using the Web Performance API
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:
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).
NEW: (#8407,#6421,#6420) ‘Make scene grid configurable’ by sprocketc
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
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
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