Ода о кривых руках, или почему так тормозит NFS Carbon

статья с gamedev.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) заняты пустотой.

Интерфейс. Попробуете отгадать? Да, да, DrawPrimitiveUP. Весь GUI рисутеся DPUP'ами! Поэлементно. По буковке. 200-300 вызывов. У вас быстрый процессор? (даже с двумя ядрами?) Вот знайте, что играя в NFS Carbon он занимается простаиванием и пустой пересылкой вертексов в видеокарту(как в первохалфе-DTF). Очень полезная работа.

Motion blur. На самом деле это просто весовой Radial Blur. В основном проходе рендера пишем в альфа канал степень разблуривания конкретного пикселя. Ближние сильнее дальние слабее. На первый взгляд всё просто. Смущает всего две вещи:

1. Почему шейдер блура такой огромный (100 инструкций)?

2. Почему в картинке, которая блурится, нет машинок? Хотя может потому, что машинки обычно двигаются с сопоставимыми скоростями. Не предусмотрено одно: траффик часто двигается навстречу. Чёткий автомобиль, что едет по соседней полосе, на фоне размытой дороги смотрится аляповато.

Гараж и главное меню. Всегда очень "уважал" игры, которые начинают тормозить прямо с меню. Я "уважаю" NFS Carbon :). Она начинает тормозить с экрана, где пишут "Loading..." Но это не удивительно, ведь вы не знали, что на этом экранчике 1000 DPUP'ов :) В общем, гараж - это обычный уровень, на котором рисуется даже небо (кто его там увидит, тому пирожок). Все те же, никому не нужные, сложные шейдеры. Отдельный перл гаража - отражения на полу. Не видно? Присмотритесь внимательнее. Так вот, в это "очень заметное отражение" рисуется абсолютно вся геометрия гаража. С теми же ужасными огромными шейдерами. Все супер мелкие детальки автомобиля. Все полочки, детальки и рюшечки интерьера помещения. Я не знаю чем думают разработчики, когда тратят столько ресурсов на фишку, которой практически не видно (я нашел отражения, только после того как увидел, что туда что-то рисуется).

Краткий вывод почему все так плохо:

  • Огромное количество вызовов рендера (драйвер тайм половина времени кадра)
  • Использвангие DPUP.
  • Сомнительные графические решения.
  • Большущие убер-шейдеры (я в них не разбирался, но у меня стойкое чувство, что можно проще).

З.Ы. Тестировалась демо версия. Сильно сомневаюсь, что в релизе будет лучше.

З.З.Ы. Предыдущие версии NFS'а не исследовал. Я не знаю как там, но, по крайней мере, не тормозят.

627627 показов
142142 открытия
10 комментариев

шел 2024, они еще играют в карбон

Ответить

Так карбон это зумерское
Олды играют в порш анлишд

Ответить

И героев 3

Ответить

Очень актуально

Ответить

скажи честно
ты говноед?

Ответить

Шейдеры купили у индусов, видимо.

Ответить

Восхитительная духота. Продолжай.

Ответить