Своя система батчинга для Unity.DOTS. Но зачем?
Итак, я работаю над прототипом.
Во время разработки конструктора (https://yandex.ru/games/app/418150) мне пришлось сменить API на DOTS, потому что физика MonoBehaviour'ов не позволяла симулировать большое количество деталей на сцене — даже при том, что коллайдер детали (несмотря на её геометрию) был простой коробкой.
Но так как проект изначально задумывался как WebGL на Яндексе, а Unity.Entities.Graphics не поддерживает WebGL, мне пришлось написать свою систему батчинга. Батчинг — это техника оптимизации, когда в видеопамять загружается геометрия объекта и информация о том, в каких местах её отрисовать. Тем самым, загрузив на видеокарту условную «травинку» и 1000 мест для отрисовки, мы отрисуем эту травинку 1000 раз за время, сравнимое с отрисовкой одного объекта. Это очень быстро.
До перехода на DOTS моя система была построена так: при создании или загрузке детали из модели каждая деталь просчитывала свой идентификатор исходя из входящих в неё частей и их расположения внутри детали. Если деталь не находила по своему ID меш в словаре, я генерировал новый; иначе — использовал уже готовый меш. Далее по идентификатору я складывал матрицы деталей в коллекции и отправлял их на батчинг.
Теперь же при создании или загрузке детали каждая её часть дублируется сущностью, которая хранит информацию о том, какой объект, какую его часть и с какой геометрией она должна отрисовывать. Эта сущность синхронизирует своё положение со своей целью, и все такие сущности передают свой идентификатор в систему отрисовки. Там происходит то же, что и раньше: раскладывание позиций и отрисовка (батчинг). Но теперь проект работает на физике DOTS. Вот видео со стресс-тестом: https://youtu.be/i5ZOln6Ctfs.
В целом, развивать конструктор дальше мне не хватает мотивации: переписать весь проект в четвёртый раз само по себе сложно. Кроме того, графики на Яндексе оставляют желать лучшего. Плюс моим интересом завладела идея расширить систему до анимации, что для конструктора не применимо. Поэтому конструктор был отложен, и в разработку взят небольшой прототип с видом сверху — про человечков. Подробнее о нём — в последующих постах.
Следите за обновлениями:
Telegram: https://t.me/ru_1ned
Twitch: https://www.twitch.tv/ru_1n
Следующий пост: