Mobile Platform Graphics Optimization

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.
Showing 1 of 1 servicesAll 242 services
Mobile Platform Graphics Optimization
Complex
from 3 business days to 2 weeks
FAQ
Our competencies
What are the stages of Game Development?
Latest works
  • image_games_mortal_motors_495_0.webp
    Game development for Mortal Motors
    663
  • 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
    859
  • image_games_second_team_604_0.webp
    Game development for the company Second term
    490
  • image_games_phoenix_ii_606_0.webp
    3D animation - teaser for the game Phoenix 2.
    533

Mobile Platform Graphics Optimization

On Android mid-range 2023 device, GPU Profiler shows 18 ms per frame at target 16.6 ms—game won't hold 60 FPS. Cause usually not singular: 340 draw calls, overdraw-heavy effects, uncompressed 2048×2048 textures on objects occupying 64×64 pixels on screen. Each point separately noncritical. Together—catastrophic.

Draw Calls: Where They Come From and How to Count

Draw Call—CPU command to render triangle group with specific settings. Each requires CPU-GPU sync and data transfer. On mobile with tile-based GPU (PowerVR, Mali, Adreno) costlier than desktop immediate mode GPU.

Tools: Unity Profiler (GPU Usage), Frame Debugger, detailed analysis—RenderDoc on Android or Xcode Instruments on iOS. GPU Profiler directly in editor shows batch count and SetPass calls. Good mobile target—under 100 draw calls per frame, realistic for mid-core—150–200.

Main extra draw call sources:

Unbatched Materials. Static Batching combines static objects with identical material into single mesh at scene start. Condition: objects marked Static in Inspector and using identical Material. One material asset, not identical settings—exactly same object in memory. Two objects with identical-parameter Material but different instances—batching won't work.

Dynamic Batching for small objects (up to 900 vertices) auto-works if using identical material. But practice often disables it for GPU Instancing—better scales at many copies of one object (trees, rocks, enemies one type).

Canvas Overlay mode in uGUI. Canvas in Screen Space - Overlay renders atop everything, each element change (even cursor blink in text field) marks entire Canvas Dirty, recalculates mesh, makes separate draw call. For UI with animated elements must split static and dynamic across different Canvases.

Textures: Most Underestimated Memory Problem Source

Mobile uses Unified Memory Architecture: GPU and CPU share memory. 512 MB RAM—not rare for 2023–2024 budget Android. Uncompressed RGBA32 texture 2048×2048 = 16 MB. 10 such textures on level = 160 MB texture-only.

Compression formats with hardware support:

  • Android: ETC2 (no alpha—4 bpp, with alpha—8 bpp), ASTC 4×4 (8 bpp) or ASTC 6×6 (3.5 bpp)
  • iOS: ASTC 4×4 – ASTC 8×8 depending on quality needs
  • PC: DXT5 (BC3) for RGBA, BC7 for high-quality textures

ASTC—best for iOS and modern Android (Adreno 400+ series, Mali G7x+). Old Android with OpenGL ES 2.0 lacks ASTC—need ETC2 fallback. Unity allows different formats per platform via Texture Importer.

Mipmaps—mandatory for 3D objects, unnecessary for UI. Mipmap adds 33% to texture memory size but UI elements always render at native resolution, this is wasted. Check Texture Importer → Generate Mipmaps → disable for all UI sprites.

Case Study: Memory Reduction From 380 to 140 MB

Project—mobile 3D strategy—campaign launch crashed with OOM (Out of Memory) on 512 MB RAM devices. Memory Profiler showed 380 MB textures alone.

Audit: 60% texture budget was terrain and environment textures in RGBA32 uncompressed—developer disabled compression for "speed" at prototype stage, forgot to enable. Another 15%—UI textures with mipmaps enabled.

Solution: convert all terrain/environment textures to ASTC 6×6 (main target platform—iOS, Android 7.0+ minimum), UI textures to ASTC 8×8 without mipmaps. For alpha effects (particles, VFX)—ASTC 4×4. Result: 142 MB. OOM crashes stopped, freed 240 MB for game logic and audio.

Shaders and Overdraw

Overdraw—rendering one pixel multiple times. Semi-transparent particles, complex postprocessing effects, overlapping UI elements—all overdraw. On tile-based mobile GPU overdraw especially expensive: each tile read/write repetition is extra work.

Visualize overdraw in Unity: Scene View → Render Mode → Overdraw. White spots = problem. Watch particle systems especially—particles often render dozens of semi-transparent quads on top in one spot.

For particle systems: limit Max Particles, use opaque or cutout shaders where visually OK (cutout pricier per fill rate but cheaper overdraw-wise), sort by Sorting Layer to minimize geometry overlap.

For shaders: simple Unlit shaders 3–5× cheaper than Lit on mobile. For background decor, ground shadows, billboards Unlit sufficient. Lit shader per-pixel only for near plane and key objects.

Profiling: Tool Usage Order

Start with Unity Profiler connected to device via USB (Build → Development Build + Autoconnect Profiler). GPU Usage Profiler shows render time by categories. Frame Debugger—detailed draw call breakdown. Memory Profiler—memory snapshot with category breakdown.

For Android additionally: Android GPU Inspector (AGI) for Adreno devices, Mali Performance Counters for Mali GPU. Show fill rate utilization, texture bandwidth, cache hit rate—metrics unavailable in Unity Profiler.

Task Timeline
Performance audit + recommendations report 2–5 days
Texture and material optimization (one scene) 3–7 days
Comprehensive graphics optimization (entire project) 2–6 weeks
Optimize for specific minimum device 1–3 weeks

Cost determined after project audit and current metrics analysis.