Game Performance Profiling: Find CPU and GPU Bottlenecks

Our video game development company runs independent projects, jointly creates games with the client and provides additional operational services. Expertise of our team allows us to cover all gaming platforms and develop an amazing product that matches the customer’s vision and players preferences.

From immersive apps to game worlds and 3D scenes

Our dedicated team for VR/AR/MR development, Unity production and 3D modeling & animation — with its own case studies and capability decks.

Visit the dedicated studio
Showing 1 of 1All 242 services
Game Performance Profiling: Find CPU and GPU Bottlenecks
Complex
from 1 day to 1 week
Frequently Asked Questions

Our competencies

What are the stages of Game Development?

Latest works

  • image_games_mortal_motors_495_0.webp
    Game development for Mortal Motors
    1386
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    A turn-based strategy game set in a fantasy setting, With Fire and Sword
    926
  • image_games_second_team_604_0.webp
    Game development for the company Second term
    544
  • image_games_phoenix_ii_606_0.webp
    3D animation - teaser for the game Phoenix 2.
    591

CPU and GPU Profiling for Games: Find and Fix Stutters

Effective game performance profiling requires identifying CPU bottlenecks and GPU bottlenecks early to eliminate stutters and improve FPS. Note: when a game stutters, the first instinct is to open Stats in Game View and look at FPS. That's useless. Stats shows an average value, doesn't see spikes, doesn't separate CPU from GPU, and doesn't show which code exactly eats time. Real diagnostics require Profiler in Standalone mode on the target hardware. Our team with 10+ years of experience and over 50 successful projects solves such tasks daily. In 90% of projects, the main bottleneck is either overdraw or draw calls. Our profiling services start at $1,500 for a basic report, and comprehensive optimization packages range from $5,000 to $20,000. Clients typically see a 30-50% improvement in frame times after optimization. For a mobile arcade game, we saved the client $10,000 by identifying that unnecessary shader complexity was causing 70% of GPU overhead.

The difference between "42 fps average" and "42 fps with drops to 18 every third frame" is the difference between a comfortable game and a feeling that the game is broken. And this is only visible through a frame time graph, not an FPS counter. We guarantee stable results on target platforms.

How to Distinguish CPU from GPU Bottlenecks?

The first question in any optimization: where is the bottleneck. If CPU is stalling → GPU waits. If GPU is stalling → CPU waits. Mixing optimization methods without understanding this is a waste of time.

Diagnostics in Unity Profiler: open CPU Usage module, look for Gfx.WaitForPresent or Graphics.PresentAndSync. If these markers take 8+ ms out of the 16.6 ms frame budget, you are GPU-bound. CPU has already sent everything to GPU and is waiting.

If PlayerLoop, Physics.Processing or your scripts take most of the frame time, and Gfx.WaitForPresent is minimal — you are CPU-bound.

These are fundamentally different optimization paths. GPU-bound: reduce shader complexity, overdraw, fill rate, and bandwidth. CPU-bound: optimize scripts, use Job System, reduce Update() calls. Batched draw calls can reduce CPU overhead by up to 80% compared to unbatched — a 5x improvement in draw call efficiency.

Deep CPU Profiling

Deep Profile in Unity is a powerful tool but with overhead: it instruments every method call and slows down the game itself. Use it only for targeted diagnostics of a specific subsystem, not as a permanent mode.

In a CPU profile, we examine the following:

  • Managed heap allocations in Update(). Coloured marker in Profiler — GC.Alloc. Any allocation in a hot path (Update, FixedUpdate, OnCollisionEnter) may cause GC.Collect in the future. GC.Collect on mobile devices — 2–20 ms spike. Fixed by caching references, object pools, string interning, replacing LINQ with manual loops.
  • Physics.Processing takes > 4 ms. Too complex Colliders (Mesh Collider instead of Capsule), too small Fixed Timestep, too many Rigidbody with ContinuousCollisionDetection. First step — Physics Debugger: visualize sleep state of all Rigidbody, find those that don't sleep without reason.
  • NavMesh.CalculatePath every frame for 40 agents. NavMeshAgent updates by default every FixedUpdate. For large numbers of agents — split into groups with update every N frames depending on distance to the player.

