Студия BlackVR постоянно работает с улучшением графики. Сегодня мы пишем про идеальный игровой мир и приводим несколько примеров из наших проектов для Леруа Мерлен и ЗАО Новатор (компания, для который мы создали игру по процессу изготовления печатных плат).
Идеальный игровой мир, о котором даже мечтать не приходится — это симуляция на уровне фундаментальных физических взаимодействий для субатомных частиц. Но вычислительные мощности для этого требуются такие, какие человечеству и не снились. Поэтому на практике мы используем упрощения и иллюзии, концентрируясь на самом главном мы отметаем 99.(9)% вычислений. Но даже они, доведенные до абсолюта требуют больших мощностей.
На практике, идеальный игровой мир — это
Модель каждого объекта уникальна и супер HD
Каждый объект или его части имеют свой материал с супертекстурами
Каждый источник света работает в реальном времени
Максимально большое разрешение текселей под тени
Максимально большое число отражений света
Максимальная дальность прорисовки
И еще много чего максимально большого
Такая попытка реализации убивает производительность и ставит намертво даже топовые системы при достаточно больших (они могут быть даже небольшими для человека) размерах мира.
Поэтому на протяжении всего существования компьютерных игр разработчики упрощали максимально все, что можно упростить, оставляя только самое-самое главное. Максимально переиспользовали имеющиеся ресурсы.
Мы используем стандартные решения на данный момент:1. Ограничиваем подробность геометрии моделей
2. Ограничиваем количество материалов на объектах
3. Запекаем максимально возможное число источников света
Здорово было бы использовать occlusion culling, но, к сожалению, она неудовлетворительно работает в проекте Леруа, равно как и в проекте Новатора (там ее просто убрали в итоге, потому что она выключала источники света самопроизвольно). Сама по себе операция эта дорогая и чем более точно работает, тем больше ресурсов ест. В итоге можно получить нужную обрезку объектов отрисовки, но не получить никакого или отрицательный прироста производительности.
Запечка света - тоже палка о двух концах. С одной стороны, она разгружает систему в реальном времени. Но есть ограничения по размерам объектов, на которых запекается свет. Кроме того, чем более подробные тени, тем больше места занимают сохраненные тени. В проекте Леруа при среднем качестве теней запеченный свет весил около 600МБ. Кроме того, эта операция очень ресурсоемкая при нормальных настройках. Это очень сильно тормозит процесс разработки.
Процесс разработки является циклическим. Изменения -> компиляция/иные автоматические процедуры вроде запекания света -> cимуляция -> оценка -> изменения. В случае с запеканием света получаем остановку процесса на минуты (хороший случай, хотя для небольших и простых сцен это секунды), десятки минут, в худшем случае часы или даже больше. Если сравнить с компиляцией кода при нормальной организации процесса (это секунды), разница огромная.
Мы постоянно создаем тестовый проект, в которых в свободное от проектов время пытаемся улучшить графику и производительность, а затем применять полученные эксперименты на практике для наших клиентов.