Documentation

What FrameSight does, how to give it a frame to analyse, and how to read the report. Written for 3D leads and producers, no GPU-profiling background needed.

FrameSight takes one recorded frame of your game, replays it on real GPUs, and turns it into a plain-language report: how fast the frame is, what is slowing it down, and what your team should fix first. There are two things to know: how to get a report, and how to read it. Both are below.

Getting started

How to use FrameSight

FrameSight analyses a single frame of your game. You give it a capture, a recording of exactly what the GPU did to draw one frame. FrameSight replays that frame on one of our GPUs to measure where the time and memory go.

The whole flow, in three steps

  1. Record a capture of your heaviest moment (how-to below).
  2. Upload it into a benchmark, grouped under a scene, and pick which GPU(s) to test on.
  3. Open the report. Everything after the upload is point-and-click.

Not a RenderDoc user? The recording step is a two-minute job for anyone on the team who can launch the game from the editor or a build. A producer can hand it off and still drive everything else (uploading, comparing builds, reading reports).

Recording a capture in 5 steps

A capture is a .rdc file made with RenderDoc, the free, industry-standard tool for recording a single frame of GPU work. You only need it for this one step.

  1. Download RenderDoc. renderdoc.org/builds (Windows or Linux, ~150 MB). FrameSight is tested against RenderDoc 1.40 and newer.
  2. Start your game through RenderDoc. Open the Launch Application tab, point Executable path at your game's .exe, fill in the working directory and any launch arguments as usual, then click Launch. Your game opens with a small overlay in the corner.
  3. Play to your worst-case moment. The heaviest fight, the densest view, the particle-heavy spell. Take your time. Nothing is being recorded yet.
  4. Press F12. RenderDoc grabs the next frame; the overlay flashes and the frame shows up in RenderDoc's captures list. (The hotkey is in Tools → Settings if F12 clashes with your game.)
  5. Save it and upload. Right-click the captured frame → Save, pick a location, and you get one .rdc file (usually 50 MB to 2 GB). Drag it into a FrameSight scene.

Four tips for a useful capture

Capture the heaviest frame. Pick the moment your game works hardest. A capture of a menu or loading screen produces a report, but the numbers will not reflect your real ceiling.

Capture at the resolution you ship. Pixel work grows fast with resolution, so a 1080p capture of a 4K game badly under-counts the pixel cost.

Hide debug overlays first. On-screen debug menus and ImGui panels add extra draws that can mask the real bottleneck. Turn them off before pressing F12.

One frame is enough. A single representative frame holds everything the analysis needs. There is no need to record a sequence.

Scenes

A scene is one moment in your game that you want to track: a boss fight, the hub, a cutscene. Group captures of the same moment under one scene.

Why it matters: the matrix view lines up captures of that scene across different GPUs and across game builds, so a performance regression between two builds is one glance away.

Tip: upload a new capture into an existing scene and the old one is kept as a previous version. The letter on each cell (A, B, C, …) follows the upload order, which is handy for tracking how a scene's cost moves build over build.

GPUs we run it on (Runners)

A runner is a GPU machine that Exploding Frame runs for you. You never install or manage anything. You choose which GPU(s) to test on when you create a benchmark, and we replay your capture on them.

Each GPU you pick becomes one column in the benchmark matrix, so you can compare the same frame across hardware side by side (for example: does this scene hold 60 fps on a mid-range card?).

Runner status

The public fleet page lists every GPU with its status (online, offline, or in maintenance) and specs (model, VRAM, driver). If one of your jobs is stuck on queued, the GPU you picked is probably offline or in maintenance. Check that page.

Need a specific GPU that is not in the fleet? Contact us and we will look into adding it.

Reading your report

Your grade (A–F)

