Суббота, 16 Ноября 2024, 04:31

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Общение между процессами как создание multithreadинга
robertonoДата: Вторник, 06 Мая 2014, 23:38 | Сообщение # 1
Чокнутый Кот
Сейчас нет на сайте
Все вы знаете что в юнити нельзя использовать потоки.
У меня вот в голове давно крутиться идея, но всё не решаюсь попробовать. Мне нужно комбинировать меши во время игры. По измерениям, каждую пятую секунду я комбинирую меш, это занимает 70 милисекунд. Впринципе почти незаметно, но не очень приятно.
Лаг в игре происходит из за того что комбинирование выполняется на основном потоке игры. Т.е. нагружая основной поток мы ухудшаем производительность всей игры.
Идея:
Создать отдельный процесс (можно хоть консольное приложение через visual studio),
добавить туда UnityEngine.dll.
Когда нужно скомбинировать меш отправляем всё что надо в этот отдельный процесс, там комбинируем и потом посылаем обратно в игру.
Комбинирование то в отдельном процессе, значит на игру это не повлияет!
Вопрос: Реально вообще? Если у кого есть время лишнее, проверьте) Ведь идея то по сути интересная.
Storm54Дата: Среда, 07 Мая 2014, 06:17 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Не получишь ты функционала движка в отдельном приложении. По крайней мере я смог получить доступ лишь к независимым классам, например Vector3. Но дело даже не в этом. Юнити поддерживает многопоточность, просто все действия, влияющие на объекты, находящиеся на сцене, должны выполняться в основном потоке. Так что даже реализовав вычисления в отдельном процессе, тебе необходимо будет в основном потоке обработать все, что ты вычислил. Может стоит посмотреть в сторону корроутин? Я с помощью них реализовал плавную загрузку мира. Все довольно плавно.
robertonoДата: Среда, 07 Мая 2014, 08:16 | Сообщение # 3
Чокнутый Кот
Сейчас нет на сайте
Я и так использую курутины. Да, немного плавнее они делают, но не сильно. Лаг вызывает сама функция CombineMesh. Я когда то читал, что много поточность можно получить с помощью lock. Правда?
Storm54Дата: Среда, 07 Мая 2014, 09:21 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Ты хочешь сказать, что у тебя появляется лаг даже при комбинировании двух мешей? Каждый кадр по очереди все комбинировать. Будет плавно.
robertonoДата: Среда, 07 Мая 2014, 11:27 | Сообщение # 5
Чокнутый Кот
Сейчас нет на сайте
Я не знаю почему, но когда я комбинировал меньше мешей то задержка была больше
nwsxДата: Среда, 07 Мая 2014, 14:57 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
http://u3d.as/content/michiel-frankfort/loom-multi-threading-framework-v1-7/4fx

Добавлено (07.05.2014, 14:57)
---------------------------------------------
у тебя же там кубики одни были, динамик бачингом можно обойтись, если он работает (c deferred lighting вроде не особо работает)
https://docs.unity3d.com/Documentation/Manual/DrawCallBatching.html


Westboro
Dungeon Journey на Google Play


Сообщение отредактировал nwsx - Среда, 07 Мая 2014, 14:59
robertonoДата: Среда, 07 Мая 2014, 17:05 | Сообщение # 7
Чокнутый Кот
Сейчас нет на сайте
nwsx, На самом деле мультипоточность в юнити довольно спорная тема.
Loom - всего лишь облегчает работу с потоками. Но никак не позволяет мне пересчитать нормали или скомбинировать меши. А именно это у меня создает лаг. Толку от лума будет ноль.

nwsx, я использую какой то прозрачный материал и diffuse.
Да, батчинг действительно уменьшал количество драв колов, но никак не увеличивал фпс. Проверю сейчас ещё раз.

Добавлено (07.05.2014, 17:05)
---------------------------------------------
Отчет:
~6300 кубов, способы их оптимизации:
CombineMeshTest
Меши скомбинированы, 30 дравколов, 900 - 1100 фпс
Nothing
~ 6400 дравколов, 60 фпс
Dynamic Batching
30 дравколов, сохранено батчингом ~6400, 90 фпс

Железо:
8 gb ram, i5 3570 3.40ghz 4 core, geforce gtx770.

Вывод:
Комбинирование мешей убирает дравколы, поднимает фпс до 1000, но жертвует до 100 милисекунд для комбинирования
Ничего делает ничего, 60 фпс.
Батчинг не влияет на фпс, хорошо убирает дравколы (30).
Вывод - если я правильно им пользуюсь, батчинг штука безтолковая (хотя скорее всего просто не то что мне нужно)

Storm54Дата: Среда, 07 Мая 2014, 21:15 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Может стоит посмотреть в сторону воксельных движков? Уже есть десятки реализаций для юнити. И платных и бесплатных.
robertonoДата: Среда, 07 Мая 2014, 21:25 | Сообщение # 9
Чокнутый Кот
Сейчас нет на сайте
Storm54, По какому принципу они работают?
Storm54Дата: Среда, 07 Мая 2014, 21:28 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Честно говоря, я особо не интересовался, т.к. работаю в совершенно ином направлении. Однако, в сети полно примеров. Разобраться можно за вечер.
robertonoДата: Среда, 07 Мая 2014, 22:01 | Сообщение # 11
Чокнутый Кот
Сейчас нет на сайте
Storm54, чаще всего это просто сгенерированные меши, 16 на 16, с измененными высотами точек. Каждая точка идет через 1 метр, что создает им вид кубов.
Так как эти меши определенного размера, можно использовать чанковую систему, т.е. загрузку только тех мешей, которые реально увидеть.
А у меня помимо кубов есть ещё 3д модели, и мне нужно нормальное ими управление. Что бы я мог легко вытащить блоки из меша. Комбинирование тут как раз, но оно создает лаг.
Вот кстати какие у меня разрушения:

VIDEO
RangerДата: Четверг, 08 Мая 2014, 05:49 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
Цитата robertono ()
Все вы знаете что в юнити нельзя использовать потоки.

Это кто такое сказал?
тыц

По теме: я делал попиксельную генерацию текстур в реальном времени. Сначала хотел сделать это отдельными потоками. Но потом плюнул и сделал генерацию в куротинах. По моему мнению, сопрограммы ничем не уступают потокам(поправьте, если не так). В сопрограмме можно сделать отслеживание загрузки цп (например по ФПС) и подстраивать ее выполнение "на лету".

Цитата robertono ()
Комбинирование то в отдельном процессе, значит на игру это не повлияет!

Повлияет. Новый проц у тебя в компе из-за нового потока не вырастет.


robertonoДата: Четверг, 08 Мая 2014, 19:39 | Сообщение # 13
Чокнутый Кот
Сейчас нет на сайте
Цитата Ranger ()
Повлияет. Новый проц у тебя в компе из-за нового потока не вырастет.

потоки обычно не зависят от друг друга. Поэтому пока второй поток мучается с генерацией, основной поток спокойно рендерит и производит игру.
Цитата Ranger ()
В сопрограмме можно сделать отслеживание загрузки цп (например по ФПС) и подстраивать ее выполнение "на лету".

К сожалению я это применить не могу, у меня есть два способа : ПересчитатьНормали(), CombineMeshes().
Цитата Ranger ()
Это кто такое сказал?

в потоках нельзя использовать Unity API. А значит в потоке я не могу вызвать mesh.CombineMeshes().
Это и есть проблема этой темы.

Добавлено (08.05.2014, 17:06)
---------------------------------------------
эх, ладно, на днях если не будет чем заняться я попробую реализовать задуманное) Просто для теста, потом отпишусь, думаю интересно будет)

Добавлено (08.05.2014, 19:00)
---------------------------------------------
Потестил что больше всего даёт нагрузку. Оказывается 80 % времени комбинирования занимает создание меш коллайдера (добавление его как компонента).
Коробку как коллайдер использовать не могу, нужно что бы в здание можно было зайти.

Добавлено (08.05.2014, 19:39)
---------------------------------------------
Проблема решена! Вместо того что бы создавать меш коллайдер, у кубов которые я комбинирую я просто выключаю рендер (раньше я выключал gameobject куба). А перс ходит по коллайдерам невидимых кубов, когда видит скомбинированный меш)
50 - 100 милисекунд превратились в 10!
Всем спасибо за помощь.

Storm54Дата: Четверг, 08 Мая 2014, 21:39 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Если у тебя там все из кубов, то можно и свою систему коллизий написать.
robertonoДата: Четверг, 08 Мая 2014, 21:54 | Сообщение # 15
Чокнутый Кот
Сейчас нет на сайте
Storm54, не всё из кубов, говорил же. Я и так придумал отличное решение).
На кубах cube коллайдер, на 3д моделях несколько куб коллайдеров. Так что всё довольно шустренько. Можно даже ещё меньше сделать времени. Например массивы на другие потоки перекинуть. Ещё выключить очистку мусора оставленного юнити после совершенной оптимизации. В итоге сократив до 5 мс.
  • Страница 1 из 1
  • 1
Поиск:

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