Mojtaba Rajabi

Mojtaba Rajabi photo
Novin Games
Founder & CEO
Talk title:

Performance optimization and final build file size reduction in Unity3D (Mobile Oriented Tips&Tricks)


I've been developing games for 10 years now and I have around 8 years of experience with Unity.

I'm teaching Unity at the "University of Science and Culture" for two years now.

Some of my published games are:

Ava'a Quest | 2013 | Project Manager and Programmer | best casual game in 3rd TGF | best technical game in 3rd TGF

The Guest | 2016  | Project Manager and Programmer

X Racer | 2018 | Project Manager and Programmer

Talk abstract:

Limitations and Bottlenecks in File Size, Memory, CPU, GPU

Using Unity3D Profiler Tool


Why drawcalls are important and how decrease its count.

Custom Skybox Creation

Avoid changing scale and especially negative scale values

Use “Shared Material” instead of material

Garbage Collection:

Find heap allocations

Use integer id reference instead of object reference

Call collect function manually

Use Coroutines properly

How use strings to prevent GC

Cash variables to prevent GC

Don’t allocate in functions that call frequently

Use clear on list instead of creating new one

Prevent boxing

Struct or Class?


Timing update function

Don’t use unnecessary codes in update functions

Don’t use circular functions and pow function

Don’t use new and GetComponnect in update functions

Don’t use find object (use singleton, reference, etc)

Don’t use Playerprefs in update functions

Disable scripts or use simple code for far objects (like LOD)

Erase update function if you didn’t use it

Fish-Pool Design Pattern

Remove unnecessary codes from loops (like if in for)

Use localPosition instead of position whenever possible

Cash position if you want to use it a lot

Reduce mathematical calculations on vectors (use other variable types)

In length comparison use sqrMagnitude instead of magnitude

Don’t use Camera.main (it is like find functions)

Active scripts that change visual, only when it is in camera view

Be careful using nested loops

Cash component in other scripts instead of using GetComponent


Be conscious about vertices and triangles count

Use vertex weld to reduce vertices count

Combine meshes

Combine near objects

Reduce UV mapping seams (prevent double vertices)

Use smooth groups

Use less triangles in less curvy surfaces and sections of meshes

Use Terrain to Mesh tools and appropriate shaders (for mobile platform)

Turn vertex tangents off if you’re not using Normal Maps


Best settings for textures

Texture Atlas

When to use texture compression

What is mipmap and when use it


Use mobile optimized shaders

Use unlit shaders (if scene light won’t change)

Use cutout shaders instead of transparent shaders

Try to minimize the use of heavy calculative methods and functions (e.g. pow, exp, log, cos, sin, tan)

Do not try to reinvent the wheel (use already made methods like normalize, dot, inversesqrt)

Use float value with less precision where possible (float vs half vs fixed variables)


Divide audios to 3 main sections (fx audios, mid long audios like dialogs, musics)

Play only one file with streaming option enabled


Use layer collision matrix

Use simple unity colliders instead of mesh collider

use rigidbody components on objects with colliders

Increase fixed timestep in time settings (not is fast paced games)

Particle Systems:

Restrict max particle counts

Be careful about slow and overlapped particles like smoke and fire

Cache and use non-looped particle effects like gun fire

Move particles with camera to reduce overall particle count


Reduce Resolution

Use bone animation instead of vertex animation

Static and dynamic batching

Baked Lighting

Occlusion Culling

Don’t use realtime shadow

Use Light Probes

Use reflection probe

Use lens flares, fake boom, fake shadow

Use only one light (sun)

Quality Settings



When use separated scenes?

Merge two fonts (e.g Persian and English) instead of using two fonts

Prevent an object to have lots of children if they will translate, rotate and/or scale

Prevent overlapping lots of sprites

Use UV scrolling for creating effects like rivers

Reduce far clip plane

Use textures to create fake light reflections like brake light reflection

Final build file size reduction:


Texture Atlasing


Texture Separation

Tiled Images and Sliced Images

Don’t use repetitive sprites (like coins, windows)

Use cutout animations instead of frame animations

Be careful about Texture Bleeding

Custom Skybox

Use vertex colors instead of texture baked lighting

Use mesh instead of textures (like lines in vehicles)

Disable Read/Write Enabled

Use lower texture resolutions on fast moving objects


Divide audios to 3 main sections (Fx audios, mid long audios like dialogs and musics)

Use force to mono option

Compress audio as far as you can’t tell the difference in audio quality

Use loop audios

Create ambient audios with a few short and small audios

Use pitch to create variety in audios (like step audio)


Setting explanations

Use mesh compression

Assign more texture space (Texel per unit) to more important parts of meshes

Remove duplicate meshes (like cylinder section in rims)

Use multiple separate meshes to create and design game environments instead of creating the whole environment in 3D packages. Use modular 3D modeling is possible


Use UV2 for shared decals in objects

Don’t reference resources that shouldn’t be in the final build

Choose ARMv7 in Device Filter

Set Stripping Level

Use .Net 2.0 Subnet

Use scale factor in Baked Lighting