Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Общие вопросы о Unity3D

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Zavhoz 11 сен 2009, 06:31

идеальное решение! :ymparty:
больщое спасибо за подсказку :-bd
FUNNY BLOX
Аватара пользователя
Zavhoz
UNITрон
 
Сообщения: 197
Зарегистрирован: 10 фев 2009, 07:23
Откуда: Караганда KZ
  • ICQ

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Neodrop 11 сен 2009, 11:41

Мне кажется, это просто яйца в профиль. CombineChildren из StandartAssets чем то не подходит?
Чем этот скрипт лучше? (нет времени эксперементить, подскажите, если есть разница).
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение gnoblin 11 сен 2009, 12:34

CombineChildren построен на основе MeshMerger по-моему.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Neodrop 11 сен 2009, 12:40

Какая разница? Зато, в отличие от этого скрипта, Комбинатор - официальный компонент и 100% безглючен.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение bakca 11 сен 2009, 15:34

Да, или его. Внутри CombineChildren кажется более продвинутым, чем MeshMerger.
Но в моих попытках на скорую руку заменить им MeshMerger, не смог добиться, чтобы у дочерних объектов оставалось отдельное от родителя поведение.
Аватара пользователя
bakca
UNец
 
Сообщения: 19
Зарегистрирован: 03 авг 2009, 11:10

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Neodrop 11 сен 2009, 18:41

Так он их отрубает. То есть после комбинирования, остаётся один объект по-сути. Ну, точнее столько, сколько использовано материалов на объектах.
Я вообще подправил его так, что "лишние объекты" автоматом удаляются.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Yogan 17 ноя 2009, 14:08

bakca писал(а):А не помогает MeshMerger?
Который вот тут в компонентной реализации выложен: http://www.unifycommunity.com/wiki/inde ... MeshMerger
Я правда компоновал с его помощью спрайты (двухтреугольниковые плэйны). Результат поразительный.
Разумеется у объектов должен быть один и тот же материал - как раз ваш случай.
Если надо, могу выложить не-компонентный класс того же MeshMerger-а, переведенный на яваскрипт. Переделал, чтобы была возможность повторно вызывать компоновщик при добавлении-удалении объектов.

Если не трудно выложи (js)
_ttp://oniPhone.ru
Аватара пользователя
Yogan
UNец
 
Сообщения: 33
Зарегистрирован: 10 авг 2009, 10:52

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение bakca 17 ноя 2009, 14:40

Синтаксис:
Используется javascript
// --------- MeshMerger.js
// Use:
//                      merger = new MeshMerger(parentObject, material);
//                      merger.Merge();
//      or:
//                      merger = new MeshMerger(parentObject, null); // get material from first children
//                      merger.Merge();

#pragma strict

class MeshMerger {
        var parentObject: GameObject;
        var material: Material;
       
        // Constructor
        function MeshMerger (obj: GameObject, mat: Material) {
                parentObject = obj;
                material = mat;
        }
       
        function Merge () {
                // hook up the mesh renderer
                var smr: SkinnedMeshRenderer = parentObject.GetComponent(SkinnedMeshRenderer);
                if (!smr) smr = parentObject.AddComponent(SkinnedMeshRenderer);
                if (smr.sharedMesh) parentObject.Destroy(smr.sharedMesh);

                // find all the mesh filters
                var meshFilters: Component[]  = parentObject.GetComponentsInChildren(MeshFilter);
               
                if (meshFilters.Length != 0) {
                        // figure out array sizes
                        var vertCount: int = 0;
                        var normCount: int = 0;
                        var triCount: int = 0;
                        var uvCount: int = 0;

                        for (var mf: MeshFilter in meshFilters) {
                                vertCount += mf.sharedMesh.vertices.Length;
                                normCount += mf.sharedMesh.normals.Length;
                                triCount += mf.sharedMesh.triangles.Length;
                                uvCount += mf.sharedMesh.uv.Length;
                                if (!material) material = mf.gameObject.renderer.material;
                        }

                        // allocate arrays
                        var verts: Vector3[] = new Vector3[vertCount];
                        var norms: Vector3[] = new Vector3[normCount];
                        var aBones: Transform[] = new Transform[meshFilters.Length];
                        var bindPoses: Matrix4x4[] = new Matrix4x4[meshFilters.Length];
                        var weights: BoneWeight[] = new BoneWeight[vertCount];
                        var tris: int[] = new int[triCount];
                        var uvs: Vector2[] = new Vector2[uvCount];
               
                        var vertOffset: int = 0;
                        var normOffset: int = 0;
                        var triOffset: int = 0;
                        var uvOffset: int = 0;
                        var meshOffset: int = 0;
               
                        // merge the meshes and set up bones
                        for (var mf: MeshFilter in meshFilters) {    
                                for (var i: int in mf.sharedMesh.triangles) tris[triOffset++] = i + vertOffset;
                                aBones[meshOffset] = mf.transform;
                                bindPoses[meshOffset] = Matrix4x4.identity;
                                for (var v: Vector3 in mf.sharedMesh.vertices) {
                                        weights[vertOffset].weight0 = 1.0;
                                        weights[vertOffset].boneIndex0 = meshOffset;
                                        verts[vertOffset++] = v;
                                }
                                for (var n: Vector3 in mf.sharedMesh.normals) norms[normOffset++] = n;
                                for (var uv: Vector2 in mf.sharedMesh.uv) uvs[uvOffset++] = uv;
                                meshOffset++;
                                var mr: MeshRenderer =  mf.gameObject.GetComponent(MeshRenderer);
                                if (mr) mr.enabled = false;
                        }

                        // hook up the mesh
                        var me: Mesh = new Mesh();      
                        me.name = parentObject.name;
                        me.vertices = verts;
                        me.normals = norms;
                        me.boneWeights = weights;
                        me.uv = uvs;
                        me.triangles = tris;
                        me.bindposes = bindPoses;

                        smr.sharedMesh = me;
                        smr.bones = aBones;
                        smr.material = material;
                }
        }
}
 
