Quick answer: Confirm the frame is GPU-bound and fillrate-limited with a GPU profiler, switch to an overdraw visualization to see where pixels are shaded multiple times, and reduce the offending transparent layers or effect resolution.
When the GPU is the bottleneck and the geometry is simple, the culprit is usually overdraw: the same pixels being painted over and over by stacked transparency. A GPU profiler plus an overdraw view shows you exactly which screen regions cost the most.
How to find it
1. Confirm GPU-bound and fillrate-limited
Use the GPU profiler to verify GPU time exceeds CPU time, then check that the pixel/fragment stage dominates over vertex work. High pixel cost with low triangle counts points at overdraw.
2. Visualize overdraw
Switch to the overdraw debug view (Unity's Overdraw scene mode, or a shader that adds per-fragment). Bright areas are pixels shaded many times, usually stacked transparency and particles.
3. Find the layered transparency
The hot regions are typically overlapping alpha-blended sprites, dense particle systems, or several full-screen post effects. Each transparent layer reshades pixels already drawn underneath.
4. Reduce the redraw
Cut particle counts and overlap, render heavy effects at lower resolution, replace large alpha quads with tighter meshes, and avoid stacking full-screen passes. Fewer reshaded pixels directly lowers GPU time.
Catching the ones you can't reproduce
The hardest version of this to fix is the one you can't reproduce — it only happens on a player's hardware, OS, driver, or save state, under conditions that simply aren't present on your machine. A report that says “it crashed” or “it froze” gives you nothing to act on, so the bug survives release after release while quietly costing you players.
Automatic error capture closes that gap. Each failure arrives with its full stack trace, the device and OS, the build number, and a breadcrumb trail of what the player did right before it broke, so even a failure you have never seen becomes a specific, reproducible issue. Fold identical failures into one signature ranked by how many players each hits, and your worklist sorts itself worst-first instead of arriving as a stream of vague complaints.
This is where a tool like Bugnet earns its place. Its SDK captures every error automatically with the full stack trace plus device, OS, memory, build, and game-state context, folds duplicates into one grouped issue with an occurrence count, and ties each to the build it first appeared on — so you fix the problem that hurts the most players first and confirm it is gone when its signature disappears from the next release.
Ship the fix, watch the signature disappear from the next build. That's how you know it's really gone.