Particle system and VFX development for mobile game

NOVASOLUTIONS.TECHNOLOGY is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.
Development and support of all types of mobile applications:
Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1 servicesAll 1735 services
Particle system and VFX development for mobile game
Medium
~3-5 business days
FAQ
Our competencies:
Development stages
Latest works
  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    445

Mobile Game Particle Systems and VFX Development

A particle system on mobile is a constant trade-off between visual quality and GPU budget. A desktop effect with 50,000 particles will cause iPhone 11 to overheat and drop to 20 FPS. The task is finding the sweet spot where effects look convincing with 10,000 particles or fewer.

Tool Selection: Unity vs SpriteKit vs Metal

Most mobile games use one of three: Unity Particle System (Shuriken), Apple SpriteKit SKEmitterNode, or custom systems with Metal/OpenGL ES/Vulkan for specialized requirements.

Unity Shuriken is the de facto standard. Visual editor, Sub Emitters support, GPU Instancing, Burst compiler for CPU simulation. VFX Graph (GPU simulation via Compute Shaders) works on mobile starting with Metal (iOS 12+) and Vulkan (Android API 24+). On older devices VFX Graph is unavailable — fallback to Shuriken is required.

SpriteKit SKEmitterNode is native to iOS for 2D games. Simple, fast, no Unity overhead. But limited: no Sub Emitters, no custom shaders without Metal. For simple effects (fire, rain, confetti) it's sufficient.

Particle Budget and GPU Constraints

On mobile GPUs (Apple A-series, Adreno, Mali), the bottleneck is often not particle count but overdraw — how many times each screen pixel is redrawn per frame.

Semi-transparent particles with additive blending (Additive shader mode) cause overdraw proportional to layer count. On a 5000-particle explosion at screen center, actual overdraw can be 50–100x. This kills fill rate even on A15.

Optimization strategies:

  • Texture Atlasing: all particle sprites in one 512×512 or 1024×1024 atlas. Reduces draw calls per texture swap
  • Billboard imposters: for volumetric effects (explosion cloud) — quad with baked texture instead of hundreds of spheres
  • LOD for particles: at distance / under low FPS — reduce maxParticles by half via QualitySettings.particleRaycastBudget or custom LOD manager
// Unity: dynamic particle system LOD by FPS
public class ParticleLODManager : MonoBehaviour {
    [SerializeField] private ParticleSystem targetSystem;
    private ParticleSystem.MainModule _main;
    private float _fpsTimer;

    void Start() {
        _main = targetSystem.main;
    }

    void Update() {
        _fpsTimer += Time.deltaTime;
        if (_fpsTimer < 1f) return;
        _fpsTimer = 0;

        float fps = 1f / Time.smoothDeltaTime;
        if (fps < 45f) {
            _main.maxParticles = Mathf.Max(100, _main.maxParticles / 2);
        } else if (fps > 58f && _main.maxParticles < originalMax) {
            _main.maxParticles = Mathf.Min(originalMax, _main.maxParticles * 2);
        }
    }
}

Custom Shaders for Mobile VFX

Built-in Unity particle shaders (Particles/Standard Unlit) are safe but limited. For dissolve effects, heat distortion, energy shields — custom shaders are needed.

On mobile, rules are strict: no discard in shaders (early Z-test breaks, fill rate drops), minimal texture samples, avoid dependent texture reads. Shader Model 2.0 as baseline for wide coverage.

Example simple distortion effect for explosions (Unity HLSL):

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

sampler2D _NoiseTex;
float _DistortionStrength;
float _FadeEdges;

fixed4 frag (v2f i) : SV_Target {
    float2 noise = tex2D(_NoiseTex, i.uv + _Time.y * 0.3).rg * 2 - 1;
    float2 distortedUV = i.uv + noise * _DistortionStrength * i.color.a;

    float edge = 1 - saturate(distance(distortedUV, float2(0.5, 0.5)) * _FadeEdges);
    fixed4 col = tex2D(_MainTex, distortedUV) * i.color;
    col.a *= edge;
    return col;
}
ENDCG

i.color.a is particle alpha from Unity Particle System, synchronized with lifetime. Distortion fades with the particle automatically.

SpriteKit Effects: Fire and Confetti

SKEmitterNode is configured either in Xcode editor (.sks file) or programmatically. Programmatically is preferable for dynamic parameters:

func makeFireEmitter() -> SKEmitterNode {
    let emitter = SKEmitterNode()
    emitter.particleTexture = SKTexture(imageNamed: "spark")
    emitter.particleBirthRate = 120
    emitter.particleLifetime = 1.2
    emitter.particleLifetimeRange = 0.4
    emitter.particleSpeed = 80
    emitter.particleSpeedRange = 40
    emitter.emissionAngle = .pi / 2  // upward
    emitter.emissionAngleRange = .pi / 8
    emitter.particleScale = 0.15
    emitter.particleScaleSpeed = -0.1
    emitter.particleAlphaSpeed = -0.8
    emitter.particleColorSequence = SKKeyframeSequence(
        keyframeValues: [SKColor.yellow, SKColor.orange, SKColor.red, SKColor.clear],
        times: [0, 0.3, 0.7, 1.0]
    )
    emitter.particleBlendMode = .add
    return emitter
}

.add blending is additive mixing. Fire and sparks look glowing. Don't use for smoke and dust — use .alpha for those.

GPU Profiling Tools

Xcode Metal Debugger — frame capture for Metal games. See every draw call, textures, overdraw visualization. For Unity on iOS: via Xcode GPU Frame Debugger when connected via USB.

Android GPU Inspector (AGI) — from Google for Adreno and Mali. Frame Profiler shows pipeline stages where GPU waits.

Unity Profiler — built-in, shows CPU/GPU time for each effect's render. If Rendering → ParticleSystem.Update exceeds 2ms, check CPU simulation and reduce maxParticles or switch to GPU Mode.

Workflow

Technical art direction: which effects are needed, their frequency on-screen simultaneously, target devices. Develop shaders and particle systems in the editor with profiling on weak Android devices. Set up LOD system. Integrate into game engine, test thermal throttling (10-minute gameplay session with temperature monitoring).

Timeline Estimates

3–5 working days for a basic VFX set (3–5 effect types). Complex custom system with Metal Compute Shaders — from 2 weeks.