GregOrigin - TargetFrame: Automatic runtime scalability for mainstream PC's

Watch it in action

Read the manual

A functional open source version is available at https://github.com/gregorik/TargetFrame-Core, please file Issues there if appropriate. Fab hosts the fully featured Pro version. The manual reflects the Pro feature set.

TargetFrame is an automatic, zero-configuration runtime scalability management system for Unreal Engine 5.6+. Stop guessing what settings your players need: TargetFrame automatically benchmarks hardware, sets a stable baseline, and dynamically steps down resolution scale and overall quality during gameplay to defend your target frame rate.

Designed to eliminate "stuttering" reviews on launch day, this plugin handles the dirty work of performance scaling so you can focus on building your game.

Key Features

πŸ›‘οΈ Runtime Governor

Never drop below your target frame rate during a boss fight again. The Runtime Governor constantly monitors the smoothed FPS. If the frame rate drops below your configured threshold for a sustained period, the Governor steps in to automatically lower the ResolutionScale and OverallQuality step-by-step until the target FPS is restored. When the action cools down, it smoothly scales back up to maximize visual fidelity.

⚑ Auto-Benchmarking & Tiering

On boot, TargetFrame Core runs a fast, non-intrusive hardware scan. It assigns the machine to a hardware tier (Entry, Mainstream, Performance) based on CPU cores, RAM, and GPU capabilities. It automatically applies the recommended settings for that tier without the player ever having to open an Options menu.

πŸ“¦ Fire-and-Forget Shipping Capsule

Hate writing custom save-game logic for graphics settings? The Fire-and-Forget Shipping feature completely abstracts scalability. The plugin automatically locks in the optimal settings after an initial "stabilization period," giving players a consistently smooth experience out-of-the-box.

πŸ”² Upscaler-Safe UI

Upscaling a 1080p render to 4K is great for performance, but it can make your UI text look like a blurry mess. TargetFrame Core automatically separates your UI rendering from your 3D scene rendering. The 3D scene scales dynamically, while your Slate/UMG UI remains locked at crisp, native resolution.

  • Dynamic Nanite Budgeting: Instead of brutally dropping the global scalability level, the Pro version surgically relaxes Nanite's MaxPixelsPerEdge and time budgets during heavy scenes, keeping your shadows and post-processing intact while slightly reducing distant geometric density.

  • Hardware Ray Tracing Guards: Lumen Hardware Ray Tracing is gorgeous but demands massive VRAM. The Pro version automatically intercepts the boot sequence, checks the physical VRAM and GPU capabilities, and gracefully falls back to Software Ray Tracing if the player's hardware would crash or stutter.

  • VRAM Exhaustion Protection: Automatically clamps Texture Pool sizes and disables memory-hungry features like Nanite Tessellation on hardware with 8GB of VRAM or less to prevent catastrophic Out of Video Memory crashes.

  • Vendor-Specific Profiles: Detects Intel ARC, AMD, and NVIDIA GPUs, applying specific capability maximums and dynamic resolution preferences to avoid known driver performance cliffs.

  • CSV Telemetry Export: Automatically writes detailed frame-time data, intervention logs, and hardware specs to CSV files during playtests, making it incredibly easy for your QA team to identify performance bottlenecks.

Update 0.2.0 β€” 2026-03-21


Fixes

  • FSR version ordering β€” DeterminePreferredUpscaler now evaluates FSR3 > FSR2 > FSR in both vendor-specific and generic fallback paths. Previously FSR (1.0) could be selected over FSR3 when all three were available. (TargetFrameSubsystem.cpp)

  • DLSS excluded from runtime quality adjustment β€” TryAdjustUpscalerQuality guarded against all modes except FSR variants, silently skipping DLSS and XeSS. Changed to a blacklist of Native/TSR so every vendor upscaler participates in the runtime ladder. (TargetFrameSubsystem.cpp)

  • Widget "Skip Onboarding" opened control panel β€” HandleSkipOnboarding called SetControlPanelVisible(true) and RefreshPresentation() after dismissing the wizard, unexpectedly showing the control panel. Removed both calls so "Skip" truly dismisses. (TargetFrameUserExperienceWidget.cpp)

  • GPU vendor detection false positives β€” DetectGPUVendor matched the substring "arc" (hitting "search", "march", etc.) and "uhd" (hitting "Thunderbolt"). Tightened to "intel arc" and "uhd graphics". (TargetFrameSubsystem.cpp)

  • Asymmetric quality step ladder β€” StepQualityUp applied knobs in the same order as StepQualityDown. Reversed to overall quality > Nanite > resolution > triangle cull > upscaler, so the cheapest-to-restore knob is raised first. (TargetFrameSubsystem.cpp)

  • Redundant hardware snapshot refreshes β€” ApplyCurrentPolicy and EvaluateRuntimeBudget each called RefreshHardwareSnapshot() despite Initialize already doing so. Removed the duplicate calls. (TargetFrameSubsystem.cpp)

  • OverallQualityLevel exposed raw -1 to Blueprint β€” GetOverallScalabilityLevel() returns -1 for "Custom". LoadStateFromGameUserSettings now maps -1 to FallbackOverallQualityLevelWhenCustom before writing Status.OverallQualityLevel, so Blueprint consumers never see a sentinel value. (TargetFrameSubsystem.cpp)

  • CanReduceCostFurther / CanIncreaseQualityFurther ignored activatable upscalers β€” Both functions checked IsVendorUpscalerActive(), missing upscalers that were available but not yet activated. Changed to DeterminePreferredUpscaler() != Native/TSR so an available vendor upscaler is correctly treated as a quality knob. (TargetFrameSubsystem.cpp)

