@sergof

Возможно-ли сделать проект Unity 3D который запускается из командной строки, получает динамический контент, рендерит, сохраняет JPG и завершается?

Добрый день, коллеги!

Год назад я имел один забавный проект - для он-лайн конфигуратора мебели (это не я, это другой наделал, на пхп) требовался рендерер с претензией на фотореалистичность. Полная последовательность выглядит следующим образом:

0. Некий сферический посетитель на фронтенде собирает себе, например, шкаф. Стенки, дверки, ручки, дрючки, материалы. По окончании планировки получает кнопку "Смотреть в тридэ"; после того как он жмет на эту кнопку отправляется JSON со шкафом в мою цепочку:

1. скрипт на стороне кофигуратора ищет готовую картинку соответствующую hash-у JSON-а, если находит то оправляет ее туда назад где кнопку нажали и на этом все кончается, а если не находит то перекидывает этот JSON дальше на

2. хост с VS где его ловит самодельный HTTP-сервер и смотрит нет-ли у него в кеше готового изображения (соответствующего hash-у JSON-а), если есть то отправляет картинку тому первому, а если не находит то парсит шкаф (JSON) и составлят лист питоновских инструкций для Blender 3D

3. запускает Blender 3D и дает ему этот лист инструкций; Blender рендерит, сохраняет изображение на диск, завершается

4. хост видит что Blender 3D кончился и теперь есть картинка в кеше (на диске); берет картинку и посылает тому который первый

5. первый получает картинку от рендер-хоста, сохраняет себе в кеш, и отдает ее фронтенду (который в пункте 0)

6. фронтенд имеет теперь себе каринку (с претензией на реалистичность) и показывает её посетителю (тот радуется)

Изначально идея состояла в том что между нажатием на кнопку и получением картинки должна пройти не более чем 1 секунда, что и было реализовано. Но во время еды пришел аппетит и заказчик теперь хочет изображение побольше да понажористей, отчего Блендер к сожалению уже не может за 1 секунду. Я удвоил конфигурацию виртуального сервера до 8 ядер, но толку почти нет. К счастью, у заказчика есть анонимный советчик который точно знает что это легко делается, но не Blender-ом а через Unity3D. Я не умею в Unity3D (вообще, я импульсивно высказался что это какой-то peace death, но шеф меня не поддержал) и поэтому прошу совета у того кто хорошо знаком с Unity3D:

возможно-ли такое: Unity-проект который запускается с готовой сценой (задник, свет, камера), получает шкаф как инструкции (XML?), рендерит, сохраняет, умирает. Успевает все за 1 секунду с претензией на фотореалистичность. Хотелось бы узнать принципиально да/нет и если не трудно, то немного об узких местах. Виртуальный сервер: 8 виртуальных CPU, 8 Виртуальных GB, Виртуальная Ubuntu 14 LTS.

Спасибо всем, буду рад если ваши советы помогут мне не потерять время зазря.
  • Вопрос задан
  • 566 просмотров
Решения вопроса 1
@DrSpritz
В принципе это возможно. Используя unity можно собрать приложение, которое будет в себе содержать готовую сцену с выставленным освещением, окружением, камерами и подготовленной базой из составляющих компонентов мебели. Unity может собрать для Linux headless-приложение, которое можно будет запустить на сервере и в качестве параметров запуска передать конфигурацию мебели в виде пути к файлу JSON или XML, ну и какие-нибудь данные для сохранения результата работы, это может быть имя файла или путь к каталогу куда сохранять рендеры. Как только приложение инициализируется, оно автоматом начнет процесс сбора и рендеринга Вашей мебели и сохранит его результат на основании указанной при запуске информации. Также можно встроить callback, который по окончанию работы приложения дернет веб-сервер и скажет ему что рендер для такой-то моедли готов и лежит там-то.

"Узкие места"

1) У меня есть некоторые сомнения в том, что в таком сетапе Вы сможете получить фотореалистичную картинку за одну секунду, поскольку каждый запрос на рендер от юзера, будет порождать новый процесс на сервере, что требует времени, да и расходование памяти и вычислительных мощностей сервера будет нерациональным.
В качестве решения, я бы запускал это приложение в качестве "демона" и управлял бы этим процессом используя сокеты. В этом случае все будет работать в десятки раз быстрее, и экономичнее, да и к тому же такой вариант масштабируемый, поскольку Вы можете поднять пул таких "демонов" и организовать очередь, все это позволит еще экономичнее использовать ресурсы ваших железок. Также использование сокетов для управления процесса не ограничивает Вас рамками одного физического сервера и позволяет создать целую ферму из серверов для рендера "шкафчиков". Что-то я немного расфантазировался :)

2) Я не знаю как Ubuntu server будет рендерить, возможно необходимо будет установить какие-то дополнительные компоненты, так же я не знаю как будут использоваться ресурсы CPU для рендеринга, поскольку Unity это все таки real-time рендеринг и основная нагрузка ложится на видеоадаптер.
В качестве решения, я точно могу сказать что такой вариант будет работать на обычной десктопной машине с вменяемым видеоадапетром

3) Зашивать базу в приложение тоже не очень хороший вариант, поскольку администрировать такую базу будет неудобно и каждое внесение в нее изменений будет требовать ребилд приложения и его обновление на сервере.
В качестве решения, я бы вынес все модели из приложения путем их экспорта в assetbundle и сложил бы их куда-нить, откуда приложение их бы подтягивало. Можно запилить для него backend, который позволит администратору контента удобно работать с наполнением базы, а так же будет выдавать модельки приложению. Это незначительно увеличит скорость рендера, поскольку при первом обращении модель будет сначала загружаться в приложение (ну и кэшироваться,) ну а при повторном обращении разумеется брать уже с кэша, что уменьшит время загрузки.

Проведите исследование, я думаю все должно работать =)

UPD

Я думаю что-то подобное можно сделать и на Blend4Web, возможно это будет работать даже быстрее, но каждый делает выбор исходя из личного опыта и знаний, лично я знаю Unity лучше чем Blend4Web, так что и делать бы я стал это на Unity.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы