S
S
sergof2016-01-18 16:04:59
Unity
sergof, 2016-01-18 16:04:59

Is it possible to make a Unity 3D project that runs from the command line, gets dynamic content, renders, saves a JPG, and exits?

Добрый день, коллеги!
Год назад я имел один забавный проект - для он-лайн конфигуратора мебели (это не я, это другой наделал, на пхп) требовался рендерер с претензией на фотореалистичность. Полная последовательность выглядит следующим образом:
0. Некий сферический посетитель на фронтенде собирает себе, например, шкаф. Стенки, дверки, ручки, дрючки, материалы. По окончании планировки получает кнопку "Смотреть в тридэ"; после того как он жмет на эту кнопку отправляется JSON со шкафом в мою цепочку:
1. скрипт на стороне кофигуратора ищет готовую картинку соответствующую hash-у JSON-а, если находит то оправляет ее туда назад где кнопку нажали и на этом все кончается, а если не находит то перекидывает этот JSON дальше на
2. хост с VS где его ловит самодельный HTTP-сервер и смотрит нет-ли у него в кеше готового изображения (соответствующего hash-у JSON-а), если есть то отправляет картинку тому первому, а если не находит то парсит шкаф (JSON) и составлят лист питоновских инструкций для Blender 3D
3. запускает Blender 3D и дает ему этот лист инструкций; Blender рендерит, сохраняет изображение на диск, завершается
4. хост видит что Blender 3D кончился и теперь есть картинка в кеше (на диске); берет картинку и посылает тому который первый
5. первый получает картинку от рендер-хоста, сохраняет себе в кеш, и отдает ее фронтенду (который в пункте 0)
6. фронтенд имеет теперь себе каринку (с претензией на реалистичность) и показывает её посетителю (тот радуется)
Initially, the idea was that no more than 1 second should elapse between pressing the button and receiving the picture, which was implemented. But during the meal, the appetite came and the customer now wants a larger and more powerful image, which is why Blender, unfortunately, can no longer be done in 1 second. I've doubled the virtual server config to 8 cores to no avail. Fortunately, the customer has an anonymous adviser who knows for sure that this is easily done, but not with Blender, but through Unity3D. I don’t know how to use Unity3D (in general, I impulsively said that this was some kind of peace death, but the boss did not support me) and therefore I ask for advice from someone who is familiar with Unity3D:
Is this possible: a Unity project that starts with a ready-made scene (backdrop, light, camera), receives a cabinet as instructions (XML?), renders, saves, dies. It manages everything in 1 second with a claim to photorealism. I would like to know in principle yes / no, and if not difficult, then a little about the bottlenecks. Virtual Server: 8 virtual CPUs, 8 Virtual GBs, Virtual Ubuntu 14 LTS.
Thank you all, I will be glad if your advice will help me not to waste time in vain.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
DrSpritz, 2016-01-27
@sergof

В принципе это возможно. Используя unity можно собрать приложение, которое будет в себе содержать готовую сцену с выставленным освещением, окружением, камерами и подготовленной базой из составляющих компонентов мебели. Unity может собрать для Linux headless-приложение, которое можно будет запустить на сервере и в качестве параметров запуска передать конфигурацию мебели в виде пути к файлу JSON или XML, ну и какие-нибудь данные для сохранения результата работы, это может быть имя файла или путь к каталогу куда сохранять рендеры. Как только приложение инициализируется, оно автоматом начнет процесс сбора и рендеринга Вашей мебели и сохранит его результат на основании указанной при запуске информации. Также можно встроить callback, который по окончанию работы приложения дернет веб-сервер и скажет ему что рендер для такой-то моедли готов и лежит там-то.
"Узкие места"
1) У меня есть некоторые сомнения в том, что в таком сетапе Вы сможете получить фотореалистичную картинку за одну секунду, поскольку каждый запрос на рендер от юзера, будет порождать новый процесс на сервере, что требует времени, да и расходование памяти и вычислительных мощностей сервера будет нерациональным.
В качестве решения, я бы запускал это приложение в качестве "демона" и управлял бы этим процессом используя сокеты. В этом случае все будет работать в десятки раз быстрее, и экономичнее, да и к тому же такой вариант масштабируемый, поскольку Вы можете поднять пул таких "демонов" и организовать очередь, все это позволит еще экономичнее использовать ресурсы ваших железок. Также использование сокетов для управления процесса не ограничивает Вас рамками одного физического сервера и позволяет создать целую ферму из серверов для рендера "шкафчиков". Что-то я немного расфантазировался :)
2) Я не знаю как Ubuntu server будет рендерить, возможно необходимо будет установить какие-то дополнительные компоненты, так же я не знаю как будут использоваться ресурсы CPU для рендеринга, поскольку Unity это все таки real-time рендеринг и основная нагрузка ложится на видеоадаптер.
3) Зашивать базу в приложение тоже не очень хороший вариант, поскольку администрировать такую базу будет неудобно и каждое внесение в нее изменений будет требовать ребилд приложения и его обновление на сервере.
В качестве решения, я бы вынес все модели из приложения путем их экспорта в assetbundle и сложил бы их куда-нить, откуда приложение их бы подтягивало. Можно запилить для него backend, который позволит администратору контента удобно работать с наполнением базы, а так же будет выдавать модельки приложению. Это незначительно увеличит скорость рендера, поскольку при первом обращении модель будет сначала загружаться в приложение (ну и кэшироваться,) ну а при повторном обращении разумеется брать уже с кэша, что уменьшит время загрузки.
Проведите исследование, я думаю все должно работать =)
UPD
Я думаю что-то подобное можно сделать и на Blend4Web, возможно это будет работать даже быстрее, но каждый делает выбор исходя из личного опыта и знаний, лично я знаю Unity лучше чем Blend4Web, так что и делать бы я стал это на Unity.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question