Performance

  • Debounced SaveCurrentSettings disk writes β€” Runtime governor adjustments (TryAdjustResolutionScale, TryAdjustOverallQuality) now call MarkSettingsDirty() which updates local state immediately but defers ApplySettings + SaveSettings to disk. FlushDirtySettings() fires every 5 seconds when dirty, and is guaranteed to flush in Deinitialize(). One-shot operations (ApplyCurrentPolicy) still save immediately. (TargetFrameSubsystem.h, TargetFrameSubsystem.cpp)

  • Reduced hardware benchmark work scale β€” RunHardwareBenchmark work scale lowered from 10 to 5, cutting the synchronous hitch roughly in half. Added a UE_LOG Warning advising callers to run the benchmark during a loading screen. (TargetFrameSubsystem.cpp)

  • Hitch rejection for EMA β€” Tick frames longer than HitchThresholdSeconds (default 0.1 s) are excluded from the SmoothedFPS exponential moving average, preventing load spikes or hitches from triggering false quality step-downs. (TargetFrameSubsystem.cpp)

  • Telemetry snapshot throttle β€” RecordTelemetrySnapshot was called every tick. Now gated behind TelemetrySnapshotIntervalSeconds (default 1.0 s) to reduce CSV profiler overhead. (TargetFrameSubsystem.cpp)

  • Capability probe cached β€” ProbeProjectCapabilities now sets bCapabilitiesProbed on first run and early-exits on subsequent calls, avoiding repeated CVar lookups. (TargetFrameSubsystem.cpp)

New Features

  • XeSS upscaler support β€” Added ETargetFrameUpscalerMode::XeSS and full integration: capability probing (r.XeSS.Enabled / r.XeSS.Quality), preferred-on-Intel selection in DeterminePreferredUpscaler, ApplyXeSSState / GetXeSSQualityModeValue implementations, runtime status refresh, and vendor-active checks. Controlled by bPreferXeSSOnIntel in DeveloperSettings. (TargetFrameTypes.h, TargetFrameDeveloperSettings.h, TargetFrameSubsystem.h, TargetFrameSubsystem.cpp, DefaultTargetFrame.ini)

  • Runtime governor pause/resume β€” SetRuntimeGovernorPaused(bool) BlueprintCallable on the subsystem, plus PauseTargetFrameGovernor / ResumeTargetFrameGovernor static wrappers in the Blueprint library. Consecutive-sample counters reset on resume to prevent stale readings from triggering immediate adjustments. (TargetFrameSubsystem.h, TargetFrameSubsystem.cpp, TargetFrameBlueprintLibrary.h, TargetFrameBlueprintLibrary.cpp)

  • ResetToDefaults β€” BlueprintCallable that restores managed triangle-cull states, clears all runtime overrides, resets Status, and re-probes capabilities. Wrapped as ResetTargetFrameToDefaults in the Blueprint library. (TargetFrameSubsystem.h, TargetFrameSubsystem.cpp, TargetFrameBlueprintLibrary.h, TargetFrameBlueprintLibrary.cpp)

  • Policy-changed delegate β€” OnPolicyChanged (FTargetFramePolicyChangedDelegate) BlueprintAssignable multicast delegate fires on every RecordPolicyAction call with the action string and reason, enabling Blueprint-side reactions to policy changes. (TargetFrameSubsystem.h, TargetFrameSubsystem.cpp)

  • Frame-rate clamping β€” When bClampFrameRateToTarget is enabled, SetTargetFPS and ApplyCurrentPolicy set t.MaxFPS to match the target, preventing the engine from rendering frames above the budget target. (TargetFrameDeveloperSettings.h, TargetFrameSubsystem.cpp, DefaultTargetFrame.ini)

Build & Packaging

  • UMG dependency scope β€” Moved "UMG" from PublicDependencyModuleNames to PrivateDependencyModuleNames since only the widget implementation uses it. (TargetFrame.Build.cs)

