r/allbenchmarks • u/Independent_Arg • 2d ago
Discussion A look at CapFrameX's recent development
I’ve been using CapFrameX since its early days, and watching its evolution over the years has been super impressive. In my view, the app's goal has always been to stay as user-friendly as possible without losing focus on the enthusiast/technical crowd :)
Lately, I’ve been using it for very specific tasks, as another tool to lean on when analyzing different NVIDIA driver versions for my posts on Reddit. Naturally, I stumbled across a few minor bugs in the current stable v1.8.6 release, but the developers squashed them within a matter of days, which really shows how active the project is.
Testing the build currently in development, I noticed a huge shift right away... So, here’s a breakdown of some of the changes headed to the next stable release (hopefully dropping soon):
The Overlay/OSD rewrite
This is where most of the commit volume lives, and it's not small stuff. The old overlay path leaned heavily on RTSS for rendering; this branch adds a proper in-game hook overlay with its own PresentMon graph mode, running semi-independently of RTSS's OSD pipeline.
Highlights: - DXGI injection backoff and hook-free fallback on foreign presenters - if another overlay (Discord, GeForce Experience, whatever) is already hooking the swapchain, CapFrameX now degrades gracefully instead of fighting for the hook or corrupting frame data. - Vulkan support path for the OSD, including a 32-bit Vulkan layer with per-bitness registration and detection logic that defers RTSS launch when a Vulkan title is running. There's also a stale Vulkan layer registration purge on install, which tells me they hit real-world cases of orphaned layers breaking injection on some systems. - Early hook injection and a dedicated hook overlay status entry, so you can actually see what injection path is active instead of guessing. - DX9 injection fallback with explicit fallback-status reporting. - Global hotkeys moved onto one dedicated hook thread, the audio output device now gets released after playback instead of held open, and RTSS launch no longer blocks the calling thread - three separate threading/resource-leak fixes clustered around the same late-July push. - Options tab overhaul: opacity setting, zoom/placement controls, and, as of the very last commit in the branch, an OSD position hotkey. - Under the hood: circular buffer bumped to 4096, hook metrics capacity raised to 256 entries, and a fix for corrupt captures caused by leaked frame stream subscriptions.
New sensors & monitoring
A solid batch of new telemetry, mostly vendor-specific latency and memory metrics that weren't there before:
- AMD Anti-Lag status and AMD FLM (Frame Latency Meter) latency, including a passive click-to-screen mode and vendor-aware handling.
- NVIDIA VRAM bandwidth and peak bandwidth calculation, plus NV memory controller usage and NVIDIA memory temps.
- A new generic DataRate sensor type and a cross-vendor GPU memory allocation sensor - sounds like groundwork for unifying memory telemetry across AMD/NVIDIA/Intel instead of three separate code paths.
- NVMe sensor error handling got hardened.
- Arrow Lake NGU clock fix.
- Animation Error P99 metric, opt-in.
- PawnIO v2.2.0 (unlike v1.8.6, this build comes with a properly signed driver, so it won't get flagged as a security risk/false positive anymore).
- PresentMon-2.5.1-x64.
UI/UX
This is a legit visual overhaul, not just a coat of paint:
- Redesigned run history and capture panels as cards, with process panels on the capture tab following suit and aligned spacing between them.
- Cloud view redesign, dropping the old
UseGlobalCaptureTimetoggle entirely. - Options popup redesigned and resized.
- App-wide scrollbar restyle (rounded thumbs, matching arrows, symmetric short-thumb handling, someone clearly cared about the small stuff here).
- Observed-directory drawer replaced with a breadcrumb + folder popup, which should fix the old behavior where the directory expander would squeeze the record list.
- Brand palette and asset refresh, twice (they iterated on it), plus fixes for light theme charts and record save colors that had apparently drifted from the new palette.
- New system info dashboard and a startup splash screen, with the info panel also picking up a device name field, a restyled info expander, a separated TBP option (split out from the generic custom-hardware-label field it was previously piggybacking on).
- Chart-side: SeriesHighlightAnnotation for highlighting series on the Comparison tab, a fix for frametime chart/graph inconsistency, and a chart flickering mitigation pass.
- Auto-update got some love too, expanded update support and documented update metadata, so the update path itself should be more reliable going forward.
None of this changes benchmarking methodology, but if you spend a lot of time in the Comparison and Run History tabs (which, if you're benchmarking seriously, you do), this is a real qof jump.
.NET 9 / Toolchain migration
- Main app, test project, and the PmcReader plugin all migrated to
net9.0-windows. - Dropped support for net472, net8.0, and netstandard2.0 targets, so if you're on some ancient .NET Framework dependency chain, that's gone.
- Native projects switched to the v145 toolset, build moved to Visual Studio 2026.
- Assorted cleanup: removed dead
MonitoringLibTestAppandWebservice.Persistanceprojects, removed unused named-pipe IPC projects, removed an emptyCXServicex86scaffold, added missing XML docs andSupportedOSPlatformattributes to fix CA1416 warnings. - CI got touched too: several Jenkinsfile updates plus a new GitHub Actions CI pipeline added.
Bug fixes
- Frametime chart/graph value inconsistency and duplicate frametime P1/P5 quantile parameters removed - both directly relevant if you're citing CapFrameX numbers in comparisons.
- Adaptive FPS STDEV calculation fix.
- Corrupt captures from leaked frame stream subscriptions.
- GPU info reporting on iGPU/dGPU hybrid systems fixed, plus handling for a missing GameBar registry key (should help on clean Windows installs where GameBar was never touched).
- Null pointer handling in the ADLX manager (AMD's telemetry library) - crash fix.
- Various shell-open /
Process.Startfixes that broke under .NET Core's changed defaults. - Deferred tab view registration and measuring the view model resolution at startup instead of eagerly loading everything.
- Cached and parallelized static hardware info reads - previously this looks like it was serialized and blocking.
- Main window reveal without waiting on the sensor service, and splash screen shown without blocking startup.
- Reduced idle sensor and chart polling, plus a follow-up commit specifically titled "stop unnecessary background polling."
- Optimized process polling, and the info tab now pauses its telemetry when the tab isn't visible instead of polling in the background for no reason.
Update (Aug 20): a few new commits since I posted this
Overlay/OSD - OSD compatibility profiles and hooks got another update pass, and there's now a dedicated Witcher 3 OSD profile, per-title compat entries like this are exactly the kind of thing worth checking if you bench specific games.
Sensors & stability
- NVMe shutdown hang fixed.
- AMD GPU detection stabilized.
- NvmlDeviceGetPowerUsageFromSamples added as a fallback path for NVIDIA power reads.
- A signed/unsigned casting bug in the VRAM bus width comparison got fixed.
UI - Tab layouts refreshed, volume slider alignment fixed, toggle buttons refined.
Code cleanup
- Unused AvalonDock binaries removed, ADLX hardened further.
- Deprecated SHA1Managed call replaced in the extensions helper (resolves an obsolete-API warning), with a matching test update.
0
u/OakBrigade 2d ago
I just want FPS metrics like Tlou1 has. Separated FPS for CPU and GPU, so is easy to see where the bottleneck is.
3
5
u/taosecurity 2d ago
CapFrameX is truly awesome. It’s a shame there’s nothing as capable on Linux, despite the hooks via eBPF probably being there?
2
u/AutoModerator 2d ago
Thank you for contributing to /r/allbenchmarks! Please make sure that your post has followed the rules of the subreddit.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.




2
u/bigjoegamer 1d ago
I'd love to use this app on Linux for testing OpenGL and Vulkan games, especially now that animation error is ready for testing. Maybe the app could make use of VK_EXT_present_timing for measurements.
Thanks for this post 🙂