Последний раз редактировалось bakca 02 мар 2010, 17:03, всего редактировалось 2 раз(а).
Аватара пользователя
bakca
UNец
 
Сообщения: 19
Зарегистрирован: 03 авг 2009, 11:10

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Neodrop 17 ноя 2009, 15:05

На кой? Теперь же есть функция в Ядре : Mesh.CombineMeshes
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Yogan 18 ноя 2009, 11:46

не знал... надо попробовать

тока одни вопрос - это случайно не с версии 2.6 доступно (а то у меня iPhone)?
_ttp://oniPhone.ru
Аватара пользователя
Yogan
UNец
 
Сообщения: 33
Зарегистрирован: 10 авг 2009, 10:52

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Neodrop 18 ноя 2009, 12:43

Да. С 2.6
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение bakca 28 ноя 2009, 20:09

Переделал предыдущий класс под Mesh.CombineMeshes.
Есть одно непонятное, что сделало этот метод и стандартный скрипт CombineChildren неприменимым в моем проекте - в MeshMerger (предыдущий код) результирующий меш каким-то чудесным образом остается связан с параметрами transform дочерних объектов. Два других способа такого не делают. У Mesh.CombineMeshes другая странность - если исполнить его несколько раз с одним родительским объектом и разным состоянием дочерних, то он в результирующем меше визуально накапливает информацию о предыдущих склейках, даже не смотря на то, что родительский меш каждый раз удаляется явным образом.
Синтаксис:
Используется javascript
// --------- Mesh Merger.js
// Use:
//                      merger = new MeshMerger(parentObject, material);
//                      merger.Merge();
//      or:
//                      merger = new MeshMerger(parentObject, null); // get material from first children
//                      merger.Merge();

#pragma strict

class MeshMerger {
        var parentObject: GameObject;
        var material: Material;
       
        // Constructor
        function MeshMerger (obj: GameObject, mat: Material) {
                parentObject = obj;
                material = mat;
        }
       
        function Merge () {
                // hook up the mesh renderer
                var mr: MeshRenderer = parentObject.GetComponent(MeshRenderer);
                if (!mr) mr = parentObject.AddComponent(MeshRenderer);
                var mf: MeshFilter = parentObject.GetComponent(MeshFilter);
                if (!mf) mf = parentObject.AddComponent(MeshFilter);
                if (mf.sharedMesh) GameObject.Destroy(mf.sharedMesh);
               
                var myTransform: Matrix4x4 = parentObject.transform.worldToLocalMatrix;

                // find all the mesh filters
                var comps: Component[] = parentObject.GetComponentsInChildren(MeshFilter);
                var combine: CombineInstance[] = new CombineInstance[comps.Length];
                for (var i = 0; i < comps.Length; i++) {
                        var comp: MeshFilter = comps[i];
                        combine[i].mesh = comp.sharedMesh;
                        combine[i].transform = myTransform * comp.transform.localToWorldMatrix;
                        var submr: MeshRenderer =  comp.gameObject.GetComponent(MeshRenderer);
                        if (!material) material = submr.material;
                        if (submr) submr.enabled = false;
                }
 
                // hook up the mesh
                var me: Mesh = new Mesh();      
                me.name = parentObject.name;
                me.CombineMeshes(combine);
                mf.sharedMesh = me;
                mr.material = material;
                mr.enabled = true;
        }
}
 
Аватара пользователя
bakca
UNец
 
Сообщения: 19
Зарегистрирован: 03 авг 2009, 11:10

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Cybernoise 01 окт 2013, 18:38

у меня похожая ситуация - много обьектов с одинаковыми текстурами вызывают кучу драв колов и фпс падает,с CombineChildren и MeshMerger не работал поэтому есть вопросы :
1)Скрипты вешаются на каждый обьект отдельно или на группу одинаковых обьектов целиком?
2)Работают ли скрипты на движущихся обьектах и обьектах с анимацией?
3)Работают ли на разных обьектах с одинаковой текстурой?
Аватара пользователя
Cybernoise
UNITрон
 
Сообщения: 262
Зарегистрирован: 12 июн 2013, 13:43
Откуда: Одесса
Skype: Mister4ui

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение DbIMok 01 окт 2013, 22:04

В те времена не было динамического батчинга на standalone.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Много объектов, Draw Calls растёт, FPS падает. Как бороться?

Сообщение Johnson 02 окт 2013, 06:40

Cybernoise писал(а):у меня похожая ситуация - много обьектов с одинаковыми текстурами вызывают кучу драв колов и фпс падает,с CombineChildren и MeshMerger не работал поэтому есть вопросы :
1)Скрипты вешаются на каждый обьект отдельно или на группу одинаковых обьектов целиком?
2)Работают ли скрипты на движущихся обьектах и обьектах с анимацией?
3)Работают ли на разных обьектах с одинаковой текстурой?


3 - зависит не от объекта и не от текстуры. Зависит от материала. Если несколько разных объектов с одним и тем же материалом - работает.
Johnson появился в результате деления на null. Кривокодер-рецидивист. Кусается.
Хорошо, что в больнице хирурги не такие же, как новички на этом форуме. Пришел вытащить гвоздь из руки, а они яйца оттяпали...
ProgrammerNotFoundException on line 0!
Аватара пользователя
Johnson
UNIверсал
 
Сообщения: 447
Зарегистрирован: 09 июн 2013, 16:31
Откуда: Пермь
Skype: Johnson1893
  • Сайт
  • ICQ

Пред.След.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8