Example project generators seen in videos:

CreateTargetFrameExperienceWidget.py (18.1 KB)
CreateTargetFrameShowcaseMap.py (2.2 KB)
CreateTargetFrameTestMap.py (1.0 KB)
TargetFrameMap.zip (76.7 KB)

0.3.0 Changelog, 23 April 2026

This release is a major step towards a more user-friendly, definitive scalability solution. Enjoy!

Settings

  • Simple Mode settings surface β€” Added a new Simple Mode layer in Project Settings > Plugins > TargetFrame for target FPS, quality bias, first-launch benchmark behavior, runtime adaptation, low-VRAM and integrated-GPU protection, crisp UI handling, stabilization lock, telemetry, and opt-in vendor upscaler or triangle culling support. The existing detailed policy controls now live under Advanced Mode categories and remain available for full tuning.
  • CPU Tick & Animation Governor β€” TargetFrame now detects when the game is CPU-bound (by comparing total frame time to GPU frame time). When CPU-bound, the governor steps down CPU-intensive scalability groups (sg.FoliageQuality and sg.ViewDistanceQuality) first, avoiding unnecessary degradation of GPU features like resolution scale and upscaler quality.
  • Virtual Shadow Map Guardrails β€” Added bManageVirtualShadowMaps to the Vendor and Memory Policy. When in low-VRAM mode, the policy dynamically reduces r.Shadow.Virtual.MaxPhysicalPages (defaulting to 1024) to prevent VSMs from blowing out the VRAM budget.

Sample Project Improvements

  • CPU & GPU Stress Showcase β€” The TF_TargetFrameShowcase map now natively stresses both the GameThread and VRAM. Upgraded ATargetFrameShowcaseActor to spawn an intense 420-element ticking geometry swarm (driving CPU load) and enabled shadows on all dynamic orbit point lights (driving Virtual Shadow Map pressure). This creates a realistic, demanding environment that clearly demonstrates the new CPU Governor and VSM guardrails in action.

Fixes

  • UE 5.7 descriptor alignment β€” Updated TargetFrame.uplugin to declare EngineVersion: 5.7.0 so the plugin matches the sample project and no longer risks a first-run compatibility rejection when the project is opened in UE 5.7.
  • Fire-and-forget startup target preserved β€” ScalabilityGameInstance no longer forces StartupTargetFPS back over a fire-and-forget hardware-tier recommendation during startup. Sample projects now keep the wizard-selected 45/60/90 FPS target unless the manual startup path is being used intentionally.
  • Onboarding action uses the dedicated beginner alias β€” The runtime onboarding action now calls RunTargetFrameSetupWizard instead of the lower-level StartTargetFrame, keeping the widget behavior aligned with the documented beginner Blueprint API and the intended fire-and-forget setup path.

UX and Workflow

  • Editor-side Beginner Setup Wizard β€” Added a true Window > TargetFrame Beginner Setup Wizard editor entry that opens a branded dark blue and cyan setup tab with embedded TargetFrame logo art from the plugin resources. The window is now project-aware: it shows sample availability, can stay on the current map for real project work, can switch from the showcase to the test map when that is the better sample path, can reset first-run onboarding, start PIE, reopen the runtime wizard and panel in active PIE, re-run the recommended setup, refresh readiness, and jump straight to Project Settings > Plugins > TargetFrame.
  • Project-aware one-click beginner flow β€” Added Run Beginner Flow to the editor wizard. It resets onboarding, chooses the right map for the current context, starts PIE, waits for the runtime widget when present, applies the recommended setup automatically, and falls back to the Blueprint library path on maps that do not create the sample overlay.
  • Friendly Blueprint setup alias β€” Added RunTargetFrameSetupWizard, displayed in Blueprint as Run TargetFrame Setup Wizard, as the beginner-facing one-node alias for StartTargetFrameFireAndForget.
  • Automatic setup readiness card β€” Added a Blueprint-readable project check report and a Check This Project node for explicit readiness validation. In the included runtime widget this report now appears as an automatic Setup readiness card that refreshes while the panel is open, leads with a plain-language readiness state, and moves lower-level issue detail behind Show advanced details.
  • Beginner-focused onboarding and confirmation flow β€” Reworded the first-run TargetFrame widget around PC class, memory guide, recommended target, and simple next steps. After Use recommended setup, the widget now pauses on a confirmation state with Keep this setup, Show settings, and Start over instead of immediately dumping users into the full control panel.
  • Less engine-centric user-facing labels β€” Renamed the runtime widget presentation layer around player-readable concepts such as Recommended setup, Current status, Quick choices, Why this setup, Advanced details, and Setup readiness. Technical C++ names, config keys, status fields, and Advanced Mode settings remain unchanged.
  • Intent-first preset labels β€” Quick choices now lead with Lowest load, Most stable, Balanced, and High refresh, with the FPS target shown secondarily.
  • Setup Wizard main surface β€” Reordered the runtime panel around the beginner path: recommendation first, current status second, quick FPS choices third, setup reasoning fourth, and optional advanced details collapsed by default.
  • Showcase launcher wording β€” The showcase still avoids a blocking first-run modal, but the launcher now offers Get Recommended Setup until onboarding is completed, then switches to Open TargetFrame.
  • Regenerated sample widget asset β€” Rebuilt WBP_TargetFrameExperience from Scripts/CreateTargetFrameExperienceWidget.py so the saved UMG asset matches the current runtime code, labels, onboarding flow, and readiness-card presentation.

Documentation

  • Manual updated for the current beginner flow β€” Docs/TargetFrameManual.html now documents the project-aware editor wizard, one-click Run Beginner Flow, the live Use recommended setup path, the automatic Setup readiness card, intent-first preset labels, Get Recommended Setup, and the post-setup confirmation state.
  • FAQ aligned to the new flow β€” Docs/TargetFrameFAQ.html now explains the project-aware Beginner Wizard, automatic readiness behavior, confirmation-state buttons, intent-first preset labels, and the current UE 5.7 sample project state.
  • Expanded beginner quick start guidance β€” The current documentation now walks users through launching the sample or their own map, running the beginner flow, reading the recommendation, confirming the setup, reopening the panel with F10, and understanding when to use the editor wizard versus the live widget.

0.3.1 Changelog, 2026-04-23

This includes both requested features, and quick fixes needed after 0.3.0.

Added

  • Added a proper bDisableInEditor setting to TargetFrame so editor sessions can cleanly skip subsystem startup, automatic setup, policy application, and runtime governor work without hardcoded editor guards.
  • Added recommendation-preview support, baseline snapshot capture and restore, built-in TargetFrame presets (Laptop Safe, Showcase, QA 60 FPS, and Shipping Conservative), project-fix actions for Check This Project, structured policy history entries, map and world filters, PIE benchmark deferral, and lightweight policy-change notifications across the TargetFrame runtime.
  • Added Blueprint accessors for recommendation preview, baseline restore, built-in preset apply, project-fix application, and temporary editor-session overrides so the runtime UI and editor wizard can share the same workflows.
  • Added editor-wizard controls to temporarily enable TargetFrame for the current editor session, preview the recommended setup in PIE, load named presets, restore the captured baseline snapshot, and re-run readiness checks without changing project defaults.

Changed

  • Updated the sample project’s DefaultTargetFrame.ini override to set bDisableInEditor=True, so TargetFrame stays off by default in editor and PIE unless explicitly re-enabled for testing.
  • Updated the subsystem status summary so editor-disabled, filtered, benchmark-deferred, and observation-only sessions report explicit inactive reasons with clearer next-step guidance.
  • Updated the runtime widget to surface clearer inactive-session reasons, recommendation previews before apply, a live Setup readiness card, structured policy history in the advanced details area, and one-click fix actions from the readiness card.
  • Updated the runtime onboarding and quick-choice UX to use beginner-facing labels such as Get Recommended Setup, Use recommended setup, Current status, Quick choices, Why this setup, and the intent-first preset labels Lowest load, Most stable, Balanced, and High refresh.
  • Updated the post-setup flow so Use recommended setup now pauses on a confirmation state with Keep this setup, Show settings, and Start over instead of immediately dropping users into the full control panel.
  • Refreshed the editor-side Beginner Setup Wizard into a more project-aware surface with Run Beginner Flow, live PIE control buttons, clearer editor-session rule messaging, sample-map awareness, and richer feedback inside the window.
  • Regenerated WBP_TargetFrameExperience from Scripts/CreateTargetFrameExperienceWidget.py so the saved widget asset matches the current runtime UI, onboarding flow, readiness card, and preset labels.
  • Updated the plugin descriptor and packaging filter for the UE 5.7 sample/Fab path by refreshing TargetFrame.uplugin metadata and tightening FilterPlugin.ini to the shipped descriptor, source, config, and official resource files only.

Fixed

  • Fixed ScalabilityGameInstance so a fire-and-forget recommendation no longer gets overwritten by StartupTargetFPS during startup; the sample project now keeps the wizard-selected target unless the manual startup path is being used intentionally.

Documentation

  • Updated Docs/TargetFrameManual.html and Docs/TargetFrameFAQ.html to document the project-aware editor wizard, Run Beginner Flow, the Use recommended setup confirmation step, the automatic Setup readiness card, intent-first preset labels, and the current sample-project flow.

Video update on 0.3: https://www.youtube.com/watch?v=BeoDgp0lFSA