Ведущий программист 4А Games Олесь Шишковцов отрицает родство их движка с X-Ray.
Главные преграды для развития X-Ray - это неспособность к распараллеливанию, слабый и глючный сетевой код, ужасное управление ресурсами и памятью, что не позволяло сделать стриминг или малый набор рабочих данных, вмещающийся в память консолей. Другая проблема - текстовое скриптование на LUA, которое дает много рычагов управления, но заставляет дизайнеров быть почти программистами. Это было одной из причин задержки S.T.A.L.K.E.R. Я начал личный проект для формирования будущей архитектуры и изучения возможностей дизайна движка. Он был неплохо развит и хотя проект не был функционален как игра (не было даже демки, так как я тогда не имел движка рендеринга), он дал мне ясное виденье последующих действий.
Шишковцов и его колега Александр Максимчук покинули GSC за год до релиза S.T.A.L.K.E.R., когда движок 4А, основанный на приемлимой для ПК и консолей многопоточности, обрел форму. Шишковцов заявляет, что 4A engine не имеет ничего общего с X-Ray, потому что его портирование было бы очень сложным.
Простой порт не поместился бы в памяти даже без всех текстур, звуков и геометрии. А работал бы он на скорости 1-3 кадров в секунду. Но это ничего не значит, потому что без текстур и геометрии вы не увидите эти кадры! Я лично считаю, что GSC надо подождать следующее поколение консолей.
Шишковцов говорит, что философия распараллеливания отличается в разных играх. Например в Burnout Paradise от Criterion Games задачи распределяются в зависимости от числа доступных процессоров.
У нас нет выделенных потоков для выполнения специальных внутриигровых задач, кроме потока PhysX. Все потоки являются обычными работниками. Мы используем модель ориентированную на задачи (task-model), но без предварительных условий (pre-conditioning) или предварительной/пост синхронизации. Все потоки могут выполнятся паралельно без любых блокировок из точки их запуска. Нет взаимных зависимостей между задачами. Это выглядит как дерево задач, которое начинается с самых тяжелых узлов в начале кадра (для самобалансирования системы). Последний раз когда я измерял статистику, мы выполняли около 3000 задач в 30-миллисекундном кадре на Xbox 360 в нагружающих процессор сценах со 100-процентной загрузкой всех аппаратных потоков.
4A Games увидела, что подобно распараллеливанию у Criterion, такая реализация работает и на консоли от Sony.
PS3 не такая уж и другая... Мы используем 'нити' для 'эмуляции' шестипоточного процессора и каждая задача может начать работу на SPU и переключится на другую 'нить'. Это разгрузка PPU, которая незаметна системе. Финальный результат этой прекрасной (помимо некоторых ограничений) модели - идеальное линейное приспособление к возможностям железа.
Движок является кросс-платформенным, но Метро 2033 не выйдет на PlayStation 3, только на PC и Xbox 360. Хотя консоль от Sony повлияла на большую часть разработки ядра.
С самого начала мы выбрали самую 'сложную' платформу. Много решений было принято со знанием ограничений и заковырок, которые мы встретим в будущем. Для меня видеочип PS3 (они почему-то любят называть его RSX) был оптимальным выбором, потому что я был занят в ранних стадиях разработки NV40 и все казалось родным: RSX является прямым наследником этой архитектуры. Читая документы Sony это было как 'Ха! Они не понимают где потерялись эти циклы. Они кодировали sub-optimal code-path в GCM для этой штуки.' Все в таком роде...
Решение отбросить разработку на PS3 пришло от THQ и это дало позитивный результат для разработки, уменьшив число платформ до двух.
THQ не хотело рисковать с новым движком от новой студии, учитывая сложность программирования на этой платформе, особенно когда не было бизнесовой потребности в этом. Решение разрабатывать для ПК и консоли было умным. Это позволило сфокусироваться на качестве для обеих платформ. Кстати, мы никогда не запускали Метро 2033 на PS3, только разрабатывали архитектуру для него. В студии много консольных игроков, но немного консольных разработчиков и Microsoft сделала многое чтобы снизить барьер при помощи своих отличных инструментов, компиляторов и анализаторов. Наше решение разрабатывать для 'более сложной' платформы окупилось сразу. Целая игра была портирована на Xbox 360 в течение 19 рабочих дней. Хотя они не были восьмичасовыми...
Из-за малого объема памяти на консолях, также как и другим играм на Xbox 360, Метро 2033 приходится делать стриминг с DVD или жесткого диска.
При здаче консольной версии у нас было 1Гб сжатого OGG звука и почти 2Гб сжатых без потерь DXT текстур. Ясно, что они не влезут в память консоли. По пути стриминга данных с DVD мы дошли до того, что мы не загружали предварительно ничего, даже базовых звуков ходьбы или оружия. Мы проделали много работы для компенсации времени поиска на диске, чтобы игрок не замечал этого. Это было тяжело.
Все эти оптимизации дали преимущества и ПК-версии Метро 2033.
Нам не нужно столько же памяти как играм только для ПК. Любого ПК с 512Мб ОЗУ и поддержкой DX10/DX11 в Windows 7 будет достаточно. DirectX 9 дублирует в системной памяти почти все ресурсы GPU, поэтому вам придется добавить около 256Мб для избежания свопинга. Со стороны процессора есть проблемы. Поскольку система заточена под многопоточность, для ‘гладкой’ игры нужно как минимум два апаратных потока. Производительность процессора сильно не играет роли, кроме как в нескольких сценах за всю игру, если это конечно современная архитектура (не Intel Atom!) с более чем одним ядром.
ПК-версия обходит консольную по качеству графики. Метро 2033 имеет прекрасный объемный туман, удвоенную точность вычислений в PhysX, текстуры 2048х2048 (против 1024х1024 на консоли), улучшенную работу с картами теней, размытие объектов в DX10, подповерхностное рассеивание для отличных шейдеров кожи, Parallax Mapping для всех поверхностей и лучшую детализацию геометрии с менее аггресивным LOD. В DirectX 11 поддерживается тесселяция.
Я люблю три вещи в DirectX 11: вычислительные шейдеры, шейдеры тесселяции и разделение контекста draw/create. Главная вещь увеличивающая производительность – это вычислительные шейдеры. Сегодня в большинстве игр большая часть создания кадра тратится на постобработку. Легкий путь для добавления скорости – переписать эту постообработку через вычислительные шейдеры. Даже простое размытие может ускорится в два раза. Например, мы переписали код глубины резкости, что заметно улучшило качество при сохранении оптимального количества кадров в секунду. В Метро 2033 все ‘органические’ вещи типа людей тесселированы, а монстры используют реальный displacement mapping.
В свежей спецификации движка видно много похожих технологий, как в Killzone 2 от Guerrilla Games: много стандартных вещей для консольных шутеров. Их движок отлично работает на железе Sony, но Шишковцов имеет другую точку зрения.
Их исполнение кажется плохо оптимизированным. Иначе зачем они делали предварительно вычисленные карты освещения? Зачем они освещают динамические объекты иначе чем мир, при помощи подобных Light Probe вещей? Основываясь на моем опыте, вам нужно как минимум 150 полноценных источников света, чтобы закрытые пространства выглядели хорошо и натурально и намного больше, чтобы подсветить такие вещи как глаза, прочее. Похоже они упустили это из виду.
Метро 2033 использует большое количество источников освещения отрендеренных на конвейере отложенного затенения.
Игрок проводит более половины игры под землей. Это темные туннели и слабо освещенные комнаты. Нет других источников электричества кроме генераторов. Визуально это интересно, убедительно и захватывающе. Нам нужно много малых источников света. Отложенное затенение – это лучший выбор.
Оказывается обе HD консоли имеют сложности с убедительными тенями.
В этом нет ничего необычного. На Xbox 360 мы сначала рендерим традиционную глубину с точки зрения света, затем конвертируем в ESM (экспоненциальную карту теней) представление одновременно делая размытие по Гауссу. Далее во время освещения мы делаем одно билинейное обращение к таблице для получения процента затенения. В конечном итоге мы избавляемся от шумов и ошибок затенения или многих обращений к таблице при фильтровании тени, чтобы получить что-то издалека похожее на тень. Конечно 10Мб eDRAM на Xbox 360 ограничивает разрешение карт теней, что заметно при движении источника света… Мы используем эту память для shadow mapping только два раза в кадр.
4A Engine также включает собственные решения для сглаживания. Разработчики решили использовать часть GPU ответственную за MSAA для других задач, но уменьшение ступенчатости граней остается важным аспектом визуального качества.
Последние два года на Xbox 360 мы использовали deferred rotated grid super-sampling, но позже переключились на аналитическое сглаживание (ААА). Это дало нам около 10Мб памяти и уменьшили загрузку GPU сглаживанием с переменных 2.5-3.0 миллисекунды до постоянных 1.4мс. Качество довольно неплохое. ААА работает немного не так, как вы предполагаете. Он не имеет полного определения граней. Проще объяснить технику, как удвоение шейдером разрешения изображения используя определение участков/граней (подобно морфологическому АА) и обратное уменьшение к оригинальному размеру, получая сглаженную версию. Так как окно определения паттернов фиксировано и мало для реализации на GPU, качество значительно хуже для близких к горизонтальным и вертикальным линиям, чем например в MLAA.
Другим ключевым элементом технологии 4А является искусственный элемент персонажей.
Каждый ИИ персонаж имеет чувства: зрение, слух и реакцию на столкновения. Модель зрения близка к реальности: угол обзора 120 градусов, переднее зрение более развито, также берутся во внимание освещенность и скорость цели. Например, подвижный объект видим лучше статичного. Также есть возможность ‘вглядываться’. Есть несколько уровней настороженности: легкое беспокойство, легкая тревога, тревога, сильная тревога, опасность.
Звуковая модель для ИИ интригует. 4A Engine пытается эмулировать реальное восприятие слуха получая переменные из всего в дизайне игры…
Каждый звук имеет 'метку для ИИ'... Звуки стрельбы отмечены как 'combat.shot'. Для этой метки расстояние слышимости например 50 метров, что достаточно много. Но используя порталы/секторы рендера обработчик слуха определяет ‘виртуальное расстояние’ с учетом стен и коридоров. Так что персонаж никогда не услышит что-либо за стеной, потому что если ‘прямое’ расстояние всего пять метров, ‘виртуальное растояние’ при прохождении звука через стену составит 60 метров.
Реакция на столкновения и восприятие видимых объектов тоже обрабатывается. Если ИИ распознает гранату, он пытается сбежать.
Эта подсистема обрабатывает базовую информацию и решает что сейчас важно для персонажа. Разные уровни чувств объединены с разными типами поведения. Например, типичным поведением для ‘легкое беспокойство’ будет что-то типа ‘Кто здесь?’ и пристальный осмотр, что может вызвать состояние ‘сильная тревога’ и начало поиска. Конечно, дизайнеры имеют полный контроль над всем и они могут заставить персонажей ровно стоять или показывать смешные анимации даже если возле них упадет ядерная бомба и это подходит к текущей сцене.
4А отлично поработали над консольной версией, выжав все соки из железа и получив невиданную для этой платформы графику. Технология в сочетании с восточноевропейским стилем отличает эту игру от шаблона Unreal Engine.
GPU Xbox 360 – это иной зверь. Он в 5-10 раз слабее современного железа на ПК. Но аппаратная мощность это лишь одна сторона уравнения. Так как программисты могут оптимизировать задачу под специфический GPU, мы можем получить почти стопроцентное использование всех блоков. Это невозможно на ПК. В дополнение к грязным трюкам с MSAA, таким как использование некоторых поверхностей как multi-sampled (например hi-stencil masking the light-influencе делает это) или рендеринг multi-sampled shadowmaps и подальший семплинг корректных значений суб-пикселей, так как мы знаем какие паттерны и позиции имеют суб-пиксели, прочее. Большая часть Метро 2033 идет на частоте 40-50 кадров в секунду, если мы выключим vsync на 360. Большинство уровней имеют более 100Мб сэкономленного места. Мы немного перестарались в оптимизации.
Полное интервью Digital Foundry с Олесем Шишковцовым выйдет на этой неделе. Там будет: прямое сравнение процессора Xenon с Intel i7, информация о HDR-освещению, ИИ, PhysX и много другого.