Оптимизация сцены где очень много объектов
| |
KamiRonin | Дата: Суббота, 26 Октября 2013, 08:24 | Сообщение # 61 |
почти ветеран
Сейчас нет на сайте
| Цитата robertono ( ) Как бы это не смотрелось.. Это IENumerator! интерфейс перечислитель? прикольно. ну не знаю.. смотреть надо.. но раз у тебя от него фпс взлетает - то супер! (хотя по моему он этим не занимается.) ну вот и разобрались! помог чем мог, на здоровье.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
robertono | Дата: Суббота, 26 Октября 2013, 12:23 | Сообщение # 62 |
Чокнутый Кот
Сейчас нет на сайте
| KamiRonin, я вот попросил моего друга с медленным компом протестировать, где было где то 20к кубов. Даже за 5 минут игра комп не смог скомбинировать в меши. Просто зависает игра и всё. У него geforce 9600 gt , а вот процессор пока не знаю какой. Pentium - Core 2 Duo
|
|
| |
Archido | Дата: Суббота, 26 Октября 2013, 15:36 | Сообщение # 63 |
Сэнсэй
Сейчас нет на сайте
| KamiRonin Уты, какой однако выхлоп, доставило. Остались еще на свете кадры у которых асм +100 к скорости дает:)
Цитата KamiRonin ( ) ты свое талдычишь - "сделай цельную модель и тогда все полетит" Так оно и правда полетит, просто ты не способен это осознать, ты ж понятия не имеешь как оно там рисуется на самом деле. Да и я только предложил способ и причем абсолютно не тебе, но у кого-то начался батхерт и проблемы с осознанием(чтением):) Вообщем, повеселились и пойдет. Срач тут точно никому не нужен.
Цитата robertono ( ) combinemeshes очень крутая вещь... Кстати, а после него кубы обратно выудить возможно или нет? И если да, то насколько быстро? Вот скажем закомбайнил ты здание и хочешь оттуда парочу кубов удалить \ переместить, как это будет происходить? Спортивный интерес.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
KamiRonin | Дата: Суббота, 26 Октября 2013, 16:10 | Сообщение # 64 |
почти ветеран
Сейчас нет на сайте
| Цитата robertono ( ) я вот попросил моего друга с медленным компом протестировать, где было где то 20к кубов. Даже за 5 минут игра комп не смог скомбинировать в меши не, у него в чем то другом дело. комбинит нормально!! тут памяти нужно больше.. чем видяхи.. вот если бы был полноценный г.-инстансинг - тогда видяха бы делала.
Добавлено (26.10.2013, 16:10) --------------------------------------------- Цитата Archido ( ) Остались еще на свете кадры у которых асм +100 к скорости дает:) ну 100 не 100 а дает и конкретный. для тех кто в танке: Unity работает с C# (+ javascript) а это формальный язык проходящий через ДВЕ трансляции.. да еще код на выходе не всегда совершенный. Так что можешь не сомневаться -- ассемблер будет работать в несколько раз быстрее... по крайней мере до окончательной компиляции исходников. да и потом тоже бывает. (на чем надо програмить чтобы этого не знать. это ж азы!).
Цитата Archido ( ) Вообщем, повеселились и пойдет. Срач тут точно никому не нужен. да уж поржал с твоими постами не по детцки!
Цитата Archido ( ) Кстати, а после него кубы обратно выудить возможно или нет? И если да, то насколько быстро? Вот скажем закомбайнил ты здание и хочешь оттуда парочу кубов удалить \ переместить, как это будет происходить? Спортивный интерес.
внутри основного объекта в который сливается единый меш - остаются все дочерние ссылки, но не меши. поэтому по простой команде - получаешь доступ к любому из них и Destroy или transform.position... но тогда нужно рекомбинировать меш заново. а это не есть хорошо. а так - доступ в легкую и модификация на раз... поэтому робертону не перестаю повторять - уходи ты от этих реальных кубов!! делай виртуальные!! все будет намного лучше и глаже работать!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Суббота, 26 Октября 2013, 16:12 |
|
| |
Archido | Дата: Суббота, 26 Октября 2013, 17:27 | Сообщение # 65 |
Сэнсэй
Сейчас нет на сайте
| Цитата KamiRonin ( ) Unity работает с C# (+ javascript) а это формальный язык проходящий через ДВЕ трансляции.. Сделал домашнее задание? Ай маладца. Unity на C# написан или может на ассемблере? Тогда в несколько раз быстрее будет, камиронин знает о чем говорит, лол.
Цитата KamiRonin ( ) Так что можешь не сомневаться -- ассемблер будет работать в несколько раз быстрее... Да я и не сомневаюсь, ты же лично свечку держал, как тут можно усомниться:)
Цитата KamiRonin ( ) на чем надо програмить чтобы этого не знать. это ж азы! Действительно. Юнити-выкормыш во всей красе:)
Цитата KamiRonin ( ) да уж поржал с твоими постами не по детцки! А ты все продолжаешь меня веселить:) Да и смотрю ты не только меня одного уже успел посмешить.
Цитата KamiRonin ( ) внутри основного объекта в который сливается единый меш - остаются все дочерние ссылки, но не меши. поэтому по простой команде - получаешь доступ к любому из них и Destroy или transform.position... но тогда нужно рекомбинировать меш заново. а это не есть хорошо. а так - доступ в легкую и модификация на раз... Короче, комбайн делает половину того, что я предложил:) Только в готовом виде.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
robertono | Дата: Воскресенье, 27 Октября 2013, 01:04 | Сообщение # 66 |
Чокнутый Кот
Сейчас нет на сайте
| Цитата KamiRonin ( ) но тогда нужно рекомбинировать меш заново но всё здание комбинировать нет смысла. Можно например при комбинировании разделить здание на 4 - 6 частей. И тогда нужно будет комбинировать одну только, что будет намного быстрее.
Кстати мой друг всё же решил проблему, и игра у него не зависала. Замерить скорость комбинирования мы не смогли, но я узнал его процессор. AMD Athlon 2 X2 245 2,91 ГГц и 2 гб оперативки Добавлено (27.10.2013, 01:04) ---------------------------------------------
Цитата Archido ( ) Короче, комбайн делает половину того, что я предложил:) повторишь в двух словах что ты предлагал?
|
|
| |
Archido | Дата: Воскресенье, 27 Октября 2013, 05:44 | Сообщение # 67 |
Сэнсэй
Сейчас нет на сайте
| Цитата robertono ( ) повторишь в двух словах что ты предлагал? White9 хорошо описал общий вид в своем посте
Ну, а так ты уже сам фактически дошел до этого. Я как раз и предлагал не работать с каждый кубом по отдельности, а группировать некоторое их количество в один меш и при необходимости подменять этот меш на набор кубов-объектов (общий вид). Собственно, MeshCombine сам делает почти тоже самое. Он упаковывает всю геометрию в единый буфер (меш) и эффективно ее рисует, но при этом сохраняет сами первоначальные объекты, так что к ним можно получить доступ (вместо подмены в моем случае, но суть таже). Естественно, что общую модель нужно разбивать на части (здание я предлагал разбивать на "этажи") и их уже "комбинировать", что при изменении и "рекомбинировании" будет работать быстрее.
В добавок, чтобы небыло сильных лагов (подвисаний) когда ты делаешь "кобмайн", можно размазать этот процесс во времени, т.е. делать одну такую операцию на кадр. Добавляешь например, объекты, которые нужно объединить, в очередь и раз в кадр извлекаешь оттуда объект, "комбинируешь" и так пока очередь не опустеет. Ну и само собой, объединять нужно только тогда, когда игрок перестал "взаимодействовать" с определенным мешем (переключился на другой, удалился на некоторое расстояние, etc), чтобы лишнюю работу зря не делать. Здесь бы очень пригодился инстансинг, но как им пользоваться в Unity я понятия не имею:)
P.S. Единственное, что не очень хорошо: используя MeshCombine, нельзя отделить визуальную часть от физической. Каждая копия физической порождает копию визуальной, что представляет собой некоторый оверхед по памяти. Если у нас есть штук 20 зданий и все они пока находятся в "целом" состоянии, то для их отрисовки требуется всего лишь одна визуальная часть "этажа" (да и физических пока не требуются), в случае с MeshCombine'ом в памяти будут находится все этажи албсолютно всех зданий, причем как визуальной части, так и физической.
В этой задаче очень хорошо бы подошел вариант с псевдоинстансингом и текстурами, о котором упоминал Xakep, но похоже это тема уже не для Unity раздела:)
P.S.S И да, сорри, в двух словах не получилось
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Воскресенье, 27 Октября 2013, 05:44 |
|
| |
robertono | Дата: Воскресенье, 27 Октября 2013, 12:32 | Сообщение # 68 |
Чокнутый Кот
Сейчас нет на сайте
| Цитата Archido ( ) (здание я предлагал разбивать на "этажи") и их уже "комбинировать", что при изменении и "рекомбинировании" будет работать быстрее. Да я вроде как и тоже самое предложил, и сейчас это делаю. Только я предложил при комбинировании меши делать, допустим 1 скомбинированный меш макс 15к вершин. А как можно получить кол-во вершин одного объекта?
|
|
| |
PaRtIzAn_MaXs | Дата: Воскресенье, 27 Октября 2013, 16:11 | Сообщение # 69 |
почетный гость
Сейчас нет на сайте
| Цитата robertono ( ) Здравствуйте! У меня вопрос по поводу оптимизации игры. Как это делается в играх где мир состоит из кубов (или просто очень много объектов) ? Ведь в играх где кубы, это отдельные кубы, ведь каждый можно разрушить, но лагов то нету. А там на камере видно очень много кубов!
Я построил здание из кубов, раскопировал его по сцене. Получилось около 60 к кубов видимых на камере! Но ведь это даже совсем не детализированные здания. При этом на i5 3570 и gtx 770 выдаёт всего то 7 фпс. Как убираются лаги? И почему лагов в других играх нету? Например ace of spades. У меня это просто объекты. А как это делается в других играх и за счёт чего лаги полностью отсутствуют даже на слабых системах ?
Заранее спасибо! Robertono,мне тоже кажеться что лучше уменьшить дальность прорисовки.Я так думаю ты хочешь что бы это разрушилось как в BF 4?
C#-Unity3D
|
|
| |
robertono | Дата: Воскресенье, 27 Октября 2013, 18:09 | Сообщение # 70 |
Чокнутый Кот
Сейчас нет на сайте
| Цитата PaRtIzAn_MaXs ( ) Я так думаю ты хочешь что бы это разрушилось как в BF 4? ты хоть понимаешь как это реализовано в battlefield 4 ? Не понимаешь походу.
|
|
| |
PaRtIzAn_MaXs | Дата: Воскресенье, 27 Октября 2013, 18:11 | Сообщение # 71 |
почетный гость
Сейчас нет на сайте
| Цитата robertono ( ) ты хоть понимаешь как это реализовано в battlefield 4 ? Не понимаешь походу. Несовсем понимаю)
C#-Unity3D
|
|
| |
robertono | Дата: Воскресенье, 27 Октября 2013, 18:17 | Сообщение # 72 |
Чокнутый Кот
Сейчас нет на сайте
| PaRtIzAn_MaXs, это тупо анимация. Падение здания - тупо большая анимация и спавн объектов. Ничего сверхсекретного там нету. Анимация модели + частицы. Готово.
|
|
| |
PaRtIzAn_MaXs | Дата: Воскресенье, 27 Октября 2013, 18:21 | Сообщение # 73 |
почетный гость
Сейчас нет на сайте
| Цитата robertono ( ) PaRtIzAn_MaXs, это тупо анимация. Падение здания - тупо большая анимация и спавн объектов. Ничего сверхсекретного там нету. Анимация модели + частицы. Готово. Спасибо за инфу))
C#-Unity3D
|
|
| |
Xakep | Дата: Воскресенье, 27 Октября 2013, 18:46 | Сообщение # 74 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата robertono ( ) PaRtIzAn_MaXs, это тупо анимация. Падение здания - тупо большая анимация и спавн объектов. Ничего сверхсекретного там нету. Анимация модели + частицы. Готово. мне кажется сначала процедурно разбивается нужная геометрия на куски, потом этот расчет где-то сохраняется, и уже используется в реалтайме, и просто к осколкам прикручивают физику, ну и частицы как дополнительный эффект.
Цитата Archido ( ) В этой задаче очень хорошо бы подошел вариант с псевдоинстансингом и текстурами, о котором упоминал Xakep, но похоже это тема уже не для Unity раздела:) да, только я немного опечатался, не в текстурах хранится матрица, а в текстурных координатах ) если брать GLSL то матрица извлекается из текстурных координат таким образом: Код positionWorld.x = dot(gl_MultiTexCoord1, gl_Vertex); positionWorld.y = dot(gl_MultiTexCoord2, gl_Vertex); positionWorld.z = dot(gl_MultiTexCoord3, gl_Vertex); positionWorld.w = 1.0;
а в текстурные координаты запекается так: Код glMultiTexCoord4fv(GL_TEXTURE1, @Objects[i].Matrix[0]); glMultiTexCoord4fv(GL_TEXTURE2, @Objects[i].Matrix[1]); glMultiTexCoord4fv(GL_TEXTURE3, @Objects[i].Matrix[2]);
может пригодится если захочешь сам реализовать, главное сама идея )
|
|
| |
robertono | Дата: Воскресенье, 27 Октября 2013, 18:49 | Сообщение # 75 |
Чокнутый Кот
Сейчас нет на сайте
| Xakep, и теперь гадай кто про что говорит. Я например говорил про здание, которое падает в карте siege of shanhai в battlefield 4. Если хакер Вы имели ввиду именно разрушения (барюды, ограждения) то я не про них
|
|
| |
Xakep | Дата: Воскресенье, 27 Октября 2013, 19:29 | Сообщение # 76 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата robertono ( ) Если хакер Вы имели ввиду именно разрушения (барюды, ограждения) то я не про них я про разрушение )) я просто не играл в бф, думал про это разговор ))
|
|
| |
robertono | Дата: Понедельник, 28 Октября 2013, 00:10 | Сообщение # 77 |
Чокнутый Кот
Сейчас нет на сайте
| Xakep, Я если честно сам не знал о чём разговор Добавлено (27.10.2013, 23:59) ---------------------------------------------
Цитата Archido ( ) В добавок, чтобы небыло сильных лагов (подвисаний) когда ты делаешь "кобмайн", можно размазать этот процесс во времени, т.е. делать одну такую операцию на кадр. Добавляешь например, объекты, которые нужно объединить, в очередь и раз в кадр извлекаешь оттуда объект, "комбинируешь" и так пока очередь не опустеет. А мне кажется в очереди не получится комбайнить... Хотя даже не знаю. Например есть у нас 2000 кубов. Их нужно скомбинировать в 1 . За 1 кадр максимум можно комбинировать 100. И что дальше? Разом mesh.combineMeshes (CombineInstance) ? Или в первый кадр mesh.combineMeshes(первые 100) , второй кадр mesh.combineMeshes (то что уже скомбайнено + ещё 100 ?) . А идея кстати хорошая Те у кого мало фпс при игре, здания не будут конечно быстро комбинироваться, но за то и лагов не будет .А те у кого 300 фпс будет очень красиво, быстро и гладко. Добавлено (28.10.2013, 00:06) --------------------------------------------- А как узнать когда прошел кадр то ? Добавлено (28.10.2013, 00:10) ---------------------------------------------
Код IEnumerator Example() { yield return new WaitForSeconds(Time.deltaTime); }
Так что ли ? Выполнять буду в короутайнах. Дельта тайм вроде выдаёт время за которое прошла обработка одного кадра. Вот его и получаем и ждём. Правильно делаю?
|
|
| |
|