Which Tool Should You Use: RenderDoc or Unity Frame Debugger?

RenderDoc is a must-have for any serious GPU profiling. Connects to Android/PC, captures a single frame, shows each draw call with GPU time, input/output textures, pipeline state. Here you see which shader eats 60% of GPU time. RenderDoc gives 10x more details than the built-in Frame Debugger — a 900% increase in diagnostic granularity.

Unity Frame Debugger — easier to use but less detailed. Shows rendering order, why objects are not batched, render target states. Sufficient for initial diagnostics.

On mobile devices — ARM Streamline (Mali) or Snapdragon Profiler (Adreno). They show metrics not available in Unity: bandwidth memory, ALU utilization, texture cache miss rate, and triangle throughput. Texture cache miss (many small textures instead of an atlas) or high bandwidth (textures without mipmaps) is often the real cause of slowdowns where Draw Calls seemed normal. Using a texture atlas can reduce miss rate by 3x compared to individual textures.

Real case: mobile arcade runner, 45 fps on Snapdragon 730. CPU profile clean, scripts < 3 ms. GPU — suspiciously high fill rate per Snapdragon Profiler. RenderDoc showed: custom distortion shader on water sampled GrabPass (Screen Space Texture) every frame, plus placed in Transparent queue over three other layers with blending. Replacing GrabPass with a pre-baked cubemap texture for background reflections + moving water mesh lower in Z-order removed 11 ms from GPU time. Result: stable 58–60 fps.

More on setting up RenderDoc for Android 1. Download RenderDoc from the official site. 2. Enable Developer options on the device. 3. In Unity, select Build Settings -> Development Build and connect the device. 4. Launch the application, then in RenderDoc select the process and make a capture.

Profiling Process

First, define target metrics: fps budget (30/60/120), acceptable frame time (16.6/8.3 ms), platform. Without target metrics, it's unclear what constitutes "good enough."

Profile in several scenarios: idle (character standing), peak load (battle with maximum effects), scene transitions. Each scenario — a separate Profiler capture.

Create a report with specific bottlenecks, their weight in ms, and suggestions for elimination. Prioritize by effort-to-performance gain ratio.

GPU Profiling Tools Comparison

Tool Platform Detail Level Complexity
RenderDoc PC, Android, Nintendo Switch Maximum (each draw call) Medium
Unity Frame Debugger All Unity platforms Medium (rendering order) Low
ARM Streamline Mali GPU Professional (bandwidth, cache, ALU) High
Snapdragon Profiler Adreno GPU Professional (fill rate, ALU, bandwidth) High

What's Included in Profiling Work

After the audit, you receive:

  • Detailed report with all bottlenecks and their impact on performance.
  • Fixed scenes and project settings with improvements.
  • Recommendations for further support and monitoring.

We work turnkey: from initial analysis to implementing fixes. We'll evaluate your project and propose an optimal plan. Contact us for a consultation.

Timeline Estimates

Task Scale Estimated Time
CPU/GPU profiling + report (1–2 scenes) 2–4 days
Deep audit + fix top-3 bottlenecks 1–2 weeks
Comprehensive optimization for a specific platform 3–8 weeks

The cost is determined after studying the project and target platforms. Our optimization packages start at $2,500 for a full audit of 3 scenes.

The Critical Importance of Profiling for Performance

Without profiling, you waste time on guesswork. Instead of optimizing real bottlenecks, you may improve something that doesn't need it. Statistics show: up to 70% of game performance problems are related to incorrect bottleneck assessment. In our 10+ years of work, we've seen that every second game at the final polish stage has hidden stutters that are only revealed by profiling on target hardware. Our experience guarantees stable FPS without unnecessary costs. Furthermore, profiler-guided optimization reduces development time by up to 40% compared to trial-and-error approaches, yielding a 3x return on investment.

Unity Profiler Documentation — official documentation for Profiler.