- Home /
what's the best way to reduce draw calls?
Following on from "What is a reasonable number of draw calls relative to one hardware configuration ? @ http://answers.unity3d.com/questions/2117
what's the best way to reduce draw calls?
EDIT : Link updated to Qato link
Did you check this video how he reduced draw calls from 69 to 12. video
Following link made my day https://www.youtube.com/watch?v=tW3Jt7quQmQ&feature=youtu.be Thanks
Answer by duck · Apr 07, 2010 at 10:35 AM
Draw calls, broadly speaking, are similar to when a painter has to un-load their brush with one colour of paint, and load it up with another, before continuing to draw.
In GPU terms though, the different "paint colours" equates to different materials in your scene, and different models which can move independently.
Therefore, you can reduce these number of draw calls by designing the objects in your scene so that as much as possible can be drawn with each single "call".
Combining Meshes of the same material & texture.
If you have a number of scattered scenery objects in your scene which all use the same texture and material - for example, many buildings, rocks, fences, etc - which do not need to move independently, you can combine these objects together into a single large mesh which shares one single material even though the parts may be physically separate in space. This way, you incur one draw call for the whole set, rather than one per object.
You can automatically combine meshes in Unity using the CombineChildren script provided in the Standard Assets package.
Combining Meshes with different materials & textures.
If you have objects which use different textures and materials, it's still possible to combine them into a single mesh and thereby reduce draw calls, by creating what's known as a Texture Atlas. A texture atlas is a single large texture which contains each of the smaller textures used by a number of objects. Each object's UV coords is modified to fit the smaller area within the atlas. There are a couple of drawbacks to this technique, one of which is that all the objects must now use the same material, and therefore the same shader type (even though they keep their respective textures).
For example, if you had a building which uses different textures for the roof, doors, walls, beams, cornerstones, windows, etc, you might combine these into a single texture atlas. In doing this, you sacrifice the ability to use a different material for each item, but you gain the benefit of being able to collapse the various parts of the building into a single mesh with a single material, therefore enabling you to draw the entire building in 1 call, instead of many:
Typically though, the original "window" material might be transparent and reflective, and therefore wouldn't necessarily be suitable to be merged down into a single material with the other textures, so you might end up with two texture atlases for the final building. One for the opaque, non-reflective parts, and one for the transparent reflective parts.
If you then also have lots of buildings which use these same textures, you could combine these building meshes together too - so for example, you might end up with 10 buildings drawn with just two draw calls: one mesh (and one call) for the combined opaque parts of all 10 buildings, and another mesh & call for the combined transparent reflective parts of all 10 buildings.
This page on GamaSutra has an example of a tightly packed texture atlas which encompasses many objects into one texture: GamaSutra - Practical Texture Atlases
And here's a 3ds Max script which automatically generates texture atlases for you: Texture Atlas Generator. This is worth looking at even if you don't have 3ds Max, because the page has some good animated examples of how a texture atlas is formed.
Texture atlases are also commonly used in games which use 2D sprites for similar reasons, to avoid having to use different materials for each object, and to combine many frames of animation on to a single texture. In these cases they're sometimes referred to as Sprite Sheets.
Another point worth noting is that Unity iPhone supports an automatic batching feature, which automatically combines meshes which share the same material. This means that you can even reduce draw calls further by sharing materials between objects that are moving relative to each other in the scene! (Hopefully this feature will make it into the regular version of unity at some point, but that is just speculation for now!).
wow lots of info - thanks - i am sure this will be useful to many people :)
Note: Unity 3 now implements this feature for all platforms, not just iPhone.
another drawback is that combining identical objects to a big one might increase the file size.
Does the new Auto-Batching feature in Unity 3 (was previously only on iPhone) basically mean you don't need to combine meshes with the same material manually and the docs just haven't been updated (where they say to "combine,combine,combine")? The meshes I'm talking about would be dynamic meshes in Unity Pro targeting PC Standalone.
Combining meshes is not all gain. For example, it defeats occlusion culling optimizations. Drawing the whole village while you're inside one building, for example, is clearly inefficient, regardless of how cleverly GPU-side culling is.
Answer by Nabeel Saleem · Nov 24, 2014 at 11:24 AM
The best way i found is using this free and amazing purdyjo's plugin by using this you can reduce big numbers of draw calls :)
I found tutorial HERE and tried in my 3d game which has huge draw calls and i got succeed to reduce them :)
O yes this plugin works best in most situation I recommend it.
Answer by Eric5h5 · Apr 07, 2010 at 10:00 AM
Combine objects using the same material into one object (or at least fewer objects), either manually or with the CombineChildren script. If this isn't feasible because of having too many different materials, you can make fewer materials by combining different textures into texture atlases and then UV mapping objects which used those textures to take advantage of this. Then, with fewer materials, you'll have more objects that can be combined.
if I do 2048 x 2048 textures combining my lightmaps will they be compatible with older graphic cards?
How old is 'older'? I think cards have supported 2048x2048 since the the Radeon 9800, and that is now pretty 'old' hardware,
@noradninja: Older than that...even the Radeon 7000 supports 2048x2048.
Answer by Mikeh · Sep 23, 2010 at 10:34 PM
all good!.. and dont forget to disable invisible objects in camera culling mask...
Answer by Ippokratis · Jun 01, 2011 at 05:25 PM
The Bob script ! It is a script I made (MIT license) that helps you reduce draw calls of dynamic and static ( atm click here for static ) meshes, reducing them to one draw call per shader. To my knowledge this is as low as it gets.