The grade at the top of the report is a quick read on how clean the frame is: A means nothing looks alarming, F means several serious issues. A 0-to-100 score backs it up for the curious (in the grade card's tooltip and at the bottom of the report).

It is built from the report's list of warnings. Each warning has a severity (info / medium / high / critical), and the grade follows the worst ones present. No warnings → A. A few criticals → F.

A good grade does not mean “fast”. It means “nothing looks alarming”, not “this hits 60 fps”. Always read it next to the frame time and the bottleneck before drawing conclusions.

Frame budget: are you fast enough?

A frame has a time budget set by your target frame rate. FrameSight measures you against a 30 fps budget (33.3 ms per frame). The donut shows how much of that budget your frame uses, with markers for 60 fps (half the budget) and 120 fps (a quarter).

Headroom (below the donut) is how much slack you have left before dropping under 30 fps on that GPU. Negative headroom = you are already over budget on this card. A small positive number = fragile: a slightly heavier moment (more particles, foliage, weather) will push you over.

The number used here is the corrected GPU time: your raw replay time minus the extra cost that only exists during RenderDoc replay (see Total GPU time for why replay runs slower than your real game).

Frame stats: the headline numbers

The top-line counts for the captured frame.

Total GPU time
How long the GPU took to draw the frame, in milliseconds. This is the headline number, and it maps straight to frame rate (1000 ÷ ms = FPS).
Read it as a worst case, not a verdict. Because we replay the frame on its own, outside your game's normal scheduling and with cold caches, this number runs higher than the same frame costs live. The upside: if the replay is fast on a given GPU, your shipping game is almost certainly faster.
Draw call count
How many separate “draw this” commands the frame issued. Very high counts usually mean CPU overhead or geometry that should be instanced (drawn many times from one command).
Dispatch count
How many compute jobs ran (post-processing, GPU particles, GPU physics). High counts point to heavy compute work.
Vertex count
Total vertices submitted across all draws. Driven by high-poly meshes or geometry that was not culled (hidden things still being drawn).
Primitive count
Triangles drawn. Comparing triangles to pixels is a quick way to see whether a frame is geometry-heavy or fill-heavy.

What's slowing you down

This section names the one part of the GPU that is the limiting factor for this frame, the thing worth fixing first. FrameSight scores how hard each part of the pipeline is working and reports the busiest one as the bottleneck.

  • Geometry: too many or too detailed meshes.
  • Pixels / fill: drawing too many pixels, from high resolution or heavy overdraw (see Overdraw).
  • Pixel shaders: the per-pixel shading math is heavy (complex materials, lighting).
  • Textures: reading textures is the limit.
  • Memory bandwidth: moving data in and out of GPU memory is the limit.
  • Compute: compute shaders are the limit.

A balanced frame shows similar scores everywhere, with no single culprit. One part standing far above the rest is your optimisation target.

Where the time goes (Pass Treemap)

A map of GPU time by render pass (shadows, lighting, post-processing, UI, …). Each block is one pass; its size is the share of frame time that pass took. The biggest blocks are where your time actually goes.

Click a block to open it and see its individual draw calls, shaders, and resources.

Blocks are coloured by the kind of call (regular / instanced / GPU-driven / compute), so the overall mix reads at a glance.

Density view

The Colour by toggle above the treemap switches to Density, which recolours each block by how many draw calls it packs per millisecond. A big pale block is time-heavy but efficient; a small dark block crams many calls into little time and usually means CPU-side overhead from submitting all those calls. Flip back to Kind for the default view.

Heaviest draw calls

The most expensive individual draws, ranked by GPU time. For each one:

  • GPU time
  • Which vertex and pixel shaders it used
  • Triangle count and how many copies (instances) were drawn
  • The render target it drew into (format + size)
  • Whether it is a GPU-driven (indirect) draw

GPU-driven draws (shown as Execute events) have their parameters decided on the GPU rather than by your code. FrameSight reads those parameters back so the counts shown are the real ones.

Memory use (VRAM Breakdown)

How your GPU memory (VRAM) is split across resource types. The pie at the top gives the shape; the treemap below lets you drill into individual allocations, sized by megabyte.

Textures
Images the GPU samples (colour/diffuse, normal maps, shadow maps, and so on). Usually the biggest category in content-heavy games.
Mesh
The geometry itself: vertex and index buffers, plus the structured buffers used by modern mesh pipelines (Nanite-style). The 📏 / ◆ badges in the treemap mark which resources were counted here.
Buffers
Everything else that is not geometry: constant buffers, data buffers, GPU-draw argument buffers, and the like.
Render targets
The off-screen images the GPU draws into (the G-buffer, depth, post buffers) that are not already counted under textures.
Other
The gap between everything we could name and the total VRAM the GPU reports: driver bookkeeping, allocator slack, and internals the tool cannot label. A large “Other” slice on an otherwise small frame points to allocator overhead.

Textures

Per-texture detail for every texture used in the frame, plus recommendations.

Format
How the texture is stored. Block-compressed formats (the BC1–BC7 and ASTC families) are much cheaper to read than uncompressed ones like R8G8B8A8. They cut memory bandwidth dramatically for a small quality cost.
Compression ratio
How much smaller the compressed texture is versus uncompressed. BC7 is typically 4× smaller than RGBA8; uncompressed shows 1×.
Bandwidth saved
Roughly how much memory traffic per frame the compression saves. Higher means the compression is paying off.
Recommendations
FrameSight flags large uncompressed textures and suggests a suitable compressed format based on whether the texture has transparency and how much quality it needs.
Oversize (📏 badge)
Flagged when a texture is far larger than it ever appears on screen Typically a 4K asset that only ever shows at 1080p or smaller. Fix by authoring it smaller or shipping mips (smaller pre-made versions).

Memory efficiency (cache vs VRAM)

When the GPU reads data, the closer it lives the faster it is. This card shows where the frame's reads were served from: fast on-chip caches, or slow trips out to VRAM.

Hit L1 texture (sage)
Served by the fastest on-chip cache. A bigger sage slice means the GPU spends more time working and less time waiting on memory.
Hit L2 (sand)
Served by a larger, slightly slower on-chip cache. Still much cheaper than going to VRAM.
Hit DRAM (peach)
Had to go all the way out to VRAM, the slow path. A big peach slice with high memory traffic usually lines up with a memory-bound bottleneck.
DRAM bandwidth
How much data the frame moved through VRAM. Compared against the card's maximum to show how close you are to saturating memory.

Rule of thumb: a green-heavy pie with low VRAM traffic means your data fits in cache and is well laid out. A peach-heavy pie with high traffic points at oversized textures, missing mips, or scattered memory access. Fix those before touching shaders.

Overdraw & pixels

How much pixel work the frame does, and how much of it is wasted.

Overdraw factor
How many times the average pixel got drawn over. 2× means each pixel was painted twice. Above 3–4× in a solid (non-transparent) pass usually means wasted work: the GPU is not skipping hidden surfaces, or things are drawn back-to-front. Transparency and particles are common causes.
Fill rate
How many pixels per second the frame shades, compared against the card's maximum to gauge how hard the pixel stage is pushed.
Depth complexity
How many layers stack up per pixel. A few pixels with very high layering usually means transparent or particle overdraw piling up.

Advanced (for engineers digging deeper)

GPU counters

Low-level hardware numbers read straight from the GPU. A producer can skip this section. It is here for engineers who want to confirm why a stage is the bottleneck. Which counters are available depends on the GPU vendor and driver.

Occupancy (%)
How busy the GPU's parallel cores are kept. Low occupancy (< 50%) means something (heavy shaders using too many registers) is stopping the GPU from running enough work at once.
IPC (instructions per clock)
How much shader math actually completes each cycle. A low value relative to the hardware's peak means the cores are stalling, waiting on memory, textures, or earlier results.
Memory bandwidth (GB/s)
How fast the frame is reading and writing VRAM. Close to the card's maximum is a strong sign the frame is memory-bound.
L1 / L2 cache hit rate
How often reads were served by fast on-chip cache instead of VRAM. Higher is better; low hit rates make the memory-bandwidth problem worse.