Back to Blog
    Last Week in Unreal

    Last Week in Unreal — Feb 23 – Mar 1, 2026

    Abraham KUpdated 12 min read
    Last Week in Unreal — Feb 23 – Mar 1, 2026

    Unreal Engine Weekly — What Changed and What Matters

    Week of Feb 23 – Mar 1, 2026 | 935 commits analyzed | Branch: ue5-main


    Overview

    An active week on ue5-main, with the heaviest concentration in rendering — specifically Lumen, MegaLights, and Nanite Ray Tracing. Epic’s graphics team is in full hardening mode: memory reductions, cross-vendor correctness fixes, and the kind of infrastructure work that precedes a production launch for Nanite RT. Outside rendering, UHT codegen got a meaningful binary-size optimization, the shader loading pipeline gained memory-mapped archive support, and PCG landed its first manual data override system. A cluster of memory safety and crash fixes across Chaos, Slate, Asset Registry, and animation deserves attention from anyone triaging production stability.

    The mobile Bloom dynamic resolution saga — submitted, backed out, resubmitted, backed out again — remains unresolved and is worth avoiding on ue5-main for now.


    TL;DR

    • Lumen and MegaLights received aggressive memory and correctness fixes — the MegaLights UNORM packing bug caused visible artifacts specifically on AMD GPUs and is worth pulling if you ship on that hardware.
    • Nanite Ray Tracing gained reference instance support for BLAS streaming, signaling a move from experimental to shippable infrastructure.
    • UHT codegen consolidation removed 5,000 DLL exports from the largest game module — a real link-time and binary-size win for large projects.
    • NVIDIA contributed Linear Swept Spheres for hair ray tracing with full D3D12 and Vulkan support — meaningful for teams doing high-fidelity character rendering.

    Rendering Performance

    Lumen and MegaLights Stability Hardening

    What changed. The Lumen surface cache atlas was reduced from 4096 to 3584 on High scalability, and FCardPageRenderData was restructured to eliminate a 2.5KB-per-card FViewMatrices member — cutting async task time from 1.66ms to 1.43ms. An on-screen warning now fires when the atlas is oversubscribed. The HWRT FarFieldBias default increased from 200 to 500 to reduce self-occlusion from far-field geometry. CachedLightingPreExposure was unified across SkyLight and Lumen with a lower default. A race condition where Lumen card PSO re-addition from an RT task could overlap with RDG setup was fixed with a critical section.

    On the MegaLights side, a UNORM packing bug in the denoiser temporal accumulation was fixed. The DX spec allows 0.6 ULP error in UNORM packing, which manifested as border artifacts specifically on AMD GPUs. A separate fix addressed an invalid upsampling mask caused by negative zero being treated as zero by some shader compilers. A packed FLightSamples conflict between bCastVolumetricShadow and bGuidedAsVisible was resolved, along with an unsigned cast bug causing first-frame history corruption.

    Why this is important. The memory reductions are practical wins for console-class hardware where Lumen’s footprint is a real budget concern. The MegaLights AMD artifact is the kind of cross-vendor correctness issue that silently ships in production — it was caused by spec-legal GPU behavior, not a driver bug. The race condition fix addresses a crash that would only appear under specific timing conditions, making it hard to reproduce and diagnose.

    Who should care. Graphics engineers shipping Lumen on console. Teams targeting AMD desktop GPUs with MegaLights. Anyone seeing intermittent crashes during Lumen card rendering.

    Urgency. Act now if you ship Lumen on AMD hardware. Track for console memory optimization.


    Nanite Ray Tracing Infrastructure

    What changed. A new “Reference Instance” concept was added per Nanite resource to drive BLAS cut selection and streaming decisions. Streaming priority now distinguishes visible versus offscreen instances, and renamed CVars signal API stabilization. Nanite Lumen Card PSOs can now be marked optional during precaching, allowing meshes to render with NaniteShading first and defer LumenScene addition until card PSOs are ready.

    Why this is important. This is infrastructure work, not feature work — and that is the point. Reference instances, streaming-aware priority, and optional PSO precaching are the kinds of plumbing decisions that get made when a system is transitioning from experimental to production. Teams evaluating Nanite RT should understand that the API surface is stabilizing.

    Who should care. Graphics engineers evaluating Nanite RT for production. Teams using Nanite and Lumen together.

    Urgency. Track.


    Linear Swept Spheres for Hair Ray Tracing

    What changed. NVIDIA contributed LSS (Linear Swept Sphere) primitive support for ray tracing acceleration structures, specifically targeting hair strand geometry. The change spans 36 files across the HairStrands plugin, D3D12RHI, VulkanRHI, PathTracing, and shader code. It is hardware-gated to compatible NVIDIA GPUs, with capability flags exposed through DataDrivenPlatformInfo.

    Why this is important. LSS primitives represent hair strand geometry more accurately in ray tracing acceleration structures than the current triangle-based approximation. For teams doing ray-traced hair shadows and reflections on high-fidelity characters, this is a quality improvement. It is vendor-specific, so it does not replace existing paths — it augments them on supported hardware.

    Who should care. Character and grooming technical artists. Graphics engineers shipping ray-traced hair on NVIDIA hardware.

    Urgency. Track.


    Mobile Bloom Dynamic Resolution — Unresolved

    What changed. A change that moved mobile Bloom passes to fixed-size render targets with dynamic resolution viewports was submitted, backed out, resubmitted, and backed out again across four commits this week. The goal was to prevent render target reallocations during dynamic resolution changes.

    Why this is important. The repeated backouts mean this change has unintended side effects that multiple teams are hitting. It is not stable on ue5-main right now.

    Who should care. Mobile rendering engineers shipping dynamic resolution on Android or iOS.

    Urgency. Track. Do not rely on fixed-size mobile bloom render targets in ue5-main until this stabilizes.


    Build, Shader Pipeline Tooling

    PSO Precaching and Shader Infrastructure Overhaul

    What changed. Bundled file cache PSOs are now routed through the precaching thread pool so they cooperate with runtime precaching instead of competing with it. Global shader PSOs from the bundled cache are correctly marked high-priority. The shader code library now supports unmounting individual pak chunks without crashing — previously, unmounting a chunk would produce “I/O Error (Not Found)” crashes. Shader DDC records no longer store warnings, reducing DDC data size. An experimental specialization constant path for FLightGridInjectionCS reduces 128 shader permutations to 2, gated behind a CVar and off by default.

    A separate sweeping RHI-layer change introduced FShaderCodeBuffer with shared memory ownership between FRHIShaderLibrary and FRHIShader, plus an option to disable shader group compression and enable memory-mapped shader archives. This touched every RHI backend (Metal, D3D11, D3D12, Vulkan, OpenGL). Memory-mapped shader loading eliminates shader decompression and copy at load time, trading disk layout constraints for startup performance. On Apple platforms, this enables shared memory ownership that avoids redundant allocations.

    Why this is important. The pak chunk unmounting crash is a shipping blocker for anyone doing chunk-based content streaming. The memory-mapped shader loading is a significant architectural decision that could meaningfully change shader load performance, particularly on mobile and Apple platforms. The DDC size reduction and specialization constant experiment are both directional — the shader pipeline is getting leaner.

    Who should care. Build and cook pipeline engineers. Teams doing chunk-based content streaming. Mobile teams. Anyone maintaining custom RHI backends.

    Urgency. Act now if you are unmounting individual pak chunks and seeing shader crashes. Track the memory-mapped shader loading path.


    UHT Codegen Consolidation

    What changed. UHT code generation was reworked to collapse inner and outer type construction into a single Z_Construct function with a boolean parameter, removing approximately 5,000 DLL exports from the largest game module. The change touched 31 files across UHT exporters, CoreUObject serialization, async loading, and ObjectMacros.h.

    Why this is important. 5,000 fewer DLL exports is a meaningful link-time and binary-size win, particularly for large projects where iteration time is bottlenecked by linking. Anyone maintaining custom UHT plugins or doing non-standard reflection should verify their codegen still works after integrating.

    Who should care. Large studios where link times matter. Teams with custom UHT plugins or non-standard reflection usage.

    Urgency. Track. Verify custom UHT plugins after integration.


    Windows ARM64/ARM64EC Build Infrastructure

    What changed. Multiple commits building out proper Windows ARM64 and ARM64EC support in UBT and the build pipeline. PGO now has initial ARM64/ARM64EC support with architecture-aware binary staging. An Arm64EC CEF crash was fixed — the embedded Chromium browser was crashing because the arm64ec variant needed a compatible EpicWebHelper.exe process. VC redistributable was updated to 14.50.

    Why this is important. Windows on ARM is becoming a real target. The CEF crash fix is particularly notable because it affects any project using the embedded web browser on ARM64 Windows.

    Who should care. Platform engineers targeting ARM64 Windows. Teams doing Remote Mac builds.

    Urgency. Track.


    Stability Fixes

    What changed. A broad cluster of memory safety and crash fixes across the engine:

    • Use-after-scope / dangling pointer in engine package cleanup — referencing out-of-scope pointers.
    • Uninitialized pointer crash in the Customizable Object (Mutable) system.
    • Chaos API type-safety violation — casting a read-only context to read-write, a memory safety issue.
    • Slate infinite recursion in FSlateUser::ReleaseCapture causing stack overflow.
    • Asset Registry memory savings — a cherrypick saving GBs of editor memory on large projects.
    • Asset Registry integer/buffer overflow during cook on projects with many actors.
    • XAudio2 delay-load — prevents launch failure on Windows Server environments.
    • Async animation race condition in animation evaluation.
    • Zero-sized stdlib memory operations — undefined behavior caught by UBSan.
    • Texture coordinate GPU out-of-bounds sampling causing crashes.
    • FTimerManager AutoRTFM rework was added then backed out after hitting issues without test coverage.
    • Force immediate exit on crash thread deadlock — fixes zombie UE processes on Windows.
    • Verse transient type serialization — large correctness fix for how Verse classes with transient type references are serialized in cooked builds.

    Why this is important. The memory safety cluster is dense this week. The Asset Registry fixes matter most for large projects — GBs of editor memory savings and an integer overflow during cook are production-grade issues. The Chaos type-safety violation and dangling pointer fixes are the kind of silent corruption that produces hard-to-diagnose instability. The Slate infinite recursion could cause editor hangs in any project using capture-based input handling.

    Who should care. Teams with large projects (Asset Registry fixes). Anyone seeing editor memory pressure or cook failures. Teams using Chaos physics, custom animation evaluation, or Slate capture handling. Windows Server deployment (XAudio2 fix).

    Urgency. Act now if you are hitting Asset Registry memory issues in the editor or overflow during cook. Track the rest against your crash reports.


    Procedural Content Gameplay Frameworks

    PCG Data Override System

    What changed. Across roughly 12 commits, the PCG team landed a first-pass Data Override system. The core mechanic enables per-point manual delta overrides applied at a new override phase in PCGElement, with a component visualizer providing the editor front-end. Supporting commits added spline intersection improvements, texture thumbnails on PCG nodes, verbose cache stats, and polygon-aware spline-to-mesh conversion.

    Why this is important. This is the beginning of hand-editing layered on top of procedural generation — the most-requested workflow from environment artists who use PCG for scattering but need to adjust individual placements post-generation. It is explicitly labeled “First Pass, Unpolished” and the API will shift, but the architecture is unlikely to change fundamentally.

    Who should care. Environment artists and technical designers using PCG. Teams evaluating PCG for production level design.

    Urgency. Track. The API is not stable, but the direction is clear.


    Verse VM Runtime Hardening

    What changed. A dense cluster of VerseVM work: UObject shape lookups extracted into utility functions, native object fields now visible in the Verse debugger, the debugger working on server again, and handling of non-reflected prefab class shapes. A fast reinstancing path that directly swaps ClassPrivate references on existing instances was added — disabled by default because it skips construction.

    Why this is important. The VerseVM is transitioning from “it compiles and runs” to “it can be debugged and iterated on in production.” The server-side debugger fix and fast reinstancing together suggest Verse is being used in live-service contexts where compilation cycle time matters.

    Who should care. Teams planning Verse adoption. Studios evaluating Verse for live-service workflows.

    Urgency. Track.


    Platform

    Intel Mac Rendering Support Removed

    What changed. The reland of “Metal – Remove rendering support for Intel-based Macs” stripped approximately 280 lines from MetalDevice.cpp, removed Intel-specific GPU benchmark paths, and eliminated feature level workarounds.

    Why this is important. If your project or internal tooling still runs on Intel Macs — common for older CI machines, QA hardware, or remote build farms — rendering will stop working against ue5-main.

    Who should care. Studios with Intel Mac hardware in their CI, QA, or development pipelines.

    Urgency. Act now if you have Intel Macs in your workflow.


    Worth Tracking

    Compact Sets vs. Garbage Collection. Two commits reveal an active conflict between the new CompactSet container and the garbage collector’s reference elimination pass. One commit explicitly disables GC garbage reference elimination when compact sets are enabled, with a comment: “Ideally GC would automatically trigger map/set rehash when changing underlying data, so this is a temporary measure.” If you are seeing unexpected GC behavior or memory-related hitches after upgrading, this is a plausible culprit. The proper resolution — making GC trigger rehash on compact containers — is non-trivial and has not landed yet.

    Subsystem activity beneath the surface. The low-interest audit identified 10 distinct subsystem clusters with sustained commit activity: UBA (14 commits), AI Assistant (10), Sandboxed Editing (6), Dataflow (7), Interchange (10+), Mutable (10), StateTree (5), Mass Entity (7), USD Pipeline (7), and PVE (7). None of these individually rose to report level this week, but the AI Assistant cluster — building structured tool-use into the editor — and the Sandboxed Editing work — a new non-destructive editing workflow — are both worth understanding directionally. These are not experiments; they are being built methodically.


    What We Ignored

    This week we filtered 10 commits as noise and editorially dismissed all automated localization runs, gitdeps.xml-only changes, and test content updates. Beyond that, we skipped roughly 600 commits that do not meaningfully affect runtime behavior, performance, or upgrade risk. The bulk of what we ignored: Horde CI infrastructure, TEDS hierarchy work, StateTree property changes, Dataflow evaluation, Pixel Streaming 2 maintenance, Sequencer incremental improvements, Mutable system churn, Interchange format updates, OpenXR routine work, and the usual formatting and copyright updates.


    Closing

    Lumen and MegaLights are in the tightest hardening cycle we have seen — memory reductions, cross-vendor fixes, race condition patches, all in a single week. Nanite RT is quietly building toward production readiness. And the PCG data override system answers the one question every environment artist has been asking. 935 commits. The engine keeps building.

    Share this article