Продолжение исследования FarCry v.1.2 и о Shader 2.b


СОДЕРЖАНИЕ

  1. Введение, особенности видеокарт
  2. Конфигурации стендов
  3. Результаты тестов
  4. Выводы


Продолжаем изучать FarCry 1.2. Вначале, по традиции, мы приведем список статей, касающихся главных героев нашего повествования:

Теоретико-аналитические материалы и обзоры видеокарт, в которых рассматриваются функциональные особенности GPU ATI RADEON X800 (R420) и NVIDIA GeForce 6800 (NV40)

Кратко представим тех, кто принимает участие в состязаниях:

Платы



ATI RADEON X800 XT (Gigabyte) NVIDIA GeForce 6800 Ultra (Leadtek)


Напомню, то обе карты имеют по 256 мегабайт памяти GDDR3 со временем выборки 1.6ns, при этом у NV40 частота по памяти — 550 (1100) МГц, а у R420 — 575 (1150) МГц. Частоты работы чипов: NV40 — 400 и 450 МГц, R420 — 525 МГц. Оба GPU содержат по 16 пиксельных и 6 вершинных конвейеров. NV40 поддерживает еще версию шейдеров 3.0, а R420 — собственную технология сжатия карт нормалей — 3Dc. Вот кратко и все.

Установка и драйверы

Конфигурации тестовых стендов:

  • Компьютер на базе Athlon 64 3200+:
    • процессор AMD Athlon 64 3200+ (L2=1024K);
    • системная плата ASUS K8V SE Deluxe на чипсете VIA K8T800;
    • оперативная память 1 GB DDR SDRAM PC3200;
    • жесткий диск Seagate Barracuda 7200.7 80GB SATA.
  • операционная система Windows XP SP1; DirectX 9.0b;
  • мониторы ViewSonic P810 (21") и Mitsubishi Diamond Pro 2070sb (21").
  • драйверы ATI версии 6.458 (CATALYST 4.7beta); NVIDIA версии 61.45..

VSync отключен

Результаты тестов

Результаты тестов

В качестве инструментария мы использовали:

  • FarCry 1.2 (Crytek/UbiSoft), DirectX 9.0, мультитекстурирование, (запуск игры с опцией -DEVMODE), настройки тестирования все Very High.

Я замечу, что в комплект патча входят и заранее записанные демо-скрипты, которые можно воспроизводить или через консоль, или при помощи командной строки. Вот пример BAT-файла:

echo Running Research…
Bin32\FarCry.exe -DEVMODE "#demo_num_runs=1" "#demo_quit=1" "map research" "demo research" "r_sm30path 1"
echo Running Regulator…
Bin32\FarCry.exe -DEVMODE "#demo_num_runs=1" "#demo_quit=1" "map regulator" "demo regulator" "r_sm30path 1"
echo Running Training…
Bin32\FarCry.exe -DEVMODE "#demo_num_runs=1" "#demo_quit=1" "map training" "demo training" "r_sm30path 1"
echo Running Volcano…
Bin32\FarCry.exe -DEVMODE "#demo_num_runs=1" "#demo_quit=1" "map volcano" "demo volcano" "r_sm30path 1"

Можно с помощью переменных #r_Width=1600 и #r_Height=1200 добавлять в командную строку задание разрешения. Очевидно, что использование или неиспользование шейдеров 3.0 регулируется переменной r_sm30path. Присвоение ей значения «1» включает SM 3.0, «0» — выключает, возвращая рендеринг к использованию максимум 2.0.

Disclaimer: Большая часть этой статьи была написана до выхода окончательной версии патча. Ближе к концу статьи можно найти дополнительную информацию об изменениях произошедших между версией изначально нами полученной и версией, вышедшей официально.

