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
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
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!).
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
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.
all good!.. and dont forget to disable invisible objects in camera culling mask...
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.
For GUI-related stuff, you could use NGUI. For me, in my inventory system I had almost a 300 draw calls drop by using NGUI instead of UnityGUI. It gathers your textures and put them in an atlas, uses other techniques as well to reduce draw calls. Results are impressive.
I have an asset Mesh Baker 2 in the asset store that makes it very easy to build atlases and combine meshes (no scripting required). It can even combine materials that use different shaders. It can be used in the editor or at runtime. There is an evaluation version if anyone is interested.
Use KGFSkyBox (1-2 drawcalls) instead of unity3d sky (6 drawcalls)
A total gain of 5 drawcalls means nothing on a pc but everything on a mobile having a max dc of 30!
Best wishes,
Michal
If you have a complex scene containing high polygon 3d models with a lot meshes that use a lot of different materials, the overall performance of your game will suffer. You can check out my tool on the unity asset store “Poly Few” that aims to solve this problem by allowing you to optimize high quality complex 3d scenes. With integrated features like mesh simplification, automatic LOD generation, mesh merging and material combining, you can greatly improve the performance of your game by lowering the Polygon Count, DrawCalls and SetPass calls with a few clicks and, without the need of writing even a single line of code.