2 / 1 / 0
Регистрация: 31.05.2021
Сообщений: 48
|
||||||
1 | ||||||
Оптимизация движения большого количества объектов24.03.2023, 00:09. Показов 3100. Ответов 52
Я занимаюсь разработкой игры, в которую хочу добавить что-то по типу конвейеров, которые в моей игре являются трубами. На данный момент я занимаюсь кодом который реализует передвижение ресурсов по трубам. И здесь я столкнулся с проблемой, которую уже долгое время не могу решить и это проблема оптимизации и производительности этих самых объектов. Меня не сильно волнует рендеринг объектов так как в будущем я планирую всё это перенести в DrawMeshes. Но даже так я понятия не имею как оптимизировать поиск пути и движения этих объектов на данный момент максимум сколько я могу двигать одновременно объектов это 5000 ресурсов для 60+ фпс, который скачет от 60 до 100. Я хочу услышать что-то кроме "кешируй объекты, не используй Linq, не используй .Find" и тд. вещи потому что это даёт прирост спору нет. Но у меня уже руки опускаются потому что не знаю что делать, я считаю что выжал все фпс из своего кода настолько, насколько мог сам.
Буду очень благодарен за вашу помощь, спрашивайте, если нужна какая-то дополнительная информация, свой код я прикрепил ниже. Вот мой код на данный момент:
0
|
24.03.2023, 00:09 | |
Ответы с готовыми решениями:
52
Оптимизация обработки большого количества объектов Оптимизация хранения большого количества объектов в Dictionary Оптимизация большого количества if else Оптимизация большого количества NPC на карте Оптимизация большого количества пользовательских элементов управления |
2 / 1 / 0
Регистрация: 31.05.2021
Сообщений: 48
|
|
28.03.2023, 02:47 [ТС] | 41 |
Я так понимаю ты имеешь в виду заменить bool на int? Просто в любом случае массив для хранения нужен или я что-то недопонимаю?
Или ты имеешь в виду что индекс значит то в какую ты сторону должен идти? Просто я уже особо не помню почему так но если я делал 1 массив для всех сторон, то-есть в этом случае возьмём 1 индекс, то оно работало не правильно, из за этого я сделал двумерный, в этом случае 4 индекса по индексу для каждой стороны. Завтра проверю, возможно я протупил сильно. Да и в общем то это не самая большая проблема из всех причин низкой производительности. Словарь использую потому что так как массив не подходит из за того что нету границы в количестве ресурсов, остаётся лист и словарь. Я подумал словарь будет удобнее, хотя не думаю что есть особая разница, Искал в интернете вроде бы словари быстрее чем листы. Могу также завтра проверить что будет быстрее.
0
|
2 / 1 / 0
Регистрация: 31.05.2021
Сообщений: 48
|
||||||
28.03.2023, 21:09 [ТС] | 42 | |||||
1max1
Касательно индекса, я так и не смог нормально его добавить, то-есть самую обычную функцию он исполняет, но если что-то меняется то он уже не работает и например сейчас я не могу решить проблему с тем что если например 1 ресурс пошёл вправо, значит следующий должен идти влево (даже при том что направление левого пути направлено вправо) , но слева уже занята труба ресурсом который как раз таки шёл вправо, поэтому они стоят на месте блокирую друг друга. Я знаю как это обойти но, мне хочется придумать более хороший способ, а не убогий иф размером в 3 строки.
Проверил что быстрее, особой разницы нету. Они примерно одинаковы, с учётом того что лист сильнее нагружает при большем количестве вызовов. Код теста:
0
|
2638 / 1566 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
29.03.2023, 06:33 | 44 |
Irohh, если вы планируете запускать тысячи объектов в трубах, то разве есть надобность дополнительно указывать направление для объекта в местах разветвления труб? Даже если объекты будут рандомно поворачивать в любую сторону на разветвлениях, то при потоке в тысячи объектов всё равно не будет заметно что там ещё что-то регулируется, ведь это будет практически сплошной поток, в котором и отдельный объект будет сложно разглядеть.
Либо я не совсем понимаю идею. Вообще мне кажется в приоритете игры должен быть интерес геймплея, а не кол-во объектов. Вряд ли игрок будет в восторге, увидев миллион бегающих шариков, но при этом не понимающий что с ними делать и зачем вообще нужна вся эта вселенная движений. Вот эта тема уже так разрослась, но лично я так и не понял до сих пор - что представляет из себя игра. Вроде бы конвейеры не самые главные в ней, но почему-то только о них и речь. Плюс выясняется что объект не должен поворачивать в трубу, которая уже занята ресурсом.. А куда деваться, если объектов будет тысячи, труб на каждый не хватит.
0
|
2 / 1 / 0
Регистрация: 31.05.2021
Сообщений: 48
|
|
31.03.2023, 20:26 [ТС] | 45 |
samana, извиняюсь что долго не отвечал. Был занят изменением как раз поиском пути и у меня даже получилось улучшить алгоритм поиска пути, я немного ещё изменял его так что думаю производительность немного просела но в общем на скриншоте что я прикрепил видно что скорость поиска пути выросла в раз 7-8 и я не сказал бы что сильно, но доволен результатом (такие большие мс потому что я запускал поиск 100 тысяч раз).
По поводу этого скажу что это сделано что бы можно было игроку надо поровну распределить все ресурсы на любое количество ответвлений в каких-то целях.
Изначально это был просто пробный проект, где я пытался сделать клон такой игры как Vectorio но со временем как-то всё начало разрастаться и это превратилось более в убогий и дешёвый клон таких игр как Factorio и Mindustry. Все 3 игры перечисленные игры мне очень нравятся и я хотел сделать что-то похожее на них. Я не думаю что моя игра вообще когда выйдет, так как сейчас у меня каникулы я собирался доделать всё связанное с трубами, но у меня осталось 2 дня до их конца, а трубы готовы на 50-60%. Представляйте мою игру как бесплатный клон Factorio который не смог.
Ну по идеи, сначала ресурс добывается --> во что-то превращается (руда --> слиток) --> то что получилось идёт или в хранилище или перерабатывается ещё в что-то (всё что находится в хранилище можно продавать и полученные деньги использовать для постройки или прокачки чего-то). Но на данный момент у меня настолько всё сырое, потому что я всё время что добавляю потому убираю и переделываю. Честно говоря я даже не представляю что может из этого получится. Мне нужно времени и много, я просто буду стараться доделать это что бы хотя бы получить приятные слова от друзей.
0
|
2638 / 1566 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
31.03.2023, 21:19 | 46 |
0
|
0 / 0 / 0
Регистрация: 01.02.2019
Сообщений: 3
|
|
15.04.2023, 10:40 | 47 |
Вам необходимо использовать DOTS Entities, для ваших целей он подойдёт идеально. Используя эту архитектуру, можно двигать сотни тысяч объектов в сцене одновременно. В факторио скорее всего он используется, и в Vampire Survivors, например, тоже. Придётся много вещей изучить, но в программировании всегда так. Сложнее всего будет переключиться на логику Entities, так как реализация очень сильно отличается от обычного процедурного программирования и ООП. Жаль что юнити так и не доделали до конца свою реализацию Entities, но то что есть худо бедно работает.
0
|
2 / 1 / 0
Регистрация: 31.05.2021
Сообщений: 48
|
|
15.04.2023, 18:44 [ТС] | 48 |
Mopnex777, если я правильно понимаю это помогает в случае с объектами на сцене. Но сейчас я полностью отказался от таких объектов и у меня есть только 1 объект менеджер который хранит в себе словарь ресурсов и массив матриц их положений, после рисуя их через DrawMeshInstanced. В таком случае есть ли смысл от ECS?
0
|
0 / 0 / 0
Регистрация: 01.02.2019
Сообщений: 3
|
|
17.04.2023, 13:58 | 50 |
Сам я касался этой темы поверхностно, но под задачу двигать тысячи объектов одновременно, ECS отлично подходит. Правда с ходу перейти на эту архитектуру будет непросто, необходимо будет немного перестроить своё мышление, а для того, чтобы оно всё адекватно работало, необходимо будет использовать только определенные типы и специальные оптимизации.
0
|
0 / 0 / 0
Регистрация: 01.02.2019
Сообщений: 3
|
|
21.04.2023, 22:56 | 51 |
Если ещё актуально, случайно наткнулся на такое видео:
0
|
2638 / 1566 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
22.04.2023, 13:21 | 52 |
Mopnex777,
1
|
2 / 1 / 0
Регистрация: 31.05.2021
Сообщений: 48
|
|
30.04.2023, 02:47 [ТС] | 53 |
1max1, в любом случае не особо до конца понимаю откуда мне взять дополнительную производительность в спомощью ecs. Разве строение кода увеличивает скорость его исполнения? Возможно я ошибаюсь в своих мыслях по этому поводу.
Mopnex777, я уже давно не смотрел на тот код и как помню там всё уже было довольно сильно сжато и упрощено. Когда будет время поищу хорошие примеры работы ecs, так как на данный момент видел 2-3 маленьких примера и демку юнити. Мне кажется единственный способ который может мне помочь это банальное развитие как программиста до более высокого уровня с большими знаниями, когда я буду понимать то что происходит в том видео эмеральда как минимум. Спасибо за помощь!
0
|
30.04.2023, 02:47 | |
30.04.2023, 02:47 | |
Помогаю со студенческими работами здесь
53
Отрисовка большого количества объектов Оптимизация вывода большого (более 7000) количества записей на странице Проверка столкновения большого количества объектов Создание большого количества GUI-объектов Вывод большого количества объектов в OpenGL Обработка большого количества объектов на листе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |