Mobile Application GPU Rendering Profiling
60 FPS on screen means 16.67 ms per frame. Out of this, CPU prepares render commands, passes them to GPU, GPU draws. If GPU doesn't finish by next vsync — frame is dropped. User sees jank. But where exactly GPU bottlenecks — without a profiler it's impossible to say: overdraw, too complex shaders, huge textures, incorrect tiling — causes vary and need different solutions.
GPU Profiling Tools
Android GPU Inspector (AGI)
Google's Android GPU Inspector — most powerful tool for mobile GPU. Works with Adreno (Qualcomm) and Mali (ARM). Requires device with GPU counter profiling support — most flagships 2020+ support it.
AGI shows:
- GPU Counter — shader unit load, bandwidth, cache hit rate
- Frame Profiler — breakdown of each frame by draw calls, time per vertex and fragment shader
- Memory — VRAM consumption, texture cache
Critical metric — Fragment ALU utilization above 90% while simultaneously low Primitive Assembly means: problem is in fragment shader, not geometry. Shader simplification or LOD-system — right direction.
Xcode Metal Debugger + GPU Frame Capture
For Metal applications on iOS — GPU Frame Capture in Xcode. Captures one frame and breaks it down by draw calls. Shows:
- Each
MTLRenderCommandEncoderand its contribution to frame time - Heatmap — which pixels are drawn how many times (overdraw visualization)
- Shader profiler — execution time of specific shader instructions with source line indication
For UIKit/SwiftUI — Core Animation Instrument in Instruments. Shows CATransaction, offscreen-rendering passes (yellow layers in Debug → Color Offscreen-Rendered), layer composition.
Enable Debug → Color Blended Layers in simulator: red zones — layers with alpha blending. Each red pixel is drawn twice (or more). On screen with 60% red — real problem for budget devices.
Profiling on Adreno: Snapdragon Profiler
Snapdragon Profiler (Qualcomm) gives most detailed picture for Adreno GPU: L1/L2 cache miss rate, texture cache utilization, ALU stacks. Use when AGI doesn't give enough detail or working with Vulkan application is needed.
What We Look For and How to Fix
Overdraw. Developer Options → GPU Overdraw on Android, Debug → Color Blended Layers in iOS simulator. Goal — minimize red/pink zones. Remove unnecessary backgrounds from ViewGroup, set opaque = true where transparency is not needed.
Offscreen rendering passes. CALayer with cornerRadius + masksToBounds on iOS triggers offscreen render pass — draws layer to separate buffer, then composits to screen. On list with 50 cells each with cornerRadius — 50 unnecessary offscreen passes per frame. Solution: draw rounded corners through UIBezierPath in drawRect or through background image with transparent corners.
Texture oversized. Texture 2048×2048 for icon 44×44 pt — GPU loads unnecessary data, wastes cache bandwidth. MTKTextureLoader with MTKTextureLoaderOptionGenerateMipmaps: true and correct MTKTextureLoaderOptionTextureUsage for mipmapping — standard for 3D and complex UI.
Case: 30 FPS on Adreno 650
Card game on Unity: on Samsung S21 (Adreno 650) held 30 FPS instead of expected 60. AGI showed: Fragment ALU utilization 98%, while Vertex Processing — 12%. Fragment shader for water contained 4 texture samples + normal mapping + fresnel calculation. On mobile GPU, fragment shaders are more expensive than vertex.
Solution: simplified water shader for mobile platform (2 texture samples instead of 4), fresnel approximation through dot(viewDir, normal) without pow(). FPS grew to 58–60 stably.
Timeframe
GPU profiling and analysis — 2–3 days. Render optimization based on results — 3–10 days depending on complexity of found issues.







