Unreal Engine Changelog

What's new in Unreal Engine 5.4

May 14, 2024
  • Animation:
  • Automatic Retargeting makes it easier to get great results when reusing bipedal character animations. There are also extensions to the Skeletal Editor and a suite of new deformer functions to make the Deformer Graph more accessible.
  • New Gizmos, reorganized Anim Details, upgrades and improvements to the Constraints system, and a new Layered Control Rigs feature make our animation authoring tools more robust and intuitive.
  • Unreal Engine’s nonlinear animation editor Sequencer received a significant makeover, with better readability and improved usability in several aspects of the Sequencer Tree. Among other new features in this release, we’ve also added Keyframe Scriptability.
  • Motion Matching, an expandable next-gen framework for animation features, is Production-Ready. We’ve focused on making the toolset robust, performant, and memory-scalable, as well as adding a suite of debugging tools.
  • Choosers, a much-requested tool that enables you to use game context to drive animation selection.
  • Rendering:
  • UE5’s virtualized micropolygon geometry system Nanite continues to receive enhancements, such as an Experimental new Tessellation feature that enables fine details such as cracks and bumps to be added at render time, without altering the original mesh.
  • Moreover, the addition of software variable rate shading (VRS) via Nanite compute materials brings substantial performance gains. There’s also support for spline mesh workflows—great for creating roads on landscapes, for example.
  • In this release, Temporal Super Resolution (TSR) has received stability and performance enhancements to ensure a predictable output regardless of the target platform.
  • AI and machine learning:
  • The Neural Network Engine (NNE) moves from Experimental to Beta. With support for both in-editor and runtime applications, NNE enables developers to load and efficiently run their pre-trained neural network models.
  • Developer iteration:
  • Unreal Cloud DDC is a self-hosted cloud storage system for Unreal Engine Derived Data Cache (DDC). Designed for distributed users and teams, it enables them to efficiently share Unreal Engine cached data across public network connections.
  • Our local DDC now uses a new Unreal Zen Storage server architecture, offering improved data conditioning performance; faster editor load times and Play In Editor (PIE) workflows; and greater control over cache writes, eviction, and data deduplication.
  • Now Production-Ready, Multi-Process Cook enables developers converting content from the internal UE format to a platform-specific format to leverage additional CPU and memory resources, significantly reducing the time it takes to get a cooked output.
  • In Beta, Unreal Build Accelerator (UBA) is a scalable distributed compilation solution for C++. It is used in conjunction with Unreal Build Tool and/or Unreal Horde’s Remote Execution (compute task) system to accelerate build compilation time.
  • Media and entertainment:
  • Virtual Camera is Production-Ready. It adds Android support and Virtual Camera workflows are fully supported on macOS. The mobile application has been renamed Unreal VCam, and can be found on the Apple Store 134 and Google Play 223.
  • For ICVFX, a Depth of Field Compensation feature means you can accurately control the amount of DOF falloff of the digital content rendered by nDisplay as seen by the movie camera, yielding better results for close-up beauty shots.
  • Multi-Process Inner Frustum, enables the render of what’s seen by the movie camera to be split across more GPUs and hardware resources, alongside numerous stability improvements and other enhancements to our SMPTE 2110 support—which is moving closer to Production-Ready status.
  • Cloth simulation:
  • It’s now possible to import a garment—including simulation parameters—Marvelous Designer or CLO using a new USD Importer in the Panel Cloth Editor.
  • Experimental Features:
  • Please try them out and send us your feedback 10, but keep in mind these features are still under heavy development and we don’t recommend using them in your final projects just yet.
  • Build animation rigs from straightforward modular parts with Modular Control Rig, which utilizes the entire framework of Control Rig for creating rigs that are ready to be animated on any skeleton instantly.
  • Motion Design mode is equipped with specialized tools for authoring complex 2D motion graphics, offering a comprehensive suite of tools, including 3D cloners, effectors, modifiers, animators, and more.
  • Movie Render Queue received a major update with the Experimental Movie Render Graph (MRG), a node-based architecture that enables users to set up graphs to render a single shot, or design them to scale out across complex multi-shot workflows for large teams of artists.
  • On the VR Scouting front, try the Experimental fully customizable toolkit that utilizes XR Creative Framework to support OpenXR HMDs—such as Oculus and Valve Index—offering a dramatically improved user experience over the existing Virtual Scouting toolkit.
  • Experimental ray tracing support for Vulkan on Linux is now available.

New in Unreal Engine 5.3 (Sep 6, 2023)

  • Rendering:
  • Refinements to core UE5 features:
  • With this release, Nanite improvements include faster performance for masked materials and the ability to represent a greater range of surfaces, while Lumen with Hardware Ray Tracing now supports multiple reflection bounces and offers faster performance on consoles. VSM, TSR, Hair Grooms, Path Tracing, and Substrate all also see advancements.
  • Cinematic-quality volumetric rendering (experimental):
  • Two new Experimental features, Sparse Volume Textures (SVT) and Path Tracing of Heterogeneous Volumes, introduce a number of new capabilities for offline-quality rendering of volumetric effects such as smoke and fire.
  • Orthographic rendering (experimental):
  • Orthographic rendering is now supported as an Experimental feature, both for linear output and in the Unreal Editor. This technique helps creators in the architecture and manufacturing space to visualize their projects, as well as offering a distinctive stylistic camera choice for games.
  • Multi-Process Cook
  • Multi-Process Cook enables developers to leverage additional CPU and memory resources when converting content from the internal UE format to a platform-specific format, significantly reducing the time it takes to get a cooked output from a build farm server or on a local workstation.
  • Animation and simulation:
  • Skeletal Editor (experimental):
  • This release introduces a new Experimental Skeletal Editor, providing animators with a variety of tools for working with Skeletal Meshes, including the ability to paint skin weights. Whether for quick prototypes or final rigging, this enables you to perform more character workflows entirely in the Unreal Editor without the need for round-tripping to DCC applications—so you can work in context and iterate faster.
  • Panel-based Chaos Cloth with ML simulation (experimental):
  • We’ve introduced a new Panel Cloth Editor and new skin weight transfer algorithms, and added XPBD constraints as a basis for our future cloth generation in engine. This provides for a non-destructive cloth simulation workflow in which you can trade off speed for precision, as well as getting better-looking simulations. Cloth can also now be simulated and cached in engine using the new Panel Cloth Editor in conjunction with the ML Deformer Editor.
  • Virtual production:
  • nDisplay support for SMPTE ST 2110 (experimental):
  • In preparation for the future of LED production, we’ve added Experimental support to nDisplay for SMPTE ST 2110, utilizing NVIDIA hardware and Rivermax SDK. This opens up a range of new hardware configuration possibilities for LED stages, including a dedicated machine for each camera frustum.
  • Cine Cam Rig Rail:
  • We’ve added a new Cine Cam Rig Rail Actor that provides more refined controls than the existing Rig Rail, including the ability to choreograph settings like camera rotation, focal length, and focus distance. This enables filmmakers to emulate the workflow and results of traditional camera movement along tracks or on dollies.
  • VCam enhancements:
  • We’ve made a number of enhancements to the VCam system, including the ability to review takes directly on the iPad for faster iteration; to simultaneously stream different VCam output for different team members facilitating collaborative VCam shoots; and to record at a slower frame rate and play back at normal speed for easier capture of fast-moving action.

New in Unreal Engine 5.2 Preview (Apr 13, 2023)

  • Procedural Content Generation Framework:
  • The new in-editor and runtime Procedural Content Generation Framework (PCG) enables you to define rules and parameters to populate large scenes with UE assets of your choice, making the process of large world creation fast and efficient.
  • Substrate:
  • Substrate is a new way of authoring materials that give Unreal Engine users more control over the look and feel of objects used in real-time applications such as games and linear content creation.
  • VP improvements:
  • Unreal Engine 5.2 Preview offers multiple improvements to virtual production workflows through new shot creation and scene control tools. For example: shooting with multiple VCams is now possible, giving filmmakers more creative power.
  • Apple Silicon support:
  • The Universal Binary of Unreal Engine that natively supports both Apple Silicon and Intel CPUs to the Unreal Editor is now available to download from the Epic Games launcher.

New in Unreal Engine 5.0.0 (May 3, 2022)

  • AI:
  • Improvement:
  • Added the option to ignore actors that do not implement the IGameplayTagAssetInterface when performing an EQS query with EnvQueryTest_GameplayTags. These ignored actors will not be included in the filter or score operations.
  • Added an option to EnvQueryGenerator_PerceivedActors to control whether all actors known to the AIPerceptionComponent will be gathered or only the ones actively being perceived.
  • Bug Fix:
  • Fixed an issue where an EQS query instance was using an incorrect EQS query asset that had the same name as the intended asset. This resulted in the query using an asset with an incorrect location.
  • Added an additional check to the Environment Query Manager to check for a valid Blackboard component if the dynamic parameter is configured to read from a blackboard.
  • Fixed an issue where running an EQS query that resulted in all items being filtered out was sometimes flagged as successful.
  • Fixed an issue where EQS contexts created in Blueprints could sometimes retrieve null actors or invalid locations via the ProvideContext call.
  • Behavior Tree:
  • New:
  • When using the Behavior Tree interface to create a new Task / Behavior / Service asset, the user can now choose the location and filename of the new asset, instead of having to rename the auto-generated one after creation.
  • Added a new parameter to the Run EQS Query task called "Update BB on Fail."
  • If enabled, this parameter will clear out the indicated blackboard entry if the EQS query fails.
  • This setting is enabled by default and can be changed via Project Settings > AI System > Clear BBEntry On BTEQSFail.
  • Debugging Tools:
  • New:
  • Added filter volume support to the Visual Logger.
  • Added a log category that shows when a dirty area is affecting one or more Navmesh tiles. This shows you how many tiles on a navigation mesh are being dirtied and who are the biggest offenders.
  • Added a way to change the font size used by the Gameplay Debugger via the console variable, gdt.fontsize. The value specified will get stored in the user's .ini files.
  • Navigation:
  • New:
  • Added an optional feature to the Navmesh Data called "Use Virtual Geometry Filtering And Dirtying."
  • This feature uses virtual methods to check if an actor needs to be added to the navmesh (providing the ability to create custom logic on extended navmesh classes)
  • This change also prevents dirtying navigation areas that have been requested by an actor that is not on the navigation mesh.
  • FRecastTileGenerator::ApplyVoxelFilter is now a virtual function.
  • Switched NavMesh to use Oodle compression (bias for size in editor, bias for speed in standalone).
  • Improvement:
  • Reduced the memory footprint of the Navigation Mesh by using smaller data types when possible, fixing struct alignment to reduce padding, and factoring out settings that were unnecessarily included in each dtMeshHeader.
  • Added support for Large World Coordinates (LWC) to Navigation Modifiers.
  • Added support for Large World Coordinates (LWC) to Recast and Detour Crowd Manager.
  • Added support for Large World Coordinates (LWC) to navigation mesh serialization as either floats or doubles. This is achieved by serializing as doubles in either case.
  • Bug Fix:
  • Fixed an issue where the navigation mesh was not generating correctly when the NavMeshBoundsVolume was placed perfectly flat on the floor surface.
  • Added a safety check when loading a navigation mesh to check if code referencing an older version of the navigation mesh attempts to load a newer version of the navigation mesh.
  • Fixed an issue where the navigation mesh was being unnecessarily rebuilt based on the number of bits required to store maxTiles.
  • Fixed an issue where the Navigation System would rebuild the navigation mesh during OnWorldInitDone for DynamicModifiersOnly navigation if the AutoGenerateNavigationData was disabled.
  • Fixed incorrect uncompressed buffer size passed by DetourTileCacheBuilder to calculate maximum compressed size.
  • Animation:
  • New:
  • Added UAnimDistanceMatchingLibrary, which exposes Anim Node functions for driving animations based on distance.
  • Added UAnimCharacterMovementLibrary, which exposes functions for predicting where a character will stop or pivot. This is used as input to the distance matching functions.
  • Added UDistanceCurveModifier, which is an Animation Modifier that generates curves used for distance matching library functions. The modifier generates the distance curve based on root motion information from the animation.
  • Added SyncMarkerAnimModifier, which is a Blueprint Animation Modifier included with the Animation Locomotion Library. It provides an example of how to generate Animation Sync Markers automatically.
  • Added a Python Command Log tool in Control Rig for printing of equivalent Python commands when performing actions in the Control Rig Editor.
  • Added Control Rig Spline plugin, which enables the creation of Spline-based controls in Control Rig.
  • Added example Control Rig Context Menu commands written in Python: Add Null Above Selected, Add Controls For Selected, and Alignment tool.
  • Added Copy Python Script button in Control Rig Class Settings which copies the entire Control Rig to Python in order to replicate a Control Rig.
  • Using the Shift + Delete shortcut retains node connectivity in Control Rig to be consistent with the Blueprint functionality.
  • You can now toggle the effector transform on the FABRIK node in Control Rig. This addition aligns with how the FABRIK AnimGraph node works.
  • Motion Warping is a new experimental plugin which allows you to dynamically adjust root motion to align to targets.
  • SkeletalMerging is a new plugin which exposes Skeletal Mesh merging to Blueprints, and adds SkeletonMerging functionality which allows for merging of Skeletons.
  • Added support for importing Animation Transform Attributes from FBX by name(-matching) nodes within the FBX scene.
  • Project specific scriptability UFunctions were ported to the Engine.
  • SetPreviewSkeletalMesh was exposed to Blueprint and Python for Animation Blueprints and AnimationAsset derived classes.
  • Added (script exposed) functionality to retrieve UAnimationGraphs and UAnimationGraphNodes of a specific class from UAnimBlueprint and UAnimationGraph respectively.
  • Added (script exposed) functionality for populating and updating a PoseDrive node and PoseAsset.
  • Added a normalization trait/concept for animation attributes, allowing for user-defined normalization functionality after accumulation/blending operations. Normalization for the Transform animation attribute was implemented.
  • Added non-blendable versions of TransformAnimationAttribute, FloatAnimationAttribute, and IntegerAnimationAttribute.
  • Added a Get with validity checking for Animation Curves.
  • An asset registry tag "SkinWeightProfiles" was added to the SkeletalMesh asset to make it discoverable and searchable in the Editor.
  • Multiple UV channels are now supported when CPU skinning a Skeletal Mesh.
  • Added project settings that allow for defining a default set of AnimModifiers to be added to any imported AnimSequence. A new flag was added to state whether or not modifiers should be automatically applied during (re)import.
  • Added GUID to PoseAsset to track it against the Source Animation, and prompt the user if it has become out-of-date, which happens when the Animation Sequence is changed or reimported. The UX was improved for PoseAsset in the details panel.
  • Added USkinnedMeshComponent::GetRefPoseTransform.
  • GetBlendProfile is now exposed to Blueprints. This can be accessed with MontagePlay/Stop_WithBlendSettings.
  • Control Rig was promoted from beta and is now production ready.
  • Improvement:
  • You can now copy and paste Control Rig shape properties.
  • Moved animation asset browser context menu to UToolsMenu API.
  • Replaced Animation Recording sampling rate with FFrameRate to improve UX and integrate better with AnimDataModel.
  • Various improvements were made to Animation Attribute bone index mapping.
  • Introduced FMeshAttributeContainer which stores the attributes according to FMeshPoseIndex.
  • Added FinalizeAttributeEvaluationResults to SkeletalMeshComponent. This remaps the evaluated compact-pose indexed attributes to mesh-indices.
  • Added CopyFrom template to AttributeContainer for different bone index types.
  • Ensured that attributes are only inserted during evaluation if its bone index is present in the required bones
  • Added engine-level testing for remapping between LODs with removed bones, and remapping between Skeletal meshes with different skeleton hierarchies.
  • Crash Fix:
  • Fixed a crash that occurred when opening Mirror Data Tables.
  • Fixed a crash that occurred while applying multiple Anim Modifiers.
  • Fixed a crash that occurred when selecting 'Frame from this animation' as the Base Pose Type for an animation sequence containing animation attributes.
  • Bug Fix:
  • Fixed interp alpha value calculation in AnimationBudgetAllocator so it is 1 instead of 0.5 when the tick rate is 1.
  • Fixed bug that caused sync markers generated by UAnimationBlueprintLibrary::AddAnimationSyncMarker to have an invalid GUID, which would cause all sync markers to be deleted when one was deleted.
  • Expanded the list of regular expressions used to match mirrored bones to ensure the UE5 Mannequin mirrors correctly.
  • Fixed an issue with sync mirroring on blend spaces.
  • Skeletal Mesh errors now print out the path name of the component rather than just the name. This fix means you can see what Actor instance, and class, owns the component rather than the generic name StaticMesh0.
  • Fixed an issue with the mirror node that could result in incorrect behavior when the node was evaluated with identical bone counts but different bone indices.
  • Undoing a remove row operation in the Mirror Data Table now restores the location of the row.
  • You can now use WasAnimNotify functions with Linked Anim Layers.
  • Added a cache of active skeletal mesh thumbnails scenes (similar to class/blueprint thumbnail rendering) to prevent out-of-memory crashes.
  • Removed GetResourceSizeEx from UMorphTarget and FMorphTargetLODModel, as this functionality has been superseded by counting memory through UMorphTarget::Serialize.
  • Fixed a typo in SkeletalMeshComponent.h.
  • Fixed incorrect results generated when evaluating compressed Animation Curves containing user-weighted tangent data.
  • Implemented changes to ensure that the CPU access flag is correctly inherited when generating a SkinWeight buffer for alternative skin weight profile(s).
  • Fixed a bug in which CTRL+Z and CTRL+Y would not undo/redo modifications to Additional Meshes.
  • Fixed an issue with the behavior of the DoesBoneName function from AnimationBlueprintLibrary.
  • Anim runtime methods were re-exposed to the Engine API.
  • Made changes to ensure that users cannot generate Blend Profile names with invalid characters, as this name is used to generate a UObject.
  • Switched FAnimNode_TransitionPoseEvaluator to use heap-based Animation Attribute container rather than stack-based.
  • Fixed a bug where deleting one generated sync marker would cause all of the sync markers to be deleted.
  • Deprecated:
  • Deprecated the Verlet Control Rig node in favor of the Spring Interpolate node.
  • Removed the Copy to SoundWave menu option.
  • Removed:
  • Removed the recording state from the Play button in transport controls for the Animation Editor(s). This fixed an issue with the play button being shown as a pause button while recording animation in Control Rig.
  • Animation Assets:
  • New:
  • Added virtual bone support to blend profiles and blend masks.
  • Added alpha lerping to the Modify Curve Animation Blueprint node when setting Apply Mode to a non-blend value.
  • Added Maximum Duration Seconds and Sample Frame Rate options when recording animations in the Animation Sequence Editor.
  • Multiple montages can now be synchronized in Animation Blueprints using the Montage SyncFollow and Montage Sync Stop Following nodes.
  • Added 'Selected and Children' and 'Selected and Parents and Children' Bone drawing modes in the Animation Editor viewport menu.
  • Added a Blend Profile mode selection to the Blend profile picker.
  • Added an option to the Blend profile picker for blend mask creation.
  • Added a blend mask mode to the layered blend per bone node. Blend masks can be used to specify per-bone weights in a skeleton hierarchy.
  • Improvement:
  • Pose Search Databases now support root motion extrapolation so animation sequences can be used from start to finish without the need to add lead-in or follow-up sequences. The system will extrapolate the root motion velocity to generate an estimate of the root motion beyond the limits of the main sequence.
  • Added Extrapolation parameters to PoseSearchDatabase.
  • Changed the sorting in the skeleton tree so that it is alphabetical, while still maintaining the hierarchy.
  • Optimized USkeletalMeshComponent::ComputeRequiredBones().
  • Selecting Meshes and Bones is now better handled in the Animation Editor Viewport. Now when selecting, it will take into account bone visibility and cursor position to properly select either bones or meshes.
  • Section Selection toolbar button is now removed as it is now no longer needed due to selection improvements.
  • Crash Fix:
  • Fixed a crash when a Skeletal Mesh was referencing a deleted skeleton.
  • Bug Fix:
  • Fixed Show All Sections not correctly restoring all sections after filtering cloth views in the Animation Editor viewport
  • Fixed virtual bone skeleton tree item not also selecting when a virtual bone is selected in the viewport.
  • Fixed font not found warning spam when a virtual bone skeleton tree item is selected.
  • Fixed virtual bone name not showing when selected in viewport.
  • Fixed parity of virtual bone name text shadows.
  • Fixed skeleton tree undo and redo and sync when editing sockets.
  • Creating an Anim Curve on an animation sequence timeline that shares the same name as an already created curve will now reference that same curve, instead of doing nothing.
  • 'Reset Columns' now correctly works in the Animation Editor asset browser.
  • Fix for animation recorder manager not correctly stopping when reaching the Maximum Duration limit.
  • You can now drag and drop multiple Sequences onto a Montage timeline.
  • Fixed an issue with the Blend profile picker sometimes showing in a non-standalone mode outside of the skeleton editor.
  • Fixed a bug with reset to default with blend profiles.
  • Animation Blueprints:
  • New:
  • Generated node array properties are now marked as Blueprint visible so they can be exposed through generic FOptionalPinManager-driven nodes. Now arrays are not needlessly exposed and can be handled with struct member get-by-ref calls rather than struct member sets.
  • Added State Machine common helper Functions for use in the AnimGraph: Convert to Animation State and Is State Blending In / Out.
  • Added the Pose Watch Manager to track active pose watches in Animation Blueprints
  • Debug visualization can now be displayed simultaneously for all selected nodes in the Animation Graph Editor viewport.
  • Added the ability to tag and reference by tag any anim graph node using the new Tag property.
  • Anim graph nodes will now display their tags in the bottom-right corner.
  • UAnimGraphNode_BlendListBase is now exposed to exported API.
  • New functions have been added for evaluating timecode attributes on the root bone in an anim sequence.
  • "TCHour", "TCMinute", "TCSecond", "TCFrame", "TCSubframe", and "TCRate" can now be used as bone attributes on the root bone to pass timecode information through an animation sequence.
  • Added the EvaluateRootBoneTimecodeAttributesAtTime() function, which can be used to evaluate root bone timecode attributes at a particular time.
  • Added support for parsing the timecode rate as a string into the FFrameRate it represents, and accounts for the use of drop frame timecode rates (with either "29.97df" for NTSC_30 or "59.94df" for NTSC_60 frame rates).
  • Added function library support for member reference customizations and anim node functions
  • Exposed CreateNodeFunctionsWidget on anim graph node widget so that non-derived types can use it.
  • Added node function specific library for skeletal controls.
  • Added pure conversion functions for Animation Blueprint node references.
  • Added an indicator of whether node properties are dynamic in the property access binding menu.
  • You can now use the transform manipulator in the Animation Blueprint Viewport when manipulating skeletal control nodes values
  • The Animation Blueprint now shows an empty mirror node on the right-click menu when a compatible Mirror Data Table does not exist.
  • Anim Composites now appear in the Anim Blueprint context menu.
  • Added Anim Node library functions for sequence players and evaluators.
  • You can enable Anim Blueprints to show pin inspection tooltips.
  • Improvement:
  • Doubling clicking a pose watch in the pose watch manager will now frame the node in Animation Blueprints.
  • The Gravity Override parameter in the Anim Dynamics node can now be defined in world space.
  • Conduits in State Machines can now be used as entry states.
  • The compiler will now produce a warning when using experimental AnimGraph nodes.
  • Animation Blueprints now support debugging of post-process blueprints.
  • State machines now have updated iconography.
  • Child anim blueprints can now be used as the default instance class in Linked Anim Layers.
  • Improved appearance of node-specific visuals for certain anim graph nodes.
  • Improved debugging and error reporting of node-specific visuals for certain anim graph nodes.
  • Improved pin sorting for Anim Nodes.
  • Improved the Linked Anim Graph with node customizations such as node color, tooltip, and title, and allowing property access bindings.
  • There's now a warning when an incompatible Post Process Anim Blueprint is applied to a Skeletal Mesh.
  • Improved performance of Animation Blueprints when displaying large graphs.
  • Optimized building reference and identity poses by avoiding excessive inner branching when setting a compact pose to a reference pose, and avoiding setting scale twice when resetting a transform to additive identity.
  • Optimized property access runtime by caching the return value property, and no longer using a mem stack allocator but instead an inline-allocated array of bytes and manually aligning the base pointer.
  • Previously a large shared pointer destruction chain occurred when resetting tick records each frame. To reduce tick record context data overheads, individual shared pointers to context data were switched to unique pointers, while allowing shared ownership and holding a shared pointer to the entire array.
  • Crash Fix:
  • Fixed crash when editing Call Sites on Property Access nodes used in the Animation Blueprint Event Graph.
  • Fixed crash when compiling an Animation Blueprint with all bones hidden.
  • Fixed crash with out of bounds skeleton bone indices.
  • Fixed crash when dragging a sequence player into a Template Animation Blueprint.
  • Fixed crash when compiling on load anim graphs that contained null nodes.
  • Fixed SVisibilityWidget crashing on Linux when opening the Pose Watch Manager.
  • Fixed crash when using details panel to edit multiple blend weights on a single node.
  • Fixed crash when copy, pasting, and compiling various animation nodes.
  • Fixed crash when cooking child Animation Blueprints.
  • Fixed crash when right-clicking a child asset of a template animation blueprint that has no skeleton.
  • Previously older Anim Blueprint generated classes, on first load, could contain out-of-date node type layout tables, and were unusable unless they were patched up with compile-on-load. Now non-compile-on-load paths successfully load these Anim Blueprints, although they cannot be used.
  • Fixed the crash that occurs when compiling an Anim Blueprint with an empty state machine.
  • Fixed the post-compilation crash that occurs when using the Call Function Anim Nodes.
  • Fixed an occasional crash that occurs when performing an undo while the Slot Names Editor is open.
  • Child Anim Blueprints that use Blendspace Graphs no longer reference null blendspaces.
  • Fixed a crash that occurs when selecting a Linked Anim Layer class.
  • Fixed a crash that occurs while compiling child Anim Blueprints that weren't properly initialized.
  • Fixed a crash that occurs when selecting property access chains involving structs with native break functions.
  • Opening a collapsed area in the Create Animation Blueprint dialog no longer causes a crash.
  • Calling Anim Node functions when running standalone nodes no longer crashes.
  • Fixed a crash that occurred when selecting a slot node in a template Animation Blueprint.
  • Bug Fix:
  • Pose watching now correctly works for Blend Space and State Machine nodes.
  • Copy and paste now works for Blend Space AnimGraph samples.
  • Fixed being unable to make permanent pose watches created when enabling ‘Automatically create pose watch on selection'.
  • Added 'Initial Update' animation node function callback.
  • Pose watches now correctly delete when deleting a graph that contains them.
  • Fixed error when using a non-thread-safe function on an anim node.
  • Fixed metadata preventing new node bindings from being created.
  • Fixed a load ordering dependency with parent and child Animation Blueprints when child classes were PostLoaded() after their parents.
  • Fixed window focus loss when searching for parent blueprint classes while creating Animation Blueprints.
  • The schema type will now be checked before creating animation-specific graph pin widgets in order to resolve issues with execution pin connections.
  • Fixed animation node functions not being called correctly.
  • Fixed function library support for member reference customization and animation node functions.
  • Fixed non-deterministic cooking issue with child Animation Blueprints.
  • Single frame blendspaces now correctly sample root motion.
  • Property access generated properties are flagged as compiler-generated now, so CopyPropertiesForUnrelatedObjects will skip them.
  • Fixed issue where undo and redo weren't working correctly on property access nodes.
  • You can now spawn variable setters in Anim Graphs.
  • Modify bone and other edit modes now propagate to debugged objects during PIE and in Editor worlds.
  • The default values for Anim Node's bool pin no longer show up when pins are connected.
  • The Property Access node now has a move cursor when you hover over the node.
  • Previously, pose handlers were incorrectly calling a CacheBones pass on the graph during initialization. In the base class this was not a problem, but in derived classes, such as those with input poses, this could cause CacheBones to be called before Initialize.
  • Improved error handling for Anim Node references, especially when tagged nodes are disconnected.
  • Fix crash redo-ing and compiling an initial update anim node function binding
  • For child Anim Blueprint overrides, the Anim Node data is now linked to the class that matches the CDO being patched.
  • Sequence evaluators now show they can output a root motion delta.
  • ExtensionContent now works for a FDetailWidgetRow created from IDetailPropertyRow::CustomWidget().
  • Cooked Anim Blueprint Assets now animate when placed.
  • Optimized linking of Anim Layers with reduced calls to FindFProperty by caching generated parameter properties in FAnimBlueprintFunction and only iterating on them when linking.
  • Fixed Linked Anim Layer Node pins not being properly regenerated.
  • Fixed Linked Anim Layer pins not being available for bindings when using a self layer.
  • Corrects some mirror node bone index usage, and skips unnecessary intermediate array allocation.
  • Deprecated direct access to internal mapping arrays in FBoneContainer.
  • Fixed some bone index types, including type conversion occuring when using IInterpolationIndexProvider.
  • Fixed issue where keyboard input closed the color picker for Anim Notifies.
  • Template Anim Blueprints can no longer be retargeted.
  • We now correctly override the thread safety of return-value properties for property access when a function is marked thread-safe.
  • You can now disable notify instances and native notify types from being called in Animation Editors.
  • Undo and redo actions now work on property access call sites.
  • When starting in a different tick group for Skeletal Mesh Components allow a parallel animation eval.
  • Fixed edge case where graphs Linked Anim Layer Nodes were initialized without an interface.
  • Property access now works correctly with Blueprint refactoring tools, such as find references, renaming, and deleting.
  • Linked Anim Layers no longer show up multiple times in the context menu.
  • Fixed the issue where array child properties of an Anim Graph Node were still being shown when arrays were bound to pins.
  • Anim getters now use Linked Anim Layers.
  • Alpha blending options no longer keep bindings hidden when the alpha method is switched.
  • Linked Anim instances that have a mix of interface and non-interface layers now only unlink interface layers when unlinking.
  • There are now Anim Node data flags to reduce the overhead introduced by Anim Node functions. The data no longer has to be fetched out of folded constants to determine that it is invalid.
  • The node lookup in the Anim Blueprint compiler is used now instead of relying on the reverse DebugObjectToPropertyMap. This fixes debug weights occasionally breaking in Anim Graphs.
  • Anim Blueprints are no longer part of unneeded dependency compilations.
  • Fixed the issue in Animation Blueprints where exposed pins that were not exposed by default were not updating their values.
  • There is now a looping tooltip for transport controls.
  • Blend lists now only reinitialize children when their weight is zero.
  • There are now error reports for dynamic values that are not exposed on pins.
  • Custom pins are now created on Anim Graph Node creation and not just on reconstruction.
  • You can now debug post-process Blueprints in the Animation Blueprints Editor.
  • Fixed assert occurring when compiling an Animation Blueprint with an Anim Node function node in the Anim Graph.
  • Sparse class data is no longer derived from an incorrect base when used with a native base class.
  • You can now create a child Anim Blueprint with another compatible skeleton.
  • You can now place cooked Anim Blueprints in Level Viewports.
  • Fixed "Unable to push default value for pin" warning when linked anim graph node pins are connected.
  • You can now override Aim Offset Assets.
  • Property access thread safe logic now correctly enforces function metadata overrides.
  • Fix asserts with child Animation Blueprints by ensuring that cleaned-up sparse class data structs are moved out of the package they are in.
  • You can now open newly-spawned empty Blend Space Graphs.
  • Nested property validity filters, such as checking to see if an entry in the menu has compatible submenus, are now performed for functions.
  • You can no longer bind UObject types to unrelated types in the menu.
  • The display name now appears for script properties and functions, and ScriptName for native ones if available.
  • You can now double-click an aim offset with exposed pins.
  • GetLinkedAnimLayerInstanceByGroup now works correctly in packaged builds.
  • Property access nodes can now be correctly searched for in the AnimGraph context menu.
  • Fixed an ensure when opening some linked Animation Blueprints. Linked Animation Blueprints can be debugged, but previously the logic to set up a debugged object based on a Skeletal Mesh made the assumption that only the main animation instance would be the class being set. The check was expanded for that fallback logic application to cast a wider net than just the preview instance.
  • Extra Anim Node child properties no longer appear incorrectly on unbound structs, and bindings no longer appear on un-bindable properties.
  • Skeleton Assets now generate a thumbnail in the Create Animation Blueprint dialog.
  • Fixed an issue where a single step in the Animation Blueprint had no effect. It now steps at a fixed framerate.
  • Property Access nodes are easier to move around now.
  • Fixed an issue where nested structs that were bound to Anim Node pins were not showing their child values.
  • Fixed spurious compiler thread-safety errors when batch compiling.
  • Fixed issues with child Animation Blueprint compilation ordering. Also improved cleaned-up sparse class data structs.
  • Fixed issues with Sequence Player node Blueprint exposure.
  • Fixed a crash when opening a child Anim Blueprint of a template Anim Blueprint.
  • Fixed warnings caused by tagged-property-serialization with generated sparse class data structures in Animation Blueprints.
  • Rewrote the tooltip for sequence player's SetStartPosition to better explain its functionality.
  • Deprecated:
  • Deprecated UAnimClassData, as it is no longer required by the Blueprint nativization feature, which has also been fully deprecated.
  • Removed:
  • Removed duplicates of the Component and Actor transforms in FAnimInstanceProxy.
  • Animation Tools:
  • New:
  • Added "Spherical Pose Reader" Control Rig node, which provides easier setup of secondary deformations by defining custom regions of influence around bone rotations.
  • Added suite of new Python functions for getting and setting Control Rig Values and Keyframes in Sequencer.
  • Added options for previewing root motion in the animation editor viewport.
  • The "Duplicate and Retarget" batch process for Animation Blueprints now uses the new IK Retargeter asset.
  • Added Control Rig editor profiling for heat-map style runtime cost profiling.
  • Added support for map controls as inputs on the Control Rig Animation Blueprint node.
  • Added nodes in Control Rig to interact with Arrays such as Add, Num, GetAt, and SetAt.
  • Added the option to automatically link new mutable nodes in the Control Rig Settings.
  • Control Rig: Functionality for the ControlRigComponent to perform lazy evaluation.
  • Added the following nodes to Control Rig: New Item Equals, Item Not Equals, Item Type Equals, and Item Type Not Equals.
  • There is now a new user workflow to promote pins to a variable in Control Rig.
  • There are new nodes to allow Nulls and Control to reparent and space switch in Control Rig.
  • Skeleton Editor has a new transform widget for editing and viewing bone transforms.
  • You can now inspect live values running through a Control Rig in the Details panel's Live Values section.
  • You can now frame the selection and the complete graph in Control Rig using the F hotkey.
  • There are new Control Rig nodes so you can interact with arrays of transforms to perform accumulation, project from local to global space, and draw arrays of transforms directly.
  • There's a new option in Control Rig to show the Controls' colors on the icon in the Rig Hierarchy widget.
  • Fixed an issue where the Viewport appeared blank for additive animation. We now always retrieve a valid skeletal mesh for previewing.
  • The Viewport has been updated to use AdvancedPreviewScene similar to the Animation Editor viewport(s).
  • Added the ability to update a PoseAsset pose-entry with the current in-viewport pose.
  • Added the option Show Mesh Edges in the Animation Viewport Show Options menu.
  • Exposed TargetSkeleton and PreviewSkeletalMesh for BlendSpace factory as BlueprintReadWrite. You can use this to create blendspaces from Blueprints and Python.
  • Added the option to only apply out-of-date animation modifiers to an animation sequence. This option appears in the contextual menu of an Asset, and through the Details view of AnimationModifier classes.
  • Added option to visualize Animation Transform Attributes in the Animation Editor. You can access this option from the Show Flag menu.
  • Added a new option to DebugSkelMesh to track the LOD of an attached instance in the Level Viewport.
  • Added new default gizmo libraries with shapes that have uniform scale to Control Rig. Assets from previous versions will maintain their original gizmo library.
  • Improvement:
  • Enabled full support for user defined struct usage in Control Rig.
  • The Control Rig runtime VM has been upgraded to a more compact and flexible memory backend.
  • Reduced the memory footprint and runtime of Control Rig by using inline allocators to avoid allocations for minimum size cases, and batch allocating elements.
  • Bug Fix:
  • Control tracks in Sequencer now correctly update their name when a Control is renamed in the Control Rig editor.
  • Fixed Bone selection behavior in Control Rig viewport.
  • Fixed an issue where any pending Apply Preview Mesh pop-up toasts were not faded out when consecutively changing the Preview Mesh.
  • Reduced the number of editor transactions created when dragging BlendSpace sample points. We now create a single transaction for interactive changes.
  • Fixed a scaling issue with the scrollbar in the Animation Editor Timeline.
  • Fixed an issue with Additional Meshes where their post-process Animation Blueprints were not being evaluated correctly in Animation Editor(s).
  • Fixed not being able to select a PreviewMesh using the arrow keys.
  • Fixed an issue with Animation Recorder generating gaps or missing curve-key values by ensuring that WriteIndex is used to populate curve-key data.
  • Deprecated:
  • Deprecated the Transform Constraint Control Rig node. It is replaced with new Parent/Position/Rotation/Scale Constraint nodes.
  • Import/Export:
  • New:
  • Added support for importing enum FBX properties as string-typed custom attributes. Enum-typed properties in the FBX are converted to string-typed custom attributes using the string value that corresponds to the enum index.
  • Added dedicated settings for timecode custom attribute names, which can be customized for a pipeline using BoneTimecodeCustomAttributeNameSettings.
  • Sequencer will now check for timecode properties to use as TimecodeSource when importing FBX to Control Rig.
  • Skeletal Meshes imported from FBX now stores mesh names, number of vertices, and the start vertex offset.
  • You can choose to store the vertex numbers from your DCC for a Geometry Cache imported from Alembic files, by enabling Import Vertex Numbers.
  • The Alembic Importer and Geometry Cache plugins are now no longer experimental, and are instead production ready.
  • Bug Fix:
  • Fixed precision issues that could result in Anim Sequences from FBX importing at the wrong frame rate, and improved animation sampling precision on animations with larger durations.
  • Streaming a geometry cache from Alembic with constant topologies now supports frame interpolation, This is needed for subframe sampling and motion blur.
  • Alembic import settings created from a script can now be used and displayed in the Import dialog.
  • Deprecated:
  • Removed support for HDF5-format Alembic. Instead, use or convert your Alembics to Ogawa format before importing in Unreal Engine.
  • Skeletal Mesh:
  • New:
  • Moved Bake Out Materials to the Skeletal Mesh Editor toolbar.
  • Crash Fix:
  • Fixed crash when calling Set Skeletal Mesh function in Blueprints.
  • Bug Fix:
  • Fixed editable skeleton transactions sometimes not being saved.
  • Fixed a crash when serializing morph targets on an editor platform that didn't support morph targets.
  • Deprecated:
  • Removed skinning pre- and post-offset. This was added temporarily in 4.26, specifically for the MLDeformer prototype. The public functions were always marked as deprecated.
  • Audio:
  • New:
  • Added Bandsplitter MetaSound nodes that split audio into discrete frequency bands, with the option to phase correct so that they can sum back together with minimal artifacts.
  • Added a Dynamic Filter node to MetaSounds. This node is a filter with bell and shelf modes that filters based on the strength of the signal at the affected frequency range. This node can be sidechained with a secondary audio source.
  • Added a new UInterface that allows Actors to automatically fill out and pass an array of AudioParameters to any owned sounds from said Actor.
  • Added a Diffuser node to MetaSounds. This node diffuses incoming audio like a reverb, but without adding a long tail.
  • Added the ability for an Audio Component to be associated with multiple active sounds.
  • Added variables to the MetaSound graphs.
  • Parameter setter calls on an AudioComponent are now cached in separate "InstanceParameters" arrays and supersede changes to the "DefaultParameters" array (redirected from the original InstanceParameters array).
  • Parameters now have a fallback structure set by Blueprints / runtime "InstanceParameters", instead of those provided by ActorParamInterface. These parameters are set as defaults on the AudioComponent.
  • Added Unreal Insights markup to the Quartz Audio system. Various Quartz mechanisms and performance considerations can now be visualized in the Unreal Insights tool.
  • Enabled Google Resonance Audio as a default engine plugin.
  • Added audio slider and knob widgets. These widgets can be used as standalone widgets and within the MetaSound editor.
  • Added Editor Preferences options for various MetaSound and Sound asset types for easy access when creating new assets.
  • Added an Editor Preferences option to automatically solo audio for the first PIE client.
  • Added an Additive Synth MetaSound node.
  • Added support for Metasounds in Sequencer via the transmission interface.
  • Added the ability to modulate Output Volume, Wet Level, and Dry Level on submixes with the Audio Modulation plugin. This replaces the old properties, which are now deprecated. The old volume properties will transfer to the base values of the new Modulation Destinations automatically, and will work the same even if the Audio Modulation plugin is disabled.
  • Improvement:
  • Added more trace events to the audio device and to Metasound rendering to get more useful performance information when viewing Unreal Insights sessions.
  • The dynamics process and MetaSound Compressor node can now apply upwards compression in addition to downwards compression. Upwards compression can apply up to a maximum of 36 dB of gain to a signal below its threshold.
  • Improved the MetaSound OnPlay CPU performance.
  • Improved the clarity of the default values in Audio Platform Settings UX.
  • Changed the log verbosity in the Steam Audio spatialization plugin to reduce the number of messages.
  • Added the ability to compile out huge symbols out of libSamplerate to save on memory.
  • Optimized MetaSound node searching.
  • Improved the tool tips for Audio Stream Caching statics.
  • Cleaned up XAudio2Windows and separated it into smaller, more manageable pieces.
  • Enabled the MetaSound AutoConverter nodes between enums and int32, and updated the conversion nodes style.
  • Updated Wavewriter to support multiple channels.
  • Added optimizations to Recycle threads for Null Renderer devices.
  • Added optimizations to the DeviceInfo Cache.
  • Added optimizations for Windows to the Threaded device swap.
  • Did an incremental refactor to XAudio2 and moved the stringify error codes into StringHelper.
  • Changed the Mute / Solo option for Sound Classes to only apply while in PIE.
  • Reduced the number of log messages produced when using procedural SoundWaves on Sequencer's audio track.
  • Bug Fix:
  • Fixed an issue where the MetaSound block-rate AD Envelope node was not allowing attack rates smaller than one block size (eg 0). If set to under a block length, it will now skip its attack phase.
  • Fixed the MetaSound Compressor node failing to update some of its inputs while running.
  • Fixed Metasound type conversion nodes outputting default values on the first render block.
  • Fixed an issue where ActiveSounds and AudioComponents spawned via GameplayStatics functions wouldn't have an Owner actor assigned to them.
  • Fixed an issue with Focus Interpolation where it would always interpolate up from 0, instead of initializing to the current Focus value.
  • Fixed an issue where it was possible to divide by zero on the MetaSound AD Envelope.
  • Fixed a bug where the initial value of the Metasound math operator nodes was not being set.
  • Fixed an issue that would result in the lack of clamping when recording output.
  • Fixed an issue where binaural audio was not working correctly on some plugins.
  • Fixed an issue where the audio settings were not being saved to .ini files on some platforms.
  • Fixed an issue where the MetaSound InterpTo nodes and Conversion nodes were not propagating their initial output values at the point of construction.
  • Fixed an issue where sending a normal submix to a soundfield submix could result in an incorrect init order or a crash.
  • Fixed an issue where Soundfield Submixes would not properly re-initialize when the encoding format changed in the editor.
  • Fixed an issue where the Audio Capture Component would crash if OpenCaptureStream() hadn't been called.
  • Fixed an issue where sounds were cutting off if they started playing within the binaural radius, and the listener left that radius.
  • Added protection against a potential null pointer deref in SubmixUtils::AreSubmixFormatsCompatible().
  • Fixed an ensure when binaural sound was sent directly to a soundfield submix.
  • Fixed an issue where the Modulation EnvelopeFollower was not reinitializing when the AudioBus was initially unset.
  • Added a Multithreaded Patching (MTP) Remainder check in the calculation to now ignore (and properly clean-up) inactive outputs.
  • Fixed an issue where FQuantizedPlayCommand::CancelCustom() was letting pending play commands play un-quantized instead of stopping the sound.
  • Fixed an issue where audio buses were mixing in incorrect data when the sound started playing in a "paused" state.
  • Added a fix to prevent an Audio Component from accessing an uninitialized Quartz Clock.
  • Fixed an issue where the Audio Streaming Cache would crash if the configuration caused the cache to have zero elements.
  • Fixed an issue where swapping an in-flight threaded audio device would cause a shutdown crash.
  • Fixed an issue where the AudioMixer XAudio2 would not recover after failing to initialize. This allows for device swapping after an open failure.
  • Removed the DLL fallback code that was causing issues with initialization recovery.
  • Fixed several issues with the audio channel that would result from device swaps.
  • Removed the PhysicalSpeaker property from being monitored for swapping and improved logging around channels changing.
  • Fixed an issue that would result in memory corruption in USoundNode.
  • Fixed an issue where the MMNotification client would experience a deadlock.
  • Fixed an issue that would cause incorrect fading of a SubmixEffect.
  • Fixed an issue with a race condition in the Windows Session Notification client Unregister / Register.
  • Fixed an issue where the MetaSoundSource of a Metasound asset would get corrupted when setting the Playback position to be non-zero.
  • Fixed an issue where the Bhaskara and Pure Math variations of the Sine MetaSound Generator Node were not correctly handling negative frequencies.
  • Fixed an issue where copy / paste was not working correctly in the Audio Mixer thread priority.
  • Fixed an issue where adjusting nullptr check in the AudioDevice would result in a crash.
  • Fixed an issue where stereo sounds with binaural spatialization were not panning correctly.
  • Fixed an issue where switching back from a NULL renderer device would result in the user's PC hanging.
  • Fixed an issue in AudioMixer that would result in a nullptr on partial initialization teardown.
  • Fixed an issue in the Audio Streaming Cache that would result in a crash.
  • Fixed an issue where the WaveWriter node was creating files even when it was not connected in the MetaSounds graph.
  • Fixed several issues with the Metasound Oscillator Generator node, including DC offset for square wave, triangle wave phase offset, and fade in for unipolar generators
  • Deprecated:
  • Deprecated the MetaSound Send and Receive nodes.
  • Removed the Sound Visualization plugin in favor of the more comprehensive functionality in the Audio Synesthesia plugin and other parts of the audio engine.
  • Removed the stat audio console commands in favor of the au.Debug family of console commands.
  • Deprecated the SpokenText field in SoundWave.
  • Removed the au.debug.ListSounds command.
  • Console:
  • All Xbox:
  • New:
  • Always include the "requires xbox live" flag in the manifest, as per the guidance from Microsoft, even if it is false.
  • Adding support for Simplified User Model.
  • Added support for detecting and reducing register spillage in the Xbox shader compiler. It will do multiple iterations with decreasing target occupancy to prevent it.
  • The maximum retry count is specified with UE_XBOX_SHADER_COMPILER_AVOID_SCRATCH_USAGE_MAX_RETRIES, and this defaults to 3. The final target occupancy will always be 1, and this reduces in powers of two with each iteration.
  • Gauntlet now removes previous staged build before deploying new build.
  • Bug Fix:
  • Fix for PIX profiling settings to retain control of instrumented D3D12 on Xbox over ProfileGPU.
  • Lazy initialization of audio resources in FMediaFoundationMovieStreamer and proper handling of PLM suspend/resume events.
  • Playstation 4:
  • New:
  • Enable OnlineSubsystemPS4 plugin by default
  • Bug Fix:
  • Replace pthread functions with SCEpthread functions for Sony events. The SCE version uses relative time for timeouts which handles potential errors when changing the system time.
  • Fixed copies of cubemap texture mips.
  • Fixed net address failures when the port is negative.
  • Playstation 5:
  • New:
  • Implement package discovery, installation and deployment for Playstation 5 automation.
  • Integrated MemPro for Playstation 5.
  • Added support for PS5 shader compiler stats to be available in the editor.
  • Bug Fix:
  • Fixed the creation of update packages based on a previous release. The build system no longer considers MasterVersion to determine if a package is a previous release, but the highest MasterVersion is preferred when selecting from the available base packages.
  • Fixed issue where GPU readbacks would sometimes return stale data.
  • Quail:
  • Bug Fix:
  • Fix Stadia's keyboard handling under AZERTY and other country-specific layouts.
  • Fix stadia failing to package in installed builds.
  • Switch:
  • New:
  • Add setting for enableSingleMode option in Switch Controller Support Applet. If enabled, it specifies whether to start controller support in single-player mode. Players are prompted to prepare controllers, including attached controllers, for one person. See nn::hid::ControllerSupportArg::enableSingleMode in the Switch documentation for more info.
  • Added two new features for SwitchInputSender:
  • Added a checkbox to reset the required version automatically when launching the requested app. This removes the need to reset the required version manually with DevMenu.
  • Added the --no-wait command when launching an application to allow the call to RunOnTarget.exe to return immediately instead of waiting until the title exits. This frees SwitchInputSender to do other tasks while the title is running.
  • The Switch RHI will remove unnecessary geometry shader management functionality at compile time if tesselation and geometry shaders are not used. This results in a small performance improvement.
  • Added a return code to the program RegTarget to indicate whether the requested operation was successful or not.
  • Allowing static shader platforms on Switch. This reduces runtime memory usage by around 9MB. To take advantage of these savings, choose a shader platform for the project. Then add defines for "USE_STATIC_SHADER_PLATFORM_ENUMS=1" and either "UE_STATIC_SHADER_PLATFORM_GLSL_SWITCH_MOBILE" or "UE_STATIC_SHADER_PLATFORM_GLSL_SWITCH" in the project's _Target.cs file.
  • Optimized compiler and linker flags to reduce memory footprint and binary size.
  • Optimized NVN CPU allocator by reconfiguring CPU memory growable allocators to reduce waste.
  • Optimize the chunk search in GrowableAllocator, so it's no longer O(n^2) in most cases. The chunk search time is now 20x faster, and overall allocator overhead is reduced by 40%.
  • Crash Fix:
  • Previously, when taking a Low-Level Memory tracker (LLM) capture, the application would crash on exit. This crash has been resolved.
  • Previously, if the Switch's profiler system was active, the app would crash on exit after tearing down the profiler system. The crash has been resolved by waiting on the render threads to drain before tearing down the profiler system.
  • Previously, SwitchInputSender would crash on exit if it was closed while still running tasks when it was closed. It will now exit normally.
  • Bug Fix:
  • Previously, if FSwitchPlatformFile::OpenWrite() was called, and bAppend was true, it would overwrite the existing data with any new data. Now FSwitchPlatformFile::OpenWrite() will seek to the end of the file, and it will write new data at the end of the file.
  • Previously, custom stencil lookups would not return the correct result due to the lookup referencing the incorrect texture channel. The lookups will now return the correct data.
  • Previously, if too many file handles were opened, FSwitchFileHandleBase::Read() would assert before attempting to reopen the file. Now the assert will only fire if the reopen attempt fails.
  • Previously, an assert would be triggered in the SwitchMediaDecoder during Cook On The Fly (COTF) when it attempted to read a file from staged data. This was resolved by changing the check() into an error message as staged data is unavailable during COTF.
  • Previously, the Boost setting would not be set correctly when SwitchInputSender requested a change. The setting will now be set as requested.
  • Previously, an error would occur if the user lifted a finger from the Switch touchscreen and a new finger started touching the screen in the same frame. This error has been resolved by sending all TouchEnd events first, preventing a new TouchStart event from occurring before the corresponding TouchEnd has been sent.
  • Previously, SwitchInputSender would fail to update a kit's firmware if the Switch console had a custom name. Now SwitchInputSender can correctly update the firmware of a Switch console which has a custom name.
  • Previously, the error "Issue 11-801 - Uses development APIs appears" would appear when packaging an application in the Shipping configuration. The functions causing this are now no longer referenced in the Shipping configuration, and the error no longer occurs during packaging.
  • Updated the SwitchInputSender export process to include missing assets when exporting and updated the ExportSwitchInputSender.bat file. Previously the exported version of SwitchInputSender would fail because of missing assets. Now those assets are included.
  • Previously, SwitchInputSender would terminate the running application when connecting to a Switch console. Now SwitchInputSender will connect without the need to terminate the running application.
  • Previously, when setting a new memory value for the Switch console, SwitchInputSender would not reboot the console, and the setting would not take effect until the console was manually rebooted. SwitchInputSender will now reboot the console when necessary, aligning with the other options that also require a reboot.
  • Set NumBuffers=1 when ResourceArray is provided.
  • Deprecated:
  • Sparse Texture support (bUseSparseTextures) has been deprecated due to the lack of performance when enabled and the code complexity incurred to support them. Disable Sparse Texture support for improved performance.
  • XBox One GDK:
  • Bug Fix:
  • Fixed a virtual address leak when an ESRAM allocation fails.
  • Core:
  • New:
  • Added an active timer count threshold at which we assume something is wrong and dump all timers to the log. The intention is to provide information in cases where projects have thousands of active timers at once, which can degrade performance.
  • Added an exec command called "DisplayCVarList" that supports a comma-separated list of CVar names to draw to the screen. This command also supports name completion; for example, you could enter "r.nanite" to see all CVars related to Nanite.
  • Added FMemoryWriter64 for serializing to a TArray64.
  • Added IntCastChecked and IntFitsIn utility functions.
  • Added UTF8CHAR string overloads for FCrc::Strihash_DEPRECATED.
  • Added TSharedFromThis::AsWeak() to complement TSharedFromThis::AsShared().
  • Added an FUtf8StringView overload for FSoftObjectPtr::SetPath().
  • Added UTF8 constructors to FBlake3Hash and FIoHash.
  • Extended FResourceSizeEx to keep track of name for each memory size added. This allows for verbose reporting of resource sizes. This results in output which will dump each tracked named size.
  • Added additional `AddSharedSystemMemoryBytes function which accepts a named tag.
  • Modified the FStaticMeshLODResources class method GetResourceSizeEx to use the new interface.
  • Modified FSkeletalMeshLODRenderData::GetResourceSizeEx() to use the new interface.
  • Added optional alignment awareness to the allocator model, and added support for that to TArray and FScriptArray.
  • Added: FArchive::SerializeCompressedNew can use arbitrary compressors, not hard-coded to ZLib like FArchive::SerializeCompressed.
  • Added the ability to use TArrayView with Append in TSet.
  • The Chunk Downloader now has a GetNumDownloadRequests() function.
  • CurveTable now has RemoveRow functionality to match DataTable.
  • The editor now has a new user interface for the CSVToSVG command line tool.
  • The editor can now create data tables from a raw data array.
  • Added a new WIDETEXT macro for WIDECHAR literals.
  • Users can now disable all or specific notifications from the DDC system.
  • TMemoryImagePtr, FWeakObjectPtr, TOptional, TInlineValue and FObjectPtr debugger visualization now support visualization of dereferencing expressions.
  • Added missing constexpr and UE_NODISCARD to eligible functions in UnrealMathUtility.
  • Created FTSTicker, a thread-safe version of FTicker. FTSTicker can add and remove tick delegates concurrently. Removing a delegate can block until its execution is finishing in parallel.
  • Added a new constexpr FPlatformString::IsCharEncodingSimplyConvertibleTo() function which tests if one encoding can be assignment-per-character converted to another.
  • Added a placeholder for HashCombineFast(), which is intended to serve as a placeholder for an in-memory fast hash combining algorithm, unlike HashCombine() where the results may be persisted.
  • HAL/HideTCHAR.h and HAL/AllowTCHAR.h for including around third-party headers in UTF-8 mode which use their own implementation of TCHAR (for example, Windows headers).
  • FSpinLock and generic TScopeLock. These are classic spin-locking behaviors, so use them with caution.
  • TIsCharType now has specializations for UTF32CHAR and wchar_t when PLATFORM_TCHAR_IS_CHAR16 is set. Added a new PLATFORM_UCS2CHAR_IS_UTF16CHAR macro.
  • Created the Game Thread CPU Timing platform API for more accurate CPU Percentage and CPU saturation detection. Also added a platform API for free (on Unix) process performance stats (Page Faults, IO, and Context Switches). Game Thread CPU Timing is guarded with the CVar: Platform.TrackGameThreadCPUUsage
  • TInlineValue has a new EInPlace constructor.
  • Enabled DisplayAll commands in TEST config builds.
  • Added TEXTVIEW, ANSITEXTVIEW, WIDETEXTVIEW and UTF8TEXTVIEW macros for creating string views to replace the TEXT macro with "_SV" added to the end of the quoted string literal.
  • Remove unused names from package headers, reducing the amount of data and number of names that have to be serialized. We now:
  • Strip names that are not used when cooking for UnversionedPropertySerialization.
  • Strip names that are not used by the loader when staging for IoStore.
  • The third-party Imath library (version 3.1.3) is now included for use in the engine.
  • FString::AppendChars, CompactBinary, and FName construction now support UTF-8. FUtf8StringView is now constructible from both ANSICHAR and UTF8CHAR strings.
  • Removed the unused InstallVisualizers.bat file because Visual Studio versions above 2015 do not use it. Added a .natstepfilter for common Unreal parameter constructor functions to avoid stepping into the parameter construction when trying to step into a function that takes the parameter.
  • Added a Custom Config directory feature that can be used to support multiple packaging targets per platform.
  • Setting CustomConfig=Directory in a Target.cs file will cause it to overlay config files from Project/Config/Custom/Directory on top of the other config files, enabling easy override of things like OSS settings to support multiple stores.
  • In development, -CustomConfig=Directory can be specified in both C++ and C# to enable the same functionality, which can be used to select between different stage/deploy configurations in a build script.
  • Added PackageName.DumpMointPoints, PackageName.RegisterMountPoint and PackageName.UnregisterMountPoint console commands to manage UnrealFileSystemMountPoints in non-shipping builds.
  • Added GetValid(Object) global function. GetValid can be used in places where pointer validation with IsValid(Object) triggers static analysis warnings.
  • Added the ability to specify referencer name provider type for TStrongObjectPtr.
  • Made the verbosity of the uninitialized reflected property check configurable through either project or engine modules. Projects use DefaultEngine.ini, while engine defaults are in BaseEngine.ini. Issues with UObject* properties are upgraded from Warning to Error. Other types remain the same for both engine and project modules (Display), but engine will soon change to Error as well. For example:
  • [CoreUObject.UninitializedScriptStructMembersCheck] EngineModuleReflectedUninitializedPropertyVerbosity=Error ProjectModuleReflectedUninitializedPropertyVerbosity=Warning
  • Added OodleDataCompression.h interface for direct access to Oodle compression. Oodle compression is now built into Unreal Engine Core and is available on all platforms for general purpose compression needs. This is separate from the configurable pak/iostore compressor.
  • Optimized IsValid(Object) performance: 19.8ms -> 9.2ms (based on internal GarbageCollector tests)
  • Add UE_CALL_ONCE to help call void functions once
  • In OutputDeviceFile, the async writer can now set its thread name to either the file name or a sequential number. Define OUTPUTDEVICE_DEFAULT_ASYNC_WRITER_THREAD_NAME to change the default behavior, which is to use the file name.
  • Added support for disabling Pending Kill functionality in the engine. Pending Kill will be disabled by default for any new projects created with the next Engine release.
  • FGCObjects without GetReferencerName overrides will now be reported during Garbage Collection verification tests.
  • Changed the CsvProfiler worker thread to be created on demand, rather than unconditionally. The CSV_PROFILER macro is now defined in Shipping on the Dedicated Server only if checks are defined as well.
  • Added support for disabling CsvProfiler categories through configuration by using the CsvProfiler/DisabledCategories array.
  • The UCLASS specifier now takes a Hidden flag. This maps directly to the ClassFlags Enum CLASS_Hidden flag. Adding this flag will hide the given class from any class browser in the editor.
  • Introduced Garbage Collector History. Garbage Collector can now store information about its previous runs which can then be used to track down UObject memory leaks.
  • The ReferenceChainSearch class will no longer store raw pointers to UObjects when constructing reference chains and instead will only preserve basic information about UObjects separate from UObjects themselves.
  • Downgraded level leak asserts to errors when PendingKill is disabled.
  • Updated to Oodle 2.9.5 SDK. Oodle 2.9.5 provides significantly faster rate-distortion optimized texture encoding.
  • Added a UnrealTraceServer.exe to the binary build. UnrealTraceServer is the tool that records traces for profiling purposes.
  • Added functionality to Allow Cast to gracefully handle an interface instance that's not a UObject.
  • ISPC support has been added for double versions of core types.
  • Traced a timing event for each task's start-end interval.
  • Added a template VariantStructure as an alternative to the template BaseStructure that provides access to script structs for f and d LWC variant types.
  • In the PathPermissionList class a const FName reference is now used instead of FName in iterators whenever it is possible.
  • Added support for values larger than 2 GB in the Derived Data Cache.
  • Added compression to the Derived Data Cache, reducing its size by 65-75%.
  • Added the ability to configure Task priorities from config files.
  • Made the scrollableFormatting and reverseSortRows properties of the SummaryTable able to be set in XML.
  • Added listSummaryTables option to list the available summary tables in the current ReportXML, then Output the report XML filename and report graphs filename to the log.
  • TPromise can now use non default constructible types.
  • Added support for more than two sticky columns in collated summary tables. New format info for columns have been created to replace the "lowIsBad" list. This provides specifying auto colorization rules and numerical formatting.
  • Added support for multiple section boundaries, and minor (dashed line) section boundaries Section boundaries no longer require startToken or endToken. Section boundaries now can be specific to collated or full tables
  • Added a minFrameCount param which filters out rows from the summary table based on frame count. This allows us to filter out bad CSVs. This works after the cache reads, so bad PRCs will also be filtered out.
  • Added maxFileAgeDays argument. CSV or PRC files older than the specified parameter will be ignored. This is faster than querying timestamp metadata, especially when reading from network drives.
  • Added input format detection for csvConvert. If not specified, input format and compression will be used for output.
  • Added setMetadata key/value argument for overwriting metadata, and ensured the command line metadata is written at the end when writing in .csv format.
  • PerfReportTool - hitchSummary - add summary table metrics for hitches of thresholds up to 1000ms at 100ms intervals. The new metrics are named Hitches>Xms.
  • Improvement:
  • Improved debugger visualization of TStaticArray.
  • Moved the FResourceSizeEx into its own cpp file so modifying the header isn't a full recompile.
  • Upgraded the engine's version of the third-party OpenEXR libraries to 3.1.1.
  • Moved GChaosMode state onto the heap to save on the static memory footprint.
  • Made FrameRate, Timecode, and TimeManagement work better with NTSC and/or drop frame timecode and frame rates.
  • Added quotation marks around strings from failed comparisons during automation tests to aid readability.
  • Added more heterogeneous string encoding overloads of FGenericPlatformStricmp::Strnicmp.
  • Reimplemented TSharedPtr reference counting using std::atomic and more optimal memory ordering in ESPMode::ThreadSafe mode.
  • Standardized the null smart pointer .natvis to say "nullptr" instead of "Null".
  • Improved performance, reduced code bloat, and simplified searching for non-constexpr constants by adding appropriate use of

New in Unreal Engine 5.0.0 Early Access (Apr 27, 2022)

  • Key new features:
  • Next-generation real-time rendering:
  • Unreal Engine 5 introduces a collection of groundbreaking features for rendering real-time worlds in incredible high-fidelity detail.
  • First off, there’s Lumen—a fully dynamic global illumination solution that enables you to create believable scenes where indirect lighting adapts on the fly to changes to direct lighting or geometry—for example, changing the sun’s angle with the time of day, turning on a flashlight, or opening an exterior door. With Lumen, you no longer have to author lightmap UVs, wait for lightmaps to bake, or place reflection captures; you can simply create and edit lights inside the Unreal Editor and see the same final lighting your players will see when the game or experience is run on the target platform.
  • Not to be outdone, UE5’s new virtualized micropolygon geometry system, Nanite, gives you the ability to create games and experiences with massive amounts of geometric detail. Directly import film-quality source art comprised of millions of polygons—anything from ZBrush sculpts to photogrammetry scans—and place them millions of times, all while maintaining a real-time frame rate, and without any noticeable loss of fidelity.
  • Specifically designed to work well with Lumen and Nanite, Virtual Shadow Maps (VSMs) provide plausible soft shadows with reasonable, controllable performance costs. Nanite and VSMs intelligently stream and process only the detail you can perceive, largely removing poly count and draw call constraints, and eliminating time-consuming work like baking details to normal maps and manually authoring LODs—freeing you up to concentrate on creativity.
  • Next-generation consoles come with next-generation player expectations. Players demand frame rates of 60 fps or more on high-resolution displays, putting an enormous strain on rendering resources. With Temporal Super Resolution (TSR), a built-in, platform-independent, high-quality upsampling system, the engine can render at much lower resolution but with similar output pixel fidelity to frames rendered at a higher resolution. The result? Better performance.
  • New Open World toolset:
  • One of our ongoing goals is to make the creation of Open Worlds faster, easier, and more collaborative for teams of all sizes. With Unreal Engine 5, a new World Partition system changes how levels are managed and streamed, automatically dividing the world into a grid and streaming the necessary cells.
  • Team members can now also simultaneously work on the same region of the same World without treading on each other’s toes, thanks to a new One File Per Actor (OFPA) system, while with Data Layers, you can create different variations of the same world—such as daytime and nighttime versions, or intact and broken geometry—as layers that exist in the same space.
  • And finally, we’ve laid the groundwork for creating absolutely massive worlds in UE5—without the need for rebasing or other tricks—with initial support for Large World Coordinates (LWC), which uses double-precision values under the hood.
  • Built-in character and animation tools:
  • Constantly round-tripping with a DCC package to tweak and iterate on animation is time-consuming, tedious, and inefficient. With Unreal Engine 5, you can animate in context, reuse existing animations, and adapt animations to suit gameplay conditions at runtime.
  • For animation authoring, there’s a powerful new suite of artist-friendly tools that enable you to work directly in the Unreal Editor. Highlights include the ability to quickly and easily create rigs and share them across multiple characters with the enhanced, production-ready Control Rig, then animate them in Sequencer, where you can save and apply the poses with the new Pose Browser, and apply blended keys with undershoot or overshoot using the Tween tool.
  • When time is of the essence, why reinvent the wheel? In UE5, an entirely new retargeting toolset enables you to quickly and easily reuse and augment existing animations. With IK Retargeter, you can transfer animations between characters with different skeletons and proportions—you could even retarget a human’s animation to a wolf, for example. Meanwhile, IK Rig enables you to do things like adjusting a character’s animation additively, such as making a moving character always look at a target.
  • There are also a number of new features that you can use to adjust animations at runtime to compensate for different gameplay scenarios—such as different speeds or terrains—for better believability and immersion. Motion Warping enables you to dynamically adjust a character’s root motion to align to different targets—for example, vaulting over walls of different heights—with a single animation. Meanwhile, you can use Distance Matching to control the play rate of an animation, and/or Pose Warping to dynamically adjust the pose to better match the motion of the in-game character.
  • In-editor modeling, UV editing, and baking:
  • Animation is not the only area where you’ll need to spend less time round-tripping with a DCC package. UE5 sees a significantly expanded and enhanced toolset for mesh modeling, UV editing, and baking; they combine to form a powerful workflow that enables artists to develop and refine assets right in the Unreal Editor. These tools are particularly useful when working with dense meshes, such as those generated using photogrammetry tools like RealityCapture or by kitbashing Quixel Megascans.
  • There’s a massive array of new and enhanced tools for mesh creation and editing, representing a fundamental leap forward. These updates—which also include multiple enhancements to core modeling, sculpting, and remeshing and simplification—are supported by architectural advancements that create the framework for future tools. Watch this space!
  • Equally importantly, we've significantly updated and expanded the suite of UV editing tools. A new UV Editor panel offers support for laying out, selecting, transforming, and cutting and sewing UVs in 2D space; viewing, copying, adding, and removing UV channels; automatic unwrapping; and previewing in 3D with a checker or custom texture. There are also improvements to Project UV and Auto UV.
  • Last but not least, the baking and mesh attributes toolset has been significantly expanded. The new baking tools offer improvements in normal, AO, and vertex baking, while multi-sampling, texture filtering, UV layers, and N to 1 baking are also key features of the updated toolset.
  • Enhanced editor UI and workflow:
  • It’s time for a makeover! Unreal Engine 5 sports a modernized appearance, streamlined workflows, and optimized use of screen real estate, making it easier, faster, and more pleasing to use.
  • With Quixel Bridge now fully integrated, you have direct drag-and-drop access to the entire Megascans library, with no separate download steps. It’s part of the new Create menu that offers a single location for acquiring content and creating and placing Actors, with easy drag-and-drop workflows and one-click access to recently used Actors making it much faster and easier to populate your scene.
  • To free up more space for viewport interactions while still keeping tools and content within easy reach, we’ve added the ability to easily summon and stow the Content Browser via a hotkey or button and to dock any editor tab to a collapsible sidebar.
  • In addition, there’s faster access to the properties you’re looking for in the Details panel, with both a favoriting system that keeps frequently used properties at the top of the panel, and a new Section bar for one-click access to groups of related properties.
  • And finally, there’s a faster, easier workflow for creating new projects from a single unified screen.
  • Fully procedural audio engine:
  • With UE5, we’re introducing a fundamentally new way of making audio. MetaSounds is a high-performance system that offers complete control over audio DSP graph generation of sound sources, letting you manage all aspects of audio rendering to drive next-generation procedural audio experiences.
  • MetaSounds is analogous to a fully programmable material and rendering pipeline, bringing all the benefits of procedural content creation to audio that the Material Editor brings to shaders: dynamic data-driven assets, the ability to map game parameters to sound playback, huge workflow improvements, and much more.
  • Stunning final-pixel imagery:
  • Introduced in Unreal Engine 4.27, the Path Tracer is a DXR-accelerated, physically accurate progressive rendering mode that requires no additional setup. For those creating still imagery or linear content, it enables you to produce offline renderer-quality imagery right from Unreal Engine, and in a fraction of the time.
  • In Unreal Engine 5, the Path Tracer delivers enhancements in stability, performance, and feature completeness, including support for hair primitives and the eye shader model, and improvements in sampling, BRDF models, light transport, supported geometries, and more.

New in Unreal Engine 4.27 (Oct 21, 2021)

  • nDisplay enhancements:
  • Applications that use multi-display rendering, including in‑camera VFX, are now much easier to set up, with a 3D Config Editor and consolidated access to all nDisplay-related features and settings in a single UAsset. There's also support for OpenColorIO for accurate color calibration, and Beta support for multi-GPU rendering, together with easier multi-camera configuration.
  • Extended virtual production toolset:
  • Enhancements to support in-camera VFX and other on-set virtual production workflows include a new drag-and-drop remote control web UI builder and a significantly improved, production-ready Virtual Camera system. There's also Beta support for Level Snapshots, enabling you to save and restore the state of a given level, and for the production of correct motion blur for traveling shots.
  • Production-ready Pixel Streaming:
  • Pixel Streaming is now production-ready, with a host of quality improvements and an upgraded version of WebRTC. In addition, we’ve added support for Linux. This powerful technology enables Unreal Engine and applications built on it to run on a high-powered cloud virtual machine and to deliver the full-quality experience to end users anywhere on a normal web browser on any device.
  • Oodle and Bink now included:
  • With RAD Game Tools joining the Epic Games family, the Oodle Compression Suite and Bink Video codec are now available in Unreal Engine out of the box, putting some of the fastest, most efficient, and most popular compression and encoding tools in the industry into the hands of Unreal Engine developers for free. The tools run on all Unreal Engine-supported platforms.
  • Enhanced GPU Lightmass (Beta):
  • GPU Lightmass is a light-baking solution that uses the GPU, as opposed to the CPU, to progressively render pre-computed lightmaps at significantly faster speeds, leveraging the latest ray tracing capabilities with DirectX 12 (DX12) and Microsoft's DXR framework. With this release, GPU Lightmass offers support for many more features, together with increased stability and reliability.
  • Path Tracer for final pixels (Beta):
  • The Path Tracer is a DXR-accelerated, physically accurate progressive rendering mode that can be easily enabled with a single button push. With many improvements in this release, you can now use it to create final-pixel imagery comparable to offline renderings, including compromise-free global illumination, physically correct refractions, super-sampled anti-aliasing, and much more.
  • Datasmith enhancements:
  • We’ve significantly extended Datasmith Runtime, which enables users to import .udatasmith data into a packaged application built on Unreal Engine. We’ve also added Direct Link functionality to a new Archicad Exporter plugin and to the existing Rhino and SketchUp Pro plugins, enabling users to maintain a live connection between a source DCC tool and an Unreal Engine-based application.
  • Improved USD and Alembic support (Beta):
  • With Unreal Engine 4.27, it’s possible to export many more elements to USD, including Levels, Sublevels, Landscape, Foliage, and animation sequences, and to import materials as MDL nodes. You can now also edit USD attributes from the USD Stage Editor, including through Multi-User Editing. In addition, it’s now possible to bind hair and fur Grooms to GeometryCache data imported from Alembic.
  • Enhanced workflows for extended reality:
  • It's now easier to create XR (VR, AR, and MR) content in Unreal Engine. Our OpenXR plugin, which enables you to target multiple XR devices with the same API, is now production-ready and offers support for additional features. We've also redesigned the VR and AR templates to offer more built-in features and easier setup, giving you a faster way to get started with your projects.
  • Easier still image rendering (Beta):
  • We've added the ability to use Movie Render Queue to render from multiple cameras as a batch process, without having to go through complicated Sequencer setups. This makes it easy to repeatedly create a series of large stills from different viewpoints, as you work through variations or iterations—ideal for architectural, automotive, or product design deliverables.
  • Visual Dataprep enhancements:
  • We’ve continued to extend the Visual Dataprep feature, with new operators and filters, support for Actor Components, an enhanced user experience, and more. Visual Dataprep enables you to easily automate the process of importing and preparing your 3D data by building ‘recipes’ using an intuitive visual drag-and-drop UI and a variety of operators and selection filters.
  • Support for Unreal Engine containers (Beta):
  • Support for containers on Windows and Linux enables Unreal Engine to act as a powerful self-contained foundational technology layer, paving the way for new cloud-based development workflows and deployment strategies—such as Pixel Streaming, CI/CD, AI/ML training, batch processing and rendering, and microservices—and enhanced production pipelines.