После появления первой части статьи появилось множество отзывов. Среди них были как восторженные так и скептические. Первые ожидали увидеть FarCry, выполняющийся в новом режиме рендеринга (так называемом sm30path) на всех видеокартах, поддерживающих пиксельные шейдеры второй версии. Вторые же говорили о полной невозможности этого. Сейчас я, уже в течение недели экспериментируя с различными модификациями FarCry 1.2, работающими на видеокартах поддерживающих шейдеры только второй версии, могу сказать что отчасти правы были и те и другие.

Не откладывая в долгий ящик, я подтверждаю что у нас на руках есть версия FarCry 1.2, выполняющаяся в так называемом режиме «sm30path» (точнее только в его части соответствующей пиксельным шейдерам) на видеокартах поддерживающих пиксельные шейдеры 2.x и выдающая в итоге изображение, идентичное получаемому на NV40. Далее такие шейдеры мы часто будем называть «длинными».

Необходимо отметить что дублирование геометрии (GeometryInstancing) в случае наших тестов практически не влияет на конечный результат. Это не значит что данная функция бесполезна, но она будет максимально проявлять себя в случае когда «узким» местом при рендеринге является центральный процессор не успевающий задать множество избыточных параметров для отображения сцены. Такого при стандартном тестировании FarCry на NV40 не происходит, отчасти из-за того, что FarCry изначально был оптимизирован под существующие видеокарты. В дальнейшем ситуация может изменится. Например, разработчики на видеокартах, поддерживающих дублирование геометрии (GeometryInstancing), смогут на открытых пространствах рисовать реальную геометрию растительности на больших расстояниях от игрока, не заменяя ее спрайтами (imposters).

Технические детали

Еще при подготовке первой части статьи было выяснено, что теоретически в режиме sm30path вместо шейдеров третьей версии можно ограничиться использованием шейдеров второй версии. Поэтому были предприняты попытки заставить FarCry использовать режим рендеринга, рассчитанный на «длинные» шейдеры третьей версии на видеокартах, поддерживающих только шейдеры 2.x.

Итоговый пошаговый список проделанной работы выглядит примерно так:

  1. FarCry был «обманут» и стал использовать режим рендеринга, аналогичный выполняемому на NV40,
  2. при рендеринге вместо шейдеров третьей версии стали использоваться эквивалентные шейдеры второй версии,
  3. была проверена идентичность получаемых изображений.

Первый этап решается относительно просто: при помощи уже упомянутой в предыдущей части материала утилиты 3DAnalize была подменена комбинация VendorID/DeviceID, идентифицирующая производителя и конкретный продукт, а также были выставлены флаги что текущая видеокарта поддерживает шейдеры третьей версии. В результате таких действий FarCry запущенный на системе с любой видеокартой начинает воспринимать ее как NV40 и позволяет использовать рендеринг нескольких источников света в один проход с помощью «длинных» шейдеров.

Второй этап — подмену шейдеров третьей версии, на аналогичные шейдеры второй версии — нам удалось провести отчасти используя сам движок FarCry в качестве помошника. Дело в том, что FarCry может сам перекомпилировать свои шейдеры, написанные на HLSL/Cg, и выполняет он это, используя внешний компилятор от Microsoft: fxc.exe. Поэтому для достижения нашей цели этот компилятор был заменен другой программой, выполняющей все действия, требуемые от оригинального компилятора, а заодно вносящей необходимые коррективы в шейдеры и собирающей по ним статистику.

Из-за ограниченного времени на обработку и проверку данных приведенные ниже результаты основаны на данных 4 уровней, использованных в демках, предоставленных NVIDIA вместе с патчем FarCry 1.2, а также на результатах прогона самих этих демок: Research, Regulator, Training и Volcano.

Сначала приведу общую статистику. Всего для рендеринга четырех вышеуказанных уровней FarCry подготавливает около 3500 пиксельных шейдеров и 3500 вершинных шейдеров всех доступных версий: от 1.1 до 3.0. Львиную долю шейдеров составляют пермутации шейдеров 3.0 для множества различных значений исходных параметров. Все вершинные шейдеры 3.0 без проблем компилируются в шейдеры 2.0. При компиляции пиксельных шейдеров 3.0 как шейдеров 2.0 мы получаем: 1700 шейдеров 2.0 и 1900 шейдеров 2.x (использовался профайл ps_2_b для чипов ATI R420, но безусловно все эти шейдеры могут быть скомпилированы с профайлом ps_2_a). Самый большой из скомпилированных шейдеров состоит из 123 инструкций: 9 текстурных и 114 арифметических. Видно что более половины шейдеров предъявляют требования превышающие базовую версию 2.0. Но компиляция шейдеров, не означает их обязательного использования в реальной игровой ситуации. Например, при прогоне демок NVIDIA используется по одному шейдеру версии 2.x на уровнях Regulator и Training. И ни одного шейдера 2.x на уровнях Research и Volcano. При этом количество шейдеров базовой версии версии 2.0, используемых в каждой из этих демкок колеблется в районе 70 штук.

Итак, мы плавно пришли к третьей части нашего исследования: сравнения идентичности получаемых изображений. Это часть оказалась самой сложной, т.к. после первоначального выполнения упомянутых выше двух пунктов оказалось что скриншоты, получаемые при использовании «длинных» шейдеров часто не совпадают с полученными при использовании шейдеров третьей версии. Причем нельзя было сказать что они неправильные — просто несколько другие.

Причина оказалась в использовании разработчиками FarCry одной из особенностей модели шейдеров третьей версии — 10 интерполяционных регистров, хранящих данные с плавающей точкой, и использующиеся при передаче результатов выполнения вершинного шейдера в пиксельный. Спецификациями шейдеров 1.x-2.х оговорено наличие только 8 таких регистров стандартной точности. Два оставшихся регистра используются для передачи цветов, их точность лишь должна быть не менее 8 бит на цветовой канал (стандартный 32 битный цвет), и еще более важный момент: при передачи из вершинного шейдера в пиксельный значения этих «цветовых» регистров обрезаются в диапазоне [0..1]. Т.е. любое значение, записанное в вершинном шейдере и превышающее 1 или меньшее 0 неизбежно будет искажено при передаче в пиксельный шейдер. Важно здесь отметить, что это требование спецификации DirectX, так что даже если видеокарта, поддерживающая пиксельные шейдеры версии 2.x может интерполировать более 8 регистров с высокой точностью она обязана эмулировать вышеописанное поведение.

Выше я указал, что разработчики использовали особенность шейдеров — наличие 10 интерполяционных регистров, — но в реальности они используют только 9 регистров из 10 и то только при рендеринге освещения от четырех источников света в один проход (четыре источника — это максимальное количество, поддерживаемое движком FarCry в данный момент). Это выглядит несколько искусственным ограничением и при желании поддержки шейдеров второй версии разработчики FarCry могли просто ограничить однопроходный рендеринг 3 источниками света для данного класса видеокарт. Но так как у нас не было ни возможности ни желания править код самой игры пришлось искать обходные пути.

Таких путей по крайней мере три, ниже они несколько упрощенно описаны.

  1. При рендеринге менее 4 источников света использовать 8 доступных регистров высокой точности, а при 4 источниках света один из регистров оставлять «цветовым». Это самый простой и не добавляющий никаких накладных расходов. В итоге именно этот вариант был нами использован. Хотя существует вероятность что в каких-то местах в игре изображение при использовании таких шейдеров будет отличаться: мы таких мест не нашли.
  2. после окончательного расчета значений регистров в вершинном шейдере выполнять их нормализацию, перед передачей в пиксельный шейдер. Такой способ сработает, т.к. в любом случае в пиксельном шейдере эти регистры снова нормализуются.
  3. Ни один из интерполяционных регистров стандартной точности не использует в FarCry сразу все 4 компоненты регистра (x,y,z,w). Часть регистров использует вообще только две компоненты x и y, часть только три. Поэтому данные вместо «недостающих» регистров при использовании «длинных» шейдеров второй версии могут быть упакованы в свободные компоненты доступных регистров.

Использую комбинацию методов (1) и (3) можно получить «длинные» шейдеры второй версии 100% идентичные шейдерам, изначально использовавшимся в FarCry для демонстрации возможностей NV40.

Результаты

Итак, мы подошли к той части материала, которую вряд ли пропустит большинство читателей.

Посмотрим, что дает использование «длинных» шейдеров для ATI Radeon X800 XT. При тестировании использовались те же установки, что и при исследовании различных путей рендеринга на GeForce 6800 Ultra.



Очевидно, что Radeon X800 XT при использовании «длинных» шейдеров получает аналогичные приросты что и GeForce 6800 Ultra: опять мы видим прирост более чем в 20% на демке Research, приличный прирост на демке Volcano и малые приросты на демках Training и Regulator.

Сравним результаты обеих карт на одной диаграмме.



Что же — вполне закономерные результаты: тотально лидерство NV40 на подготовленных NVIDIA демках исчезло; в части из них Radeon снова вырывается вперед.

Изменения в официальном релизе патча 1.2

21 июля была наконец-то была выпущена официальная версия патча 1.2. Я могу только радоваться факту, что все заключения сделанные еще в первой части статьи подтвердились, а также тому, что мне не придется сильно жаловаться на разработчиков FarCry об их чисто маркетинговом поведении. Но об этом ниже в заключении.

Итак, почитатели ATI могут радоваться: FarCry 1.2 поддерживает как специальный путь рендеринга для шейдеров 2.0b, так и текстуры, сжатые при помощи 3Dc.

Специальный метод рендеринга для ATI R420 активируется, по аналогии с NVIDIA двумя ключами: либо «r_sm2bPath», либо «r_noPs2b». Для этого либо в консоле нужно ввести «\r_sm2bPath 1», либо в командной строке задать параметр «"r_sm2bPath 1"» (кавычки обязательны). Причем при включении r_sm2bPath, по аналогии с NV40, на R420 в будущих драйверах будет активироваться «дублирование геометрии». Разработчики FarCry, по всей видимости, пошли по пути наименьшего сопротивления и при включении метода использующего шейдеры 2.x ограничили число используемых источников освещения 3 штуками за проход. Что я и предлагал выше :-). В этом случае максимальное количество используемых интерполяционных регистров равно их максимально доступному количеству — 8 штукам.

В оперативном режиме нами были сняты результаты с использованием нового патча. К сожалению система, на которой снимались результаты уже была изменена по сравнению с предыдущими измерениями. В частности не был установлен ServicePack2 (но он для включения sm2bPath и не нужен). Поэтому сравнивать результаты с точностью до одного кадра не получится. Тем не менее результаты налицо:



Заключение

К моменту написания этого заключения разработчики FarCry выходом официального релиза патча 1.2 собственноручно подтвердили весь вышеизложенный материал.

Итак, еще раз повторю главные тезисы:

  1. Особенности шейдеров третьей версии в текущей реализации FarCry используются только в самом минимальном объеме.
  2. Пиксельные шейдеры 2.х легко могут быть использованы вместо шейдеров 3.0 для реализации нового «ускоренного» метода рендеринга.
  3. Возможна реализация «ускоренного» метода рендеринга даже для карт, поддерживающих только базовую версию шейдеров 2.0. Это подтверждается хотя бы тем, что максимальный прирост от «ускоренного» рендеринга получился в демках, которые не используют шейдеры версии большей чем базовая версия 2.0.

Так что разработчикам еще есть куда оптимизировать рендеринг для огромного количества существующих видеокарт, поддерживающих только пиксельные шейдеры 2.0. С другой стороны разработчики движутся к внедрению HDR (high dynamic range) рендеринга, который приведет к дальнейшему увеличению длины пиксельных шейдеров. И что для Crytek более приоритетно мы вероятно узнаем с выходом следующего патча.




Дополнительно

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.