Internals of NFS Carbon game rendering engine (ru)
Ода о кривых руках, или почему так тормозит NFS Carbon.
Покупка новой видеокарты всегда несёт с собой новые ожидания о красивых эффектах в играх, возросшему ФПСу, и всеобщую радость хозяина. К сожалению, в последнее время, новой видеокартой (процессором, памятью) мы выравниваем руки программистов игр. Это очень печально, особенно на фоне того, что разработчики и издатели с мировыми именами позволяют себе такую техническую некомпетентность, за счёт нашего кошелька.
Итак NFS Carbon. Супер бренд, ведущий издатель. У вас высокие ожидание к этому продукту? У меня тоже. Были. Если, вы читали мои предыдущие постинги, то знаете, что я увлекаюсь реверс ижинерингом рендеров популярных игр. Обычно я брал хорошую игру, и смотрел почему же так все хорошо. Когда я запустил демку нового NFS, меня стали сильно одолевать вопросы "почему все так плохо?" и "откуда такие тормоза?".
Итак, "чудо" програмистского исскуства NFS Carbon. Ингейм рендер (перва я гонка в демке): в кадре от 1000 до 3000 (!) DIPов. Это ужас. Среднее значение 2200-2300. Рисуется все мелкими объектами. Окна на домах отдельно каждое, и т.д. Огромные шейдеры. Огромноая универсальность. В шейдерах для машинок учитывается всё: какие-то туманы, microflakes для металлических поверхностей (я понимаю использовать их в "гараже", там машинку рассматриваешь. Зачем они в гонке, объясните?). Слава богу для машинок есть LOD шейдеров. Для статики нету. Всего переключений шейдеров на кадр 100-200, а вот текстур 1500-2000, а рендер стейтов (о ужас) 15000 и больше!
Ужасно рисуется небо. Каким-то ужасно сложным шейдером (инструкций в 70, кажется) смешивается 2 текстурки первыми DIP вызовами. Естественно занимает это все дело половину экрана. А потом, с чистой совестью, затёрли процентов 80 неба домиками. Какие молодцы. У вас крутая видяха, у которой пиксельные конвеера исчисляются десятками? Я вас поздравляю. Теперь есть чем её занять. :)
На нашем болиде realtime environment mapping, создание которого размазано по 6 кадрам (т.е. в 1 кадр игры рисуется 1 сторона кубемапы). Flatout 2 ясно показал, что честного и не надо вовсе. Я долго ездил в NFS'е на Gallardo туда сюда, пытаясь более точно определить схему обновления кубемапы. Вычислял эти честные отражения. Так и не вычислил. Единственное, где их более менее видно,то в кинематографических пролётах камеры на старте гонки. Хотя, так как машинки не отражаются (они в кубическую текстуру не рисуются), то и понту не много. А машинки не отражаются потому, что так как текстура всего одна (только для нашей машинки), то было бы заметно, что отражения в машинах компьютерных гонщиков (для них используется та же текстура) стало неправильное. В общем, моё мнение по этому вопросу - выкинуть реалтайм нафиг, и практически без потери качества поднять ФПС. Плюс ко всему, есть A16R16G16B16F текстура, в красный канал которой, на каждом кадре, записывается нормализированная глубина всей сцены. Используется она только время генераци кубической текстуры (как я так и не понял). Я было подумал про soft particles. Ан нет, фигушки. ABG каналы не используются. У вас на борту видеокарты много памяти? Так вот знайте, что играя в NFS Carbon почти 5 мегабайт (это в разрешении 1024х768) заняты пустотой.
GUI. Попробуете отгадать? Да, да, DrawPrimitiveUP. Весь GUI рисутеся DPUP'ами! Поэлементно. По буковке. 200-300 вызывов. У вас быстрый процессор? (даже с двумя ядрами?) Вот знайте, что играя в NFS Carbon он занимается простаиванием и пустой пересылкой вертексов в видеокарту. Очень полезная работа.
Motion blur. На самом деле это просто весовой Radial Blur. В основном проходе рендера пишем в альфа канал степень разблуривания конкретного пикселя. Ближние сильнее дальние слабее. На первый взгляд все просто. Смущает всего две вещи:
- Почему шейдер блура такой огромный (100 инструкций)?
- Почему в картинке, которая блурится нет машинок? Хотя может потому, что машинки обычно двигаются с сопоставимыми скоростями. Не предусмотрено одно: траффик часто двигается навстречу. Чёткий автомобиль, что едет по соседней полосе, на фоне размытой дороги смотрится аляповато.
Гараж и главное меню. Всегда очень "уважал" игры, которые начинают тормозить прямо с меню. Я "уважаю" NFS Carbon :). Она начинает тормозить с экрана, где пишут "Loading..." Но это не удивительно, ведь вы не знали, что на этом экранчике 1000 DPUP'ов :) В общем гараж это обычный уровень, на котором рисуется даже небо (кто его там увидит, тому пирожок). Все те же, никому не нужные, сложные шейдеры. Отдельный перл гаража - отражения на полу. Не видно? Присмотритесь внимательнее. Так вот, в это "очень заметное отражение" рисуется абсолютно вся геометрия гаража. С теми же ужасными огромными шейдерами. Все супер мелкие детальки автомобиля. Все полочки, детальки и рюшечки гаража. Я не знаю чем думают разработчики, когда тратят столько ресурсов на фишку, которой практически не видно (я нашел отражения, только после того как увидел, что туда что-то рисуется).
Краткий вывод почему все так плохо:
- Огромное количество вызовов рендера (драйвер тайм половина времени кадра)
- Использвангие DPUP.
- Сомнительные графические решения.
- Большущие убер-шейдеры (я в них не разбирался, но у меня стойкое чувство, что можно проще).
З.Ы. Тестировалась демо версия. Сильно сомневаюсь, что в релизе будет лучше. З.З.Ы. Предыдущие версии NFS'а не исследовал. Я не знаю как там, но, по крайней мере, не тормозят.