Пятница, 22 Ноября 2024, 15:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Оптимизация сцены где очень много объектов
KamiRoninДата: Суббота, 26 Октября 2013, 08:24 | Сообщение # 61
почти ветеран
Сейчас нет на сайте
Цитата robertono ()
Как бы это не смотрелось.. Это IENumerator!

интерфейс перечислитель? smile прикольно. ну не знаю.. смотреть надо.. но раз у тебя от него фпс взлетает - то супер! smile (хотя по моему он этим не занимается.)
smile ну вот и разобрались!
помог чем мог, на здоровье. smile


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
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 минут игра комп не смог скомбинировать в меши

smile не, у него в чем то другом дело. комбинит нормально!! тут памяти нужно больше.. чем видяхи.. вот если бы был полноценный г.-инстансинг - тогда видяха бы делала.

Добавлено (26.10.2013, 16:10)
---------------------------------------------
Цитата Archido ()
Остались еще на свете кадры у которых асм +100 к скорости дает:)

smile ну 100 не 100 а дает и конкретный. для тех кто в танке: Unity работает с C# (+ javascript) а это формальный язык проходящий через ДВЕ трансляции.. да еще код на выходе не всегда совершенный.
Так что можешь не сомневаться -- ассемблер будет работать в несколько раз быстрее... по крайней мере до окончательной компиляции исходников. да и потом тоже бывает. (на чем надо програмить чтобы этого не знать. это ж азы!).

Цитата Archido ()
Вообщем, повеселились и пойдет. Срач тут точно никому не нужен.

да уж поржал с твоими постами не по детцки! smile

Цитата 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 гб оперативки smile

Добавлено (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 И да, сорри, в двух словах не получилось happy


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. Если хакер Вы имели ввиду именно разрушения (барюды, ограждения) то я не про них smile
XakepДата: Воскресенье, 27 Октября 2013, 19:29 | Сообщение # 76
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата robertono ()
Если хакер Вы имели ввиду именно разрушения (барюды, ограждения) то я не про них

я про разрушение )) я просто не играл в бф, думал про это разговор ))
robertonoДата: Понедельник, 28 Октября 2013, 00:10 | Сообщение # 77
Чокнутый Кот
Сейчас нет на сайте
Xakep, Я если честно сам не знал о чём разговор biggrin

Добавлено (27.10.2013, 23:59)
---------------------------------------------

Цитата Archido ()
В добавок, чтобы небыло сильных лагов (подвисаний) когда ты делаешь "кобмайн", можно размазать этот процесс во времени, т.е. делать одну такую операцию на кадр. Добавляешь например, объекты, которые нужно объединить, в очередь и раз в кадр извлекаешь оттуда объект, "комбинируешь" и так пока очередь не опустеет.

А мне кажется в очереди не получится комбайнить... Хотя даже не знаю. Например есть у нас 2000 кубов. Их нужно скомбинировать в 1 . За 1 кадр максимум можно комбинировать 100. И что дальше? Разом mesh.combineMeshes (CombineInstance) ? Или в первый кадр mesh.combineMeshes(первые 100) , второй кадр mesh.combineMeshes (то что уже скомбайнено + ещё 100 ?) . А идея кстати хорошая smile Те у кого мало фпс при игре, здания не будут конечно быстро комбинироваться, но за то и лагов не будет .А те у кого 300 фпс будет очень красиво, быстро и гладко. smile

Добавлено (28.10.2013, 00:06)
---------------------------------------------
А как узнать когда прошел кадр то ?

Добавлено (28.10.2013, 00:10)
---------------------------------------------

Код
IEnumerator Example() {
         yield return new WaitForSeconds(Time.deltaTime);
}


Так что ли ? Выполнять буду в короутайнах. Дельта тайм вроде выдаёт время за которое прошла обработка одного кадра. Вот его и получаем и ждём. Правильно делаю?
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг