Optimization & Performance
Performance Targets
code
FRAME BUDGETS: ┌─────────────────────────────────────────────────────────────┐ │ TARGET FPS │ FRAME TIME │ PLATFORM │ ├─────────────┼────────────┼─────────────────────────────────┤ │ 30 FPS │ 33.3 ms │ Console (heavy games) │ │ 60 FPS │ 16.6 ms │ PC, Console, Mobile │ │ 90 FPS │ 11.1 ms │ VR (minimum) │ │ 120 FPS │ 8.3 ms │ Competitive games │ │ 144+ FPS │ 6.9 ms │ High-end PC │ └─────────────┴────────────┴─────────────────────────────────┘ FRAME TIME BREAKDOWN (16.6ms target): ┌─────────────────────────────────────────────────────────────┐ │ CPU: 8ms │ │ ├─ Game Logic: 3ms │ │ ├─ Physics: 2ms │ │ ├─ Animation: 1.5ms │ │ └─ Audio/Other: 1.5ms │ │ │ │ GPU: 8ms │ │ ├─ Geometry: 2ms │ │ ├─ Lighting: 3ms │ │ ├─ Post-process: 2ms │ │ └─ UI: 1ms │ └─────────────────────────────────────────────────────────────┘
Profiling Process
code
OPTIMIZATION WORKFLOW: ┌─────────────────────────────────────────────────────────────┐ │ 1. MEASURE: Profile before optimizing │ │ → Never guess, always profile │ │ │ │ 2. IDENTIFY: Find the bottleneck │ │ → CPU-bound: Frame time > GPU time │ │ → GPU-bound: GPU time > CPU time │ │ │ │ 3. ANALYZE: Drill into specific systems │ │ → Which function? Which shader? Which asset? │ │ │ │ 4. OPTIMIZE: Fix the actual bottleneck │ │ → One change at a time │ │ → Measure before/after │ │ │ │ 5. VERIFY: Confirm improvement │ │ → Check all platforms │ │ → Test edge cases │ │ │ │ 6. REPEAT: Move to next bottleneck │ └─────────────────────────────────────────────────────────────┘
CPU Optimization
code
CPU OPTIMIZATION TECHNIQUES: ┌─────────────────────────────────────────────────────────────┐ │ ALGORITHMIC: │ │ • Use appropriate data structures (spatial hashing) │ │ • Early-out conditions │ │ • Reduce O(n²) to O(n log n) │ ├─────────────────────────────────────────────────────────────┤ │ CACHE: │ │ • Data-oriented design (SoA vs AoS) │ │ • Minimize cache misses │ │ • Process data linearly │ ├─────────────────────────────────────────────────────────────┤ │ ALLOCATION: │ │ • Object pooling │ │ • Avoid GC in hot paths │ │ • Pre-allocate collections │ ├─────────────────────────────────────────────────────────────┤ │ THREADING: │ │ • Offload work to job system │ │ • Async loading │ │ • Parallel processing │ └─────────────────────────────────────────────────────────────┘
GPU Optimization
code
GPU OPTIMIZATION TECHNIQUES: ┌─────────────────────────────────────────────────────────────┐ │ DRAW CALLS: │ │ • Static/dynamic batching │ │ • GPU instancing │ │ • Merge meshes │ │ Target: <2000 on PC, <200 on mobile │ ├─────────────────────────────────────────────────────────────┤ │ OVERDRAW: │ │ • Front-to-back rendering │ │ • Occlusion culling │ │ • Reduce transparency │ ├─────────────────────────────────────────────────────────────┤ │ SHADERS: │ │ • Reduce instruction count │ │ • Use lower precision (half) │ │ • Minimize texture samples │ ├─────────────────────────────────────────────────────────────┤ │ GEOMETRY: │ │ • LOD systems │ │ • Mesh simplification │ │ • Frustum culling │ └─────────────────────────────────────────────────────────────┘
Platform-Specific Guidelines
code
MOBILE OPTIMIZATION: ┌─────────────────────────────────────────────────────────────┐ │ CRITICAL CONSTRAINTS: │ │ • Thermal throttling │ │ • Battery drain │ │ • Memory limits (500MB-2GB) │ │ │ │ TARGETS: │ │ • Draw calls: 100-200 │ │ • Triangles: 100K-500K/frame │ │ • Texture memory: 200-500MB │ │ • 30-60 FPS stable │ └─────────────────────────────────────────────────────────────┘ VR OPTIMIZATION: ┌─────────────────────────────────────────────────────────────┐ │ CRITICAL: Maintain 90 FPS constantly │ │ • Single-pass stereo rendering │ │ • Fixed foveated rendering │ │ • Aggressive LOD │ │ • Minimal post-processing │ └─────────────────────────────────────────────────────────────┘
🔧 Troubleshooting
code
┌─────────────────────────────────────────────────────────────┐ │ PROBLEM: Frame rate drops during gameplay │ ├─────────────────────────────────────────────────────────────┤ │ DEBUG: │ │ → Profile to find CPU vs GPU bound │ │ → Check for GC spikes │ │ → Look for expensive operations in Update() │ ├─────────────────────────────────────────────────────────────┤ │ SOLUTIONS: │ │ → Move logic to FixedUpdate or coroutines │ │ → Implement object pooling │ │ → Add LOD for distant objects │ │ → Reduce draw calls with batching │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ PROBLEM: Long loading times │ ├─────────────────────────────────────────────────────────────┤ │ SOLUTIONS: │ │ → Async loading with progress bar │ │ → Stream assets in background │ │ → Compress assets more aggressively │ │ → Pre-warm caches │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ PROBLEM: Inconsistent frame pacing │ ├─────────────────────────────────────────────────────────────┤ │ SOLUTIONS: │ │ → Enable VSync │ │ → Use fixed timestep for physics │ │ → Spread heavy work across frames │ │ → Check for background processes │ └─────────────────────────────────────────────────────────────┘
Profiling Tools
| Engine | CPU Profiler | GPU Profiler | Memory |
|---|---|---|---|
| Unity | Profiler | Frame Debugger | Memory Profiler |
| Unreal | Insights | RenderDoc | Memreport |
| Godot | Profiler | GPU Debugger | Built-in |
| Any | Platform tools | RenderDoc/PIX | Valgrind/Instruments |
Use this skill: When optimizing games, profiling performance, or supporting multiple platforms.