что такое directx в играх
Что такое DirectX?
Немного о DirectX
Пока в природе не существовало DirectX, большинство игровых программ для персональных компьютеров работали под управлением Ms Dos.
Чтобы запустить такие игры, пользователям приходилось бороться, в прямом смысле этого слова, с конфигурационными файлами системы, такими, как AUTOEXEC.BAT, CONFIG.SYS, и с настройками драйверов типа EMM386.EXE и т.д. лишь ради того, чтобы получить несколько дополнительных свободных байт из доступных 640Кб базовой памяти, даже если на компьютере установлено 16Мб оперативной памяти.
Жизнь разработчиков программного обеспечения была не сахар, потому что для преодоления ограничения в 640Кб приходилось использовать различные драйверы для каждой разновидности видеоадаптеров и звуковых карт.
С выходом в свет технологии компании Microsoft DirectX для Windows 95 все указанные выше проблемы становятся историей.
Теперь разработчики могут использовать аппаратно независимый интерфейс программирования, с помощью которого создаются новые игры, для участия в которых пользователю достаточно лишь вставить в устройство чтения компакт-диск с данными и наслаждаться игрой. Теперь писать игры и играть в них стало гораздо приятнее.
Но разработка игр с использованием DirectX остается все еще непростой задачей. Иногда все еще достаточно трудно найти грамотную документацию, и начинающие разработчики тратят много времени на поиск знаний о том, как использовать такие новшества, как DirectDraw, Z-буферы или DirectSound, а также многие другие сложные, но полезные инструменты.
Цель этой статьи — помочь разработчикам, использующим DirectX, несколькими советами, основанными на моем собственном опыте написания программ. Обычные пользователи смогут получить из этого обзора общее представление о том, что такое DirectX.
DirectX представляет собой набор из нескольких API (application programming interface — интерфейс программирования приложений), позволяющих разработчикам игр и других интерактивных приложений получать доступ к специфическим функциям аппаратного обеспечения без необходимости написания аппаратнозависимого программного кода. DirectX основан на наборе интерфейсов COM или классов. COM расшифровывается, как Component Object Model (Компонентная Модель Объектов), и представляет собой спецификацию интерфейса, в котором функции вызываются через указатели. Таким образом, объекты COM могут описываться такими языками программирования, как C/C++, Delphi или даже Basic. Все примеры, ссылка на которые была выше, написаны на C++, т.к. я пользуюсь именно этим языком. Интерфейс COM используется не только в DirectX, но и на уровне операционной системы в качестве модели объектов и является сердцем одной из самой широко применяемой технологии — OLE (Objects Linking and Embedding — связывание и встраивание объектов).
DirectX 5.0 SDK (Software Development Kit — Набор разработчика программ), доступен для загрузки с сайта Microsoft.
Справочник по DirectX для начинающих
Если Вы не являетесь разработчиком игровых программ, но Вам нравиться играть на персональном компьютере, Вы точно должны были слышать о DirectX. Почему?
Потому что DirectX широко используется в современном поколении компьютерных игр. Каждая игрушка, имеющая логотип «for Windows 95«, прежде, чем запуститься на Вашем компьютере, требует наличия установленного в системе DirectX. Вот почему DirectX это не просто «нечто для программистов», это принципиально необходимое нечто для игроков.
В тоже время если какая-то из таких современных игр установленна на Вашем компьютере, значит, DirectX тоже установлен, и Вы можете узнать об этом, обратив внимание на несколько новых файлов, которые появились в директории WindowsSystem, например DDRAW.DLL или DPLAY.DLL. Это компоненты DirectX, которые используются всеми играми, установленными в Вашей системе и работающими через интерфейс DirectX.
DirectX используется для обработки событий, которые должны совершаться в каждой игре, таких, как вывод изображения на экран или считывание входных данных с клавиатуры, мыши или джойстика.
Такие карты имеются в продаже, но многие игры не используют аппаратные возможности специализированных плат, потому что создатели игры должны написать соответствующий драйвер, а иногда бывает проблематично переписать заново целые фрагменты кода для того, чтобы использовать преимущества аппаратной обработки 3D. Компонент Direct3D, впервые включенный во вторую версию DirectX, обеспечивает стандарт на использование видеоадаптеров, обеспечивающих аппаратную 3D-акселлерацию, и его применение, несомненно, заставит трехмерные игрушки работать быстрее.
DirectX поддерживает VGA и SVGA видеорежимы при 64К цветов (Hi-color) без дополнительных затрат ресурсов. С каждым днем производительность видеоадаптеров возрастает, следовательно, DirectX игры будут выглядеть все более реалистично и привлекательно.
DirectX – что это такое, как оно работает, где скачать
Стал часто сталкивался со всевозможными заблуждениями на тему DirectX. Например, пользователи пытаются ставить DirectX каких-то неправдоподобных версий, скачивают непонятно что с каких-то “левых” сайтов и т.п., получая в итоге всевозможные ошибки в работе Windows и игр.
Со всем этим я и разберусь в этой заметке, постаравшись расставить все точки над i в деле об игровой технологии DirectX.
Что такое DirectX
Чтобы разобраться, где правда, а где вымысел, для начала узнаем, что же это такое – ДиректИкс? Википедия говорит нам:
DirectX (от англ. direct — прямой, непосредственный) — это набор API, разработанных для решения задач, связанных с программированием под Microsoft Windows. Наиболее широко используется при написании компьютерных игр. … Зачастую обновленные версии DirectX поставляются вместе с игровыми приложениями.
Более простыми словами: DirectX – это “прослойка” между видеокартой и играми, позволяющая полностью реализовать всю вычислительную мощь компьютера для отрисовки красивой графики.
Помню, как в 2003 году я радовался правдоподобным отражениям в стеклах машин и лужах на дороге в игре Need for Speed: Underground, когда установил в компьютер видеокарту с поддержкой DirectX 9. Конечно, одними отражениями дело не ограничивается, но обо всем по порядку.
Чем отличаются версии DirectX
Технологии прогрессируют довольно быстро. Каждая новая версия DirectX позволяет программистам добавить какой-нибудь новый эффект в игру, а старые – оптимизировать.
Думаю, наиболее наглядно разницу между возможностями DirectX разных версий покажет это видео:
Обратите внимание на красивые эффекты летящего снега из-под колес машины и мягкие тени в DirectX 11 версии (слева). Справа – гораздо более старая девятая. В принципе, такие эффекты, как мягкие тени и снег из-под колес можно реализовать, ограничившись технологией DirectX 9, но падение производительности будет ощутимым – в “девятке” нет ни оптимизации, ни грамотной реализации подобных эффектов.
Второй пример – игра Crysis 2:
Считается, что чем выше версия DirectX – тем лучше картинка. Но не стоит ожидать чуда – зачастую изменения не бросаются в глаза. На мой взгляд, главная причина столь малой разницы качества изображения в том, что сейчас игры разрабатываются одновременно для игровых консолей Xbox, Sony PlayStation и ПК. Приставки по сравнению с современными “персоналками” слабы в плане производительности и поддерживаемых технологий. В итоге мы играем на компьютере в игры, графика которых осталась на уровне года выхода консолей, любуясь на размытые текстуры и упрощенные эффекты. Да, есть игры, разработанные или доработанные для ПК, но таких единицы.
Типичный пример межплатформенности – игра Skyrim:
Разница в графике между Playstation 3 и Xbox360 заключается в деталях: на PS3 где-то воды капает мало, на Xbox 360 тени не реагируют на мерцающие источники света. На ПК (в видео обозначен как “Windows”) таких проблем нет, плюс видны объекты на дальних расстояниях, но больше никаких улучшений нет. Позже разработчики выпустили набор текстур высокой четкости для ПК-версии игры, но кардинально графику это не улучшило.
Чтобы вы увидели, какую графику способен выдавать компьютер – пример игры, заточенной под использование всех возможностей видеокарты и процессора:
Видите разницу? Красивое освещение, четкие текстуры, плавные движения. Такой уровень детализации был бы недостижим с помощью устаревших технологий DirectX 9 – слишком много объектов находятся в кадре одновременно. Также присутствует много эффектов, которые реализуются силами видеокарт с поддержкой DirectX 10 как минимум.
Возможности графического движка игры Crysis 3:
Вопреки мнению некоторых пользователей, DirectX не улучшает графику в играх, а только дает возможность программисту сделать игру красивее. Если игра разрабатывалась для DirectX 9, то наличие DirectX 10-й версии ничего не изменит. Все зависит не только от возможностей видеокарты, но и от поддержки технологий игрой. Если все совместить – получится просто чудесная игра в плане графики.
Разные Windows и версии DirectX
DirectX по сути представляет собой набор файлов – программных библиотек. Если их не будет в системных папках, то игры в лучшем случае будут отображаться без эффектов, в худшем – не запустятся, выдавая ошибку (при запуске игры появляется ошибка “не найден d3dx9_42.dll”, где цифры могут быть разными).
Минимальный набор этих файлов уже присутствует в только что установленной Windows. В зависимости от версии операционной системы, будет разный комплект файлов, а значит – поддержка разных версий DirectX (информация отсюда):
Предыдущие версии включены. Т.е. Windows 10 имеет поддержку 12-й версии, DirectX 11.2, 11.1, 11, 10.1, 10, 9 и ниже.
О том, как установить полный набор файлов DirectX, будет ниже по тексту.
Поддержка видеокартой DirectX разных версий
Чем новее видеокарта, тем более высокую версию DirectX она поддерживает. Все предыдущие версии также будут поддерживаться. То есть старые игры, использующие ДиректХ 7/8/9 теоретически должны работать нормально. На практике ограничением становится поддержка операционной системы. Игры, разработанные для Windows 95/98/ME зачастую вылетают на более новых ОС, видеокарта тут совершенно не при чём.
При этом нужно понимать, что от Windows тоже зависит, какой DX будет работать. Игры, которым требуется 12-й Директ, не запустятся в Win7/8 и тем более XP. Сама видеокарта работать в древних системах будет, просто современные API функции будут недоступны. Таким образом, с видеокартой, поддерживающей DirectX 12, в Windows XP вы не поиграете в современные игры – запустятся только работающие через девятый DirectX и ниже.
Как узнать, какую версию DirectX поддерживает моя видеокарта и Windows?
Видеокарта
Подсмотреть информацию о том, какую версию DirectX поддерживает ваша видеокарта, можно на официальной страничке сайта производителя и в любом онлайн-магазине. Например, в Яндекс.Маркете. Однако, в целом, все видеокарты, вышедшие после 2015 года, поддерживают 12-ю версию. Хотя именно с DX12 есть нюансы, об этом ниже.
Windows
Узнать, какую версию поддерживает Windows, сложнее, потому что многое зависит от установленных обновлений. Если у вас Windows 10, то там точно самая свежая версия API. Для всех остальных ОС алгоритм таков:
1. Убедитесь, что у вас установлены все обновления Windows (Пуск – Все программы – Центр обновления Windows – Поиск обновлений – Установить).
2. Необязательный пункт: обновите драйвер видеокарты до самой новой версии:
Официальная страница драйверов для видеокарт Intel (выберите в списке “Графические адаптеры”, затем нужную модель)
3. Нажмите Пуск – Выполнить (если нет такого пункта, можно нажать сочетание клавиш Win+R, где Win – кнопка с логотипом) – Введите “dxdiag” без кавычек – затем кнопка ОК.
Появится окно “Средство Диагностики DirectX“. На вкладке “Система” можно увидеть установленную на компьютере версию DirectX:
Эту версию сменить нельзя, за исключением обновления системы – например, при обновлении Windows Vista SP1 на SP2 поддерживаемая версия изменится с 10.1 на 11.
В интернете полно всяких наборов “DirectX 10 для Windows XP” и аналогичных. Запомните – это обман. В Windows XP невозможно включить поддержку современных версий DirectX.
Как заставить игру X использовать DirectX версии Y?
Только если в настройках игры версию можно переключить. Например, смену поддерживает GTA V. В ней доступно аж три варианта рендера DirectX: 10, 10.1 и 11.
Другим способом переключить версию, если игрой это не предусмотрено, никак нельзя. Сами подумайте – разработчики писали код игры, используя команды под определённую версию. Просто так взять и заменить команды на другие невозможно.
Таким образом вопрос “на каком DirectX лучше играть” бессмысленный – что поддерживает железо, ОС и использует игра, то и будет.
Нужно ли устанавливать DirectX с сайта Microsoft? Что это дает?
Кратко: можно, только версию DirectX это не изменит!
Если хотите, чтобы игры запускались нормально – обязательно установите все обновления из Центра обновления Windows, потому что именно оттуда Windows берет свежие версии библиотек. Подтверждение от Microsoft.
На сайте компании Майкрософт, которая разработала DirectX, можно скачать инсталлятор DirectX. На самом деле это не установщик DirectX, а только программа-инсталлятор, которая загрузит из интернета и установит новые версии программных библиотек DirectX. Несмотря на цифры 9, 10, 10.1 и т.п., DirectX имеет и внутреннюю нумерацию, которая имеет отношение к обновлениям. То есть внутри версий возможны исправления и улучшения.
Windows 7, 8 и 10 эти библиотеки, в общем-то, не нужны, потому что требуемые обновления приходят через Центр обновлений. Но если у вас не запускается какая-то старая (2005-2010 годов) игра, использующая DirectX 9, пробуйте установить тот самый инсталлятор. Авось поможет.
Чтобы проверить, что устанавливается инсталлятором, я скачал программу автономной установки DirectX, которая нужна для установки обновлений DirectX на компьютерах без интернета:
DirectX – загрузка полного комплекта обновлений
Судя по датам, на момент написания этой записи обновления компонентов DirectX выходили 18 апреля 2011 года (обновление от 29.01.2016 г.: теперь все приходит через Центр обновлений другими пакетами).
Загруженная программа – по сути самораспаковывающий архив. Откроем его архиватором 7-zip:
После установки добавятся новые библиотеки и обновятся старые, что даст возможность запуститься тем играм, которые сообщают об ошибке отсутствия d3dx*. Так что попробовать установить можно.
Откуда скачать DirectX?
Просто установите обновления через Центр обновления!
Ни с каких сайтов скачивать ДиректИкс нельзя! Вы рискуете попасть на вирусы!
Компоненты DirectX обновляются через Центр обновления Windows. Только так вы можете получить поддержку DirectX 10.1 и 11 на Windows Vista, 11.1 на Windows 7.
Microsoft DirectX входит в качестве составной части в операционных системах Windows. Вы можете обновить DirectX, применив последний пакет обновления или другие обновления через Центр обновления Windows.
Если скачать и установить DirectX на Windows XP, появится ли там DirectX 11?
Не появится. DirectX 10, 11 и последующих версий на Windows XP не будет никогда. Можно долго распространяться на эту тему, я лишь скажу следующее: владельцы Windows XP, смиритесь – эта ОС давно уже перестала быть “игровой”. Многие современные игры не поддерживают Windows XP. Даже Майкрософт официально забила на нее.
Стоит заметить, что существует сборка DirectX 10 для Windows XP, сделанная умельцами. По сути это всего лишь набор программных библиотек, не добавляющих эффекты DirectX 10, а только позволяющая некоторым играм запускаться без ошибок в XP, если в их настройках включен режим “DirectX 10”. В любом случае, этот набор библиотек с высокой долей вероятности может вызвать глюки в операционной системе, так что ставить такое поделие ни в коем случае нельзя.
Как установить DirectX версии 11.1 на Windows 7?
В связи с появлением Windows 10 этот вопрос актуален как никогда. Там поддержка DirectX 11.1 уже есть изначально. В Windows 7 изначально установлена версия 11. Поддержка новой версии DirectX придет через Центр Обновления Windows (Пуск – Все программы – Центр обновления Windows). Обновление называется KB2670838.
Так что обновляйте Windows через Центр Обновления. Windows 8 это тоже касается.
DirectX 12
Много слухов циркулирует вокруг DirectX 12. Попробую расставить все точки над i.
Windows 7, 8 и DirectX 12
Нет. Нет и ещё раз нет! DirectX 12 в Windows 7 и 8 не будет. Теоретически это возможно сделать, если производители видеокарт и Microsoft скооперируются. На практике – увы. 12-я версия – прерогатива Win10.
Многие старые видеокарты частично поддерживают DirectX 12
Представители производителя видеокарт AMD и nVidia заявляли, что видеокарты, поддерживающие DirectX 11, будут поддерживать и DirectX 12. Это оказалось маркетинговым лукавством. Преимущество DirectX 12 перед 11 – многократное увеличение производительности за счет оптимизации работы с компонентами видеокарты (памятью, видеопроцессором). “Железная” часть видеокарт, выпущенных в эпоху DirectX 11 и ранее, не приспособлена под DirectX 12, поэтому основная “фишка” новой версии API – ускорение обсчета графики – работать не будет.
То есть современные игры, которым для работы требуется 12-я версия графического API, с такими видеокартами запустятся. Но качество графики придётся выкрутить на минимум, чтобы получить более-менее приличную частоту кадров.
Есть три уровня поддержки старыми видеокартами нового графического API: Tier 1, Tier 2 и Tier 3. Tier 3 – самая полная поддержка стандарта. И она, пожалуй, наиболее близка к тому, что представляет собой DX12. В современные игры с ними на минимальных настройках графики можно играть вполне комфортно.
Intel
Intel ValleyView2 HD Graphics
Intel HD Graphics 2500
Intel HD Graphics 4000
AMD Radeon HD 5xxx
AMD Radeon HD 6xxx
AMD Radeon HD серий 7xxxG, M и D
AMD Radeon HD 8xxxG
Nvidia
Вроде как все должны.
Intel
Intel HD Graphics 4400
Intel HD Graphics 4600
Intel HD Graphics 5000
Intel Iris Graphics 5100
Intel Iris Pro Graphics 5200
nVidia
NVIDIA GeForce GT 430
NVIDIA GeForce GT 440
NVIDIA GeForce GTS 450
NVIDIA GeForce GTX 460
NVIDIA GeForce GT 520M
NVIDIA GeForce GT 520
NVIDIA GeForce GT 525M
NVIDIA GeForce GT 540M
NVIDIA GeForce GTX 550 Ti
NVIDIA GeForce GTX 560
NVIDIA GeForce GTX 560 Ti
NVIDIA GeForce GTX 570
NVIDIA GeForce GTX 580
NVIDIA GeForce 610M
NVIDIA GeForce GT 610
NVIDIA GeForce GT 620M
NVIDIA GeForce GT 620
NVIDIA GeForce GT 630M
NVIDIA GeForce GT 630
NVIDIA GeForce GT 635M
NVIDIA GeForce GT 640M
NVIDIA GeForce GT 640
NVIDIA GeForce GT 730
Intel – нет.
AMD – нет.
Nvidia
NVIDIA GeForce GT 650M
NVIDIA GeForce GTX 650
NVIDIA GeForce GTX 650 Ti
NVIDIA GeForce GTX 650 Ti Boost
NVIDIA GeForce GTX 660M
NVIDIA GeForce GTX 660
NVIDIA GeForce GTX 660 Ti
NVIDIA GeForce GTX 670
NVIDIA GeForce GTX 680
NVIDIA GeForce GT 740M
NVIDIA GeForce GT 750M
NVIDIA GeForce GTX 750
NVIDIA GeForce GTX 750 Ti
NVIDIA GeForce GTX 760
NVIDIA GeForce GTX 765M
NVIDIA GeForce GTX 770
NVIDIA GeForce GTX 780
NVIDIA GeForce GTX 780 Ti
NVIDIA GeForce 840M
NVIDIA GeForce GTX 850M
NVIDIA GeForce GTX 860M
NVIDIA GeForce GTX 970
NVIDIA GeForce GTX 980
Intel – нет.
AMD Radeon HD 7750
AMD Radeon HD 7770
AMD Radeon HD 7850
AMD Radeon HD 7870
AMD Radeon HD 7950
AMD Radeon HD 7970
AMD Radeon R4 Graphics
AMD Radeon HD 8600
AMD Radeon HD 8800
AMD Radeon R9 390X
Nvidia
А вот у нВидии видеокарт с полной поддержкой DirectX 12 пока нет.
Обновление от 3.03.2018: уже есть. Все современные поддерживают 12-ю версию.
Обратите внимание – после 2015 года поддержка 12-й версии API улучшилась, сейчас об уровнях Tier знать не требуется.
Дополнительные уровни – Feature levels
Мне, как владельцу AMD Radeon HD7950, хотелось бы радоваться, что у неё точно-точно есть поддержка DX12, но не получается. Дело в том, что Microsoft пошла дальше и ввела дополнительные уровни особенностей (“Feature levels”). Если уровни Tier – индикатор для покупателей, то Feature levels предназначены для разработчиков и сообщают о том, какие же возможности новой версии API поддерживаются процессором видеокарты полноценно.
Feature level 11.0 – поддержка видеокартой DirectX11 и функции “Resource Binding” из Tier 1. Представители таких видеокарт: Nvidia GeForce GTX 400/500/600/700.
Feature level 11.1 – DirectX 11.1 и поддержка множества функций, которые я здесь приводить не буду (зачем?). Представители:
Feature level 12.0 – поддержка некоторых возможностей Tier 1 и Tier 2. Представители: AMD Radeon HD 7790/8770, Rx 260/285/290 и новее.
Feature level 12.1 – полная поддержка Tier 1, аппаратная поддержка всех возможностей DirectX 12.
Таким образом, ни одна из видеокарт, вышедших до 2015 года, не поддерживает DirectX 12 полностью. Часть возможностей реализована на программном уровне, поэтому одна и та же игра, использующая DX 11 и DX 12, не получит ощутимого прироста производительности при переходе на новую версию API.
От уровня доступа к “железу” компьютера сильно зависит скорость работы программ. Особенно это касается игр. DX 12 предоставляет возможности, которыми разработчики не должны пренебрегать. Увы, на практике они не всегда используются полностью. Поэтому GTA V, вышедшая на ПК в 2015 году, выглядит лучше и выдаёт на том же железе больше кадров в секунду, чем схожая геймплеем Watch Dogs 2, появившаяся на свет полтора года спустя.
DirectX 11 против DirectX 12: практическая польза от новой версии графического API
Оглавление
Немного теории
Для начала повторим вкратце основы о DirectX 12 из всего того, что мы рассказывали вам в своих многочисленных обзорах. Графические API обновляются довольно редко, и до сих пор большинство игр использует еще Direct3D 11 (D3D11 для краткости), которому уже больше 10 лет. Но все чаще игровые разработчики начинают использовать Direct3D 12 и Vulkan, которые появились после активного продвижения собственного API Mantle компанией AMD. Указанные API используют схожий подход по улучшению эффективности использования графических процессоров, но являются универсальными для всех современных GPU. В рамках сегодняшнего обзора мы не будем рассматривать Vulkan, но в целом этот API очень схож с D3D12 в своей основе.
Увы, при всех преимуществах новой версии DirectX, темп освоения новых возможностей разработчиками не так высок, как бы всем хотелось. До сих пор чаще всего используется DirectX 11 в виде основного API, и лишь при поддержке производителей GPU (в основном — AMD, по понятным причинам) они все же продавливаются в игры. Сначала поддержка Direct3D 12 во многих играх появлялась в экспериментальном виде, как проба пера, и частенько она не давала прироста производительности вообще, или он был крайне незначительный.
Если попытаться очень вкратце описать преимущества нового API, то главные его нововведения заключаются в асинхронных вычислениях, о которых мы поговорим ниже, и сниженной нагрузке на CPU из-за более быстрой подготовки вызовов функций отрисовки draw calls (команды, результатом которых является отрисовка полигональной сетки с соответствующими атрибутами). Каждый объект и персонаж в кадре требует исполнения нескольких таких функций отрисовки, и при большом их количестве в D3D11 довольно сильно загружается работой центральный процессор системы.
Кое-какую работу по оптимизации этой работы делает видеодрайвер (и у Nvidia он весьма эффективен, а вот D3D11-драйвер AMD справляется с оптимизацией похуже), но в любом случае, более быстрая подготовка вызовов draw calls в D3D12 может значительно снизить загрузку CPU и время простоя GPU, и в результате мы получим более высокую частоту кадров или возможность отрисовки большего количества геометрии при прочих равных. Многопоточная оптимизация для CPU в условиях D3D12 также работает куда более эффективно.
Так происходит потому, что прослойка API при управлении работой графического процессора в D3D12 стала значительно тоньше, и определенная работа была переложена с API на игровой движок, в том числе и менеджмент ресурсов. С одной стороны, это улучшает возможности по оптимизации производительности под конкретные запросы игры, с другой — увеличивает требования к знаниям и способностям игровых программистов. В случае D3D12 им приходится заниматься широким кругом задач, которыми они с D3D11 вообще не занимались. Учет особенностей разных графических архитектур и менеджмент ресурсов у всех получается по-разному, поэтому толк от D3D12 на практике есть не всегда.
Также в D3D12 были внедрены и некоторые дополнительные функции, о которых мы многократно рассказывали в своих материалах, посвященных новым графическим процессорам: консервативная растеризация, тайловые ресурсы, Raster Order Views, переменная частота затенения и другие. Пусть они кажутся не такими значимыми, как внедрение различных типов шейдеров в предыдущих версиях Direct3D, но они дают возможность или улучшить некоторые эффекты или реализовать совершенно новые. Большинство этих возможностей внедрены скорее для повышения эффективности рендеринга в уже существующих алгоритмах, но есть и кое-что новое и очень полезное, особенно для графических процессоров компании AMD.
Речь идет об асинхронных вычислениях. Современные графические процессоры состоят из большого количества различных исполнительных блоков, которые умеют исполнять разные программы, далеко не только графические. В частности, можно вспомнить давно известное аппаратное ускорение физических эффектов на GPU при помощи PhysX и различные фильтры постобработки, в том числе сложные алгоритмы имитации глобального освещения и затенения. Все это выполняется на GPU, и графические и неграфические вычисления вполне могут исполняться параллельно во многих случаях. Именно одновременное исполнение нескольких разных очередей инструкций и называется асинхронными вычислениями.
В качестве примера таких задач, которые можно исполнять параллельно, можно привести обновление карт теней или какие-то сложные алгоритмы постфильтрации — и чем сложнее математические вычисления в них, тем лучше. В последнее время к списку возможных нагрузок для асинхронных вычислений добавилась и часть работы при трассировке лучей, что также помогает повысить эффективность использования имеющихся у GPU ресурсов.
Если D3D11 предусматривает одну очередь инструкций только для графики, то новая версия API позволяет создать несколько отдельных очередей графических команд и других типов вычислений. Команды, исполняемые в разных очередях, могут быть зависимыми, и исполнение инструкций в одной из них может быть остановлено до получения результата из соседней, но они все равно исполняются вместе. Именно такой подход позволяет повысить эффективность использования имеющихся исполнительных блоков, что особенно полезно для графических процессоров AMD архитектуры GCN, которые несколько труднее загрузить работой на 100% их возможностей. Асинхронное исполнение помогает приблизиться к этому.
С графическими процессорами Nvidia дело обстоит сложнее. Часть чипов архитектуры Kepler (старшие модели) хоть и умеют запускать параллельные потоки с вычислениями, но это требует ручной оптимизации в каждом конкретном случае, имеет множество ограничений и в целом работает не слишком эффективно. В Maxwell второго поколения поддержку асинхронных вычислений улучшили, но некоторые ограничения все равно остались — динамическое распределение групп мультипроцессоров SM сделано сложно и недостаточно эффективно. Так что в играх с поддержкой D3D12 на этих GPU вряд ли получится какое-то ускорение от асинхронных вычислений, а чаще всего эта возможность вообще заблокирована в драйвере и открывается под каждое конкретное приложение.
Но в архитектуре Pascal многое изменилось, эти GPU могут распределять ресурсы мультипроцессоров между очередями команд динамически, и хотя смена контекста приводит к большой потере времени, возможности асинхронных вычислений в этом случае все равно не такие гибкие и эффективные, как в случае архитектуры GCN от конкурента. Все это привело к тому, что новые возможности используются не всеми игровыми разработчиками, ведь доля Nvidia на рынке игровых видеокарт для ПК выше. Но из-за использования графических ядер архитектуры GCN в консолях и помощи разработчикам игр от AMD, такая поддержка появляется во все большем количестве игр. Кроме этого, в последних чипах семейства Turing от Nvidia были устранены все недостатки предыдущих GPU компании, связанные с асинхронными вычислениями и они справляются с ними не хуже конкурента.
Вроде бы все наконец-то хорошо, но увы — даже объявленная поддержка D3D12 еще не значит, что игрой используются все новые функции этого API, не говоря уже о разной степени оптимизации кода, которой теперь в большей мере занимаются именно разработчики игр. В частности, менеджмент ресурсов (геометрии, текстур, буферов и т. п.) в новой версии API делается разработчиками игр самостоятельно, из-за этого иногда возникает больше проблем, чем это было с D3D11. Кроме этого, требования к объему видеопамяти у D3D12-версий чаще всего выше, также увеличена возможность появления ошибок и артефактов изображения. В качестве примера можно взять игру The Division 2, которая в D3D12-режиме при малейшей нехватке видеопамяти сразу же начинает сыпать артефактами, хотя эти же видеокарты с таким же объемом памяти прекрасно работают в D3D11-режиме.
Так, версия GeForce GTX 1060 с 3 ГБ видеопамяти в Full HD-разрешении при высоких настройках качества и использовании D3D11 показывает более чем 60 FPS, но переключение на DX12 приносит падение производительности вдвое — почти до 30 FPS. Именно менеджмент ресурсов, за который теперь отвечают разработчики игр, и привел к тому, что в D3D12 ей не хватает 3 ГБ видеопамяти. Разница между D3D11 и D3D12 именно в том, что в первом случае менеджментом ресурсов занимается API и видеодрайвер, а во втором — исключительно игровой код, написанный программистами конкретного проекта.
Эти недостатки не умаляют прелестей новой версии API, которая способна одним повышением эффективности рендеринга дать возможность увеличить количество и геометрическую сложность объектов в сцене, повысить качество эффектов и принести совершенно новые (чего стоит одна только трассировка лучей). Но делать исключительно D3D12-движок пока что никто не решается, так как устаревших видеокарт у пользователей еще довольно много, и чаще всего игры дают возможность выбора между D3D11 и D3D12. И зачастую они не будут выглядеть лучше в случае выбора более свежей версии API, а просто повысится производительность рендеринга, в лучшем случае. Сегодня мы попробуем разобраться, насколько полезно применение Direct3D 12 в современных играх.
Тестовый стенд и условия тестирования
Для того, чтобы сравнение видеокарт AMD и Nvidia было максимально корректным, мы взяли по одной видеокарте среднего уровня из предыдущего поколения: AMD Radeon RX 580 (8 ГБ) и Nvidia GeForce GTX 1060 (6 ГБ). А для того, чтобы проверить, не улучшился ли прирост от новой для D3D12 функциональности в графической архитектуре Turing, мы дополнительно протестировали еще и топовую Nvidia GeForce GTX 2080 Ti. Для всех видеокарт использовались последние версии драйверов, вышедшие на момент проведения тестов.
Так как прирост от использования новой версии API по опыту наших игровых тестов получается большим в режиме, когда скорость рендеринга ограничена CPU, то мы протестировали видеокарты сразу в двух режимах: при разрешении 1920×1080 и средних настройках качества (условно — ограниченный производительностью процессора режим) и при разрешении 2560×1440 и максимальных настройках качества (условно — режим, ограниченный производительностью видеокарты). И пусть GeForce GTX 2080 Ti даже во втором режиме частенько упирается в CPU, для основной пары сравниваемых видеокарт среднего ценового диапазона эти названия соответствуют условиям.
Тестирование производительности
Мы протестировали дюжину игр, в которых есть возможность переключения между рендерерами, использующими Direct3D 11 и Direct3D 12. Vulkan в этот раз не рассматривали, так как это все-таки иной API и напрямую сравнивать их было бы не совсем корректно. Сегодня же наша основная цель состоит в том, чтобы понять, какие преимущества (или наоборот) на практике дает использование более новой версии графического API от Microsoft для разных графических процессоров.
В список игровых проектов вошли только те игры, в которых есть встроенные бенчмарки — тестировать производительность в данном случае нужно точно, ведь при небольшой разнице в производительности, точность измерения и повторяемость нужно обеспечить максимально возможные. И еще — в этот раз мы приводим только средние показатели частоты кадров, а исследование минимальных показателей, да и вообще времени рендеринга кадров и их стабильности — дело отдельного материала. Там тоже будет много интересного.
Ashes of the Singularity: Escalation
Эта игра была одним из примеров хорошей оптимизации для D3D12 во время своего выхода, и с самого начала она отлично работала на видеокартах Radeon, а вот на GeForce дела были похуже. Но с того времени многое изменилось, теперь и графические процессоры Nvidia отлично с ней справляются. Видимо, из-за какой-то программной ошибки, Radeon RX 580 в наших условиях не получил большого прироста от перехода к D3D12, мы перепроверяли результат не один раз.
Зато обе видеокарты GeForce серьезно ускоряются именно в D3D12-версии игры — на 23% и 33% для старшей и младшей моделей. Но хорошо видно, что использование D3D12 для разгрузки CPU — не панацея, обе видеокарты остались ограничены мощностью центрального процессора. D3D11-видеодрайвер Nvidia оптимизирован довольно неплохо, но и конкурент им не сильно уступает в случае этой игры.
В более тяжелых для графических процессоров условиях, разница между версиями графического API ожидаемо снизилась, особенно для младшей пары видеокарт, но прирост в 10%-12% все же есть для среднебюджетных GPU обоих производителей. Старшая же GeForce RTX 2080 Ti даже в таких условиях частично ограничена мощностью CPU и получает от D3D12-рендерера заметное преимущество. Получается, что D3D12 полезнее именно для систем с мощными GPU.
Civilization VI
Похоже, что игра не слишком хорошо оптимизирована в ее D3D12-части, но еще хуже работает Radeon RX 580 в D3D11-режиме. Вероятно, в компании AMD решили, что все будут использовать D3D12 в случае Civilization VI (на диаграммах в названии игры опечатка) и просто незачем заморачиваться оптимизацией для младшей версии API. Наверное, смысл в этом есть, но уж очень велика разница в частоте кадров — почти двукратная.
Обе видеокарты GeForce в D3D11-режиме уперлись в производительность CPU, но старшая все же показала видимое ускорение порядка 14% при переходе к более свежей версии D3D, а вот младшая GTX 1060 в обоих режимах показывает очень близкий результат — судя по всему, D3D11-драйвер Nvidia отлично оптимизирован для этой игры.
В гораздо более тяжелых условиях с применением мультисэмплинга, Radeon RX 580 все еще получает некоторый прирост от новой версии API, но он уже значительно меньше. А вот что касается прямого конкурента этой модели — GeForce GTX 1060, то она в режиме D3D12 сдает позиции, так что на ней включать D3D12-рендерер не имеет смысла. Скорее всего, это связано с большим потреблением видеопамяти в D3D12-режиме, ведь объем VRAM у этой модели — 6 ГБ против 8 ГБ у Radeon.
Заметно более мощная и дорогая модель GeForce GTX 2080 Ti получает прирост производительности при переходе от D3D11 к D3D12, аналогичный тому, что было у (условного) конкурента от AMD, а видеопамяти у нее еще больше, так что повышенные требования к ее объему не сказываются негативно на скорости рендеринга в игре Civilization VI. Подтверждаем вывод, что больше всего смысла в D3D12 именно в случае самого мощного GPU.
Deus Ex: Mankind Divided
Еще одна игра, к созданию и оптимизации которой приложила руку компания AMD, поэтому она отлично работает на Radeon RX 580 и не очень хорошо — на обеих GeForce. Решение AMD стало единственным, которое обеспечивает прирост в режиме D3D12, хоть и довольно небольшой. Производительность рендеринга почти полностью зависит от GPU, поэтому и прирост низкий. Обе видеокарты Nvidia не просто не получают его, но и серьезно уступают себе же при использовании нового API — для GeForce RTX 2080 Ti падение скорости составило аж 24%, младшая же модель показала близкие результаты в обоих режимах.
В более сложном для GPU режиме ультра-настроек баланс загрузки сместился в сторону GPU, и разница между D3D11 и D3D12 уменьшилась, хотя знак остался тем же: Radeon RX 580 быстрее на пару-тройку процентов, GeForce GTX 1060 медленнее на 6%, а старшая видеокарта Nvidia семейства Turing и вовсе уступает себе же в D3D11-варианте уже 12%. Яркий пример игры, в которой польза от D3D12 есть только для видеокарт AMD. Это и неудивительно, так как разработчики игры с ними очень плотно сотрудничали.
Hitman 1
Что касается очередного проекта — Hitman 1, то эта игра в режиме ограничения производительности центральным процессором работает на всех представленных видеокартах абсолютно одинаково, обеспечивая 110-111 FPS в D3D11-режиме и 118-121 FPS в D3D12. Прирост от нового API есть на всех видеокартах и он составляет порядка 7%-9%, но похоже, что более интересным будет сравнение в более тяжелом для GPU режиме.
Похоже, что толк от более новой версии D3D в случае этой игры есть только при ограничении скорости рендеринга мощностью CPU, как это получилось и в этом случае для GeForce RTX 2080 Ti, которая ускорилась аж на 18% при включении D3D12-рендерера. А вот две младшие видеокарты от AMD и Nvidia показали практически идентичный результат в обоих режимах. Вывод все тот же — чем мощнее GPU, тем больше прирост от D3D12, так как скорость чаще упирается в CPU.
Hitman 2
Следующая игра серии сильнее нагружает графические процессоры, поэтому скорость рендеринга в ней не так сильно упирается в возможности CPU. Хотя некоторое ограничение есть, в D3D11-режиме все видеокарты близки. А вот при использовании D3D12 выделяется старшая видеокарта Nvidia, она одна получила прирост от более новой версии Direct3D, хоть и небольшой.
Удивительна разница между D3D11 и D3D12 для Radeon RX 580 и GeForce GTX 1060 — хотя она отрицательная для пары представленных в сравнении GPU среднего уровня, но больше всего от включения нового API пострадал почему-то Radeon, хотя куда чаще бывает наоборот. Посмотрим, что будет при увеличении нагрузки на графику.
В общем и целом, более тяжелые условия для GPU не принесли ничего нового, диаграмма схожа с предыдущей, за исключением того, что топовый Turing сильно вырвался вперед по абсолютным показателям. Парочка среднебюджетных Radeon RX 580 и GeForce GTX 1060 очень близка друг к другу в обоих режимах, решение AMD совсем чуть-чуть впереди, и для обоих нет смысла в D3D12, так как этот режим дает лишь падение скорости. А вот старшая видеокарта семейства GeForce RTX все еще получает прирост, упираясь в CPU, пусть уже и несколько меньше.
F1 2018
Игры от компании Codemasters под официальной лицензией Формулы 1 выходят постоянно, но они мало меняются год от года с графической точки зрения. Впрочем, F1 2018 стала первой, в которой появилась бета-поддержка Direct3D12, и мы этим воспользовались. Похоже, что D3D11-драйвер у AMD не очень хорошо оптимизирован и для этой игры, потому что прирост от включения D3D12 получился более чем на 50%. А вот для Nvidia разница составила всего лишь 9% и 2% для GTX 1060 и RTX 2080 Ti, соответственно, но тоже в пользу нового API.
Зато в более тяжелом режиме ситуация совершенно иная. Младший представитель Nvidia не получает от включения D3D12 никаких преимуществ, а Radeon RX 580 довольствуется 10% прироста. Примерно такая же разница для двух режимов с разными графическими API и для GeForce RTX 2080 Ti, так что в случае тяжелого для GPU режима все похоже на ничью.
Rise of the Tomb Raider
Хорошо видно, что более старая игра приключений Лары Крофт не слишком хорошо оптимизирована для Direct3D12, разница между двумя версиями API составляет лишь до 9%, но если GTX 1060 почти не получает преимущества, то две другие видеокарты показали видимый прирост частоты кадров, хоть и не слишком большой. Посмотрим, что получится в тяжелом для видеочипов режиме:
Как ни странно, но ситуация осталась почти без изменений, только относительные цифры прироста снизились, и теперь он составляет от 2% до 5% — всегда в пользу более новой версии D3D. Старшая GeForce RTX 2080 Ti заметно быстрее других видеокарт, но и для нее разница между D3D11 и D3D12 составляет лишь 5%. Главный вывод — можно смело включать D3D12-режим для видеокарт и AMD и Nvidia, и чем мощнее GPU — тем больше прирост в частоте кадров.
Shadow of the Tomb Raider
Последняя игра серии Tomb Raider получила более продвинутый D3D12-рендерер, и он явно работает лучше на видеокартах Nvidia, что тоже неудивительно, ведь именно они помогали разработчикам игры при оптимизации кода. В то время как Radeon RX 580 в D3D12-режиме уступил самому себе 5% при сравнении с D3D11-версией, GeForce GTX 1060 показала прирост скорости в 13%, а топовая карта семейства Turing вообще была почти на треть быстрее при использовании нового API.
Нагрузка на GPU увеличилась, но не настолько, чтобы скорость упиралась в него в случае GeForce RTX 2080 Ti, поэтому для этой модели выводы остались прежними — в D3D12-режиме скорость заметно выше, а нагрузка на CPU меньше. А вот парочка среднебюджетных решений, ставших весьма популярными за несколько лет, показывает очень близкие результаты в обоих режимах — обе они обеспечивают 37-39 FPS, в зависимости от условий.
The Division 1
Первая игра сериала The Division получила D3D12-рендерер не сразу по выходу, а несколько позднее. Похоже, что он не слишком хорошо подходит для графических решений Nvidia, которые не получают прироста от его использования, а старшая GeForce RTX 2080 Ti даже снижает производительность на несколько процентов. В то же время, единственный Radeon в нашем материале дает почти 10% прирост от применения нового API.
Примерно то же самое получается и при усложнении задачи для графических процессоров — повышение разрешения и качества рендеринга привело к снижению прироста и падения скорости, но их знак остался тем же: на GeForce GTX 1060 выбор API не влияет ни на что, старшая GeForce немного теряет в D3D12-режиме, а модель Radeon RX 580 оказалась быстрее при использовании новой версии API, но уже лишь на 6%.
The Division 2
Вторая часть игры явно смотрится лучше уже в D3D12-варианте, причем сразу на всех участвующих в нашем сравнении графических процессорах. Решения среднего уровня от AMD и Nvidia получают прирост от нового API порядка 10%-12%, хотя при этом Radeon RX 580 оказывается заметно производительнее своего прямого конкурента, а вот GeForce RTX 2080 Ti довольствуется вдвое меньшим приростом в частоте кадров от D3D12.
Ситуация переворачивается с ног на голову при увеличении нагрузки на GPU. Теперь среднебюджетные Radeon RX 580 и GeForce GTX 1060 показывают прирост скорости рендеринга лишь на 8% и 3%, соответственно, а вот старшая видеокарта Nvidia в более сложных для GPU условиях показала прирост FPS аж на 18%. Так что главные выводы все те же. Во-первых, в случае игры The Division 2 можно использовать D3D12-режим на видеокартах обеих компаний: AMD и Nvidia. А во-вторых, толку от нового API тем больше, чем мощнее GPU относительно CPU.
Total War: Warhammer II
Увы, но в случае игры Total War: Warhammer II, режим использования Direct3D12 остается в опытном варианте, и он абсолютно на всех видеокартах серьезно проигрывает D3D11-рендереру. Если для среднеценовых видеокарт Radeon RX 580 и GeForce GTX 1060 падение производительности составило 14%-17%, то для топовой видеокарты семейства GeForce RTX это уже минус треть скорости от D3D11-режима, что просто неприемлемо. Налицо плохая оптимизация разработчиками. Неудивительно, что из более новой Total War: Three Kingdoms такую кривую поддержку выкинули.
Почти то же самое отмечается и в более сложном графически режиме с повышенным разрешением рендеринга и максимальным качеством графики. Абсолютно все GPU при использовании более нового графического API уступают себе же в D3D11-варианте. Видеокарты средней мощности довольствуются падением частоты кадров на 10%-18%, а старшая GeForce — сразу на 27%. Вердикт: не включать D3D12 в этой игре ни в коем случае!
Metro Exodus
Игра Metro Exodus вышла не так давно, и кроме поддержки трассировки лучей DXR, имеет и D3D12-рендерер. Не очень понятно, кто виноват в таком качестве оптимизации, но на Radeon RX 580 мы отмечаем небольшой прирост в скорости рендеринга при переключении API на более новый (5%), а вот на GeForce GTX 1060 получается −4%. И если для D3D11 они обе показали 56 FPS, то в D3D12-режиме разница явно в пользу Radeon. А GeForce RTX 2080 Ti так и вовсе поразила падением скорости более чем на 20%. А ведь игра разрабатывалась с поддержкой компании Nvidia.
Даже на средних настройках в Full HD-разрешении производительность в игре упирается в GPU, ну а при усложнении задачи графический процессор и вовсе становится единственным ограничителем скорости рендеринга. Прирост от включения D3D12 в случае Radeon RX 580 немного увеличился, а вот обе GeForce все так же не получают никаких преимуществ от более современного рендерера, но хотя бы падение скорости стало меньше. В общем, польза от нового API в этой игре снова есть только для Radeon, да и то небольшая.
Выводы
Что хочется сразу отметить — все игры очень разные и сделать однозначные выводы по ним не получится. Средние показатели, полученные при сравнении двух разных версий API, дают не очень много информации, хотя кое-что можно понять и по ним. Уж очень по-разному сделаны D3D11 и D3D12-версии движков в разных играх. Соответственно, и ведут они себя совершенно по-разному на различных GPU, и две-три игры с большим падением или приростом FPS могут очень сильно повлиять на средний счет.
Архитектуры графических процессоров AMD и Nvidia сильно отличаются, качество кода для D3D12 тоже разное. Достаточно сравнить The Division 2, в котором все GPU получают преимущество от новой версии API, и Total War: Warhammer II, в которой на всех видеокартах отмечено сильное падение производительности. Поэтому лучше рассматривать сочетания конкретной игры и отдельных GPU. Но все же приведем средние показатели чисто справочно:
1920×1080 medium | 2560×1440 maximum | |
---|---|---|
Radeon RX 580 | 11% | 3% |
GeForce GTX 1060 | 4% | −3% |
GeForce RTX 2080 Ti | 2% | 8% |
Как видите, по средним цифрам можно увидеть лишь то, что Radeon RX 580 в среднем лучше справляется в D3D12 в режиме средней нагрузки на GPU и большой на CPU. Это может быть вызвано в том числе и тем, что при ограничении производительности рендеринга универсальным процессором, D3D11-драйвер AMD не слишком хорошо оптимизирован для многопоточной работы. У Nvidia такая оптимизация лучше, и в режиме невысокой нагрузки на GPU видеокарты GeForce и в D3D11 выглядят неплохо.
Еще один интересный вывод по средним цифрам — в более тяжелом режиме явно виден сильный прирост скорости у GeForce RTX 2080 Ti. Так получилось из-за того, что даже в повышенном разрешении при максимальных настройках общая скорость рендеринга частенько упиралась в CPU, а в этом случае применение D3D12 дает преимущество. Получается, что больше всего смысла в использовании новой версии D3D будет именно для более мощных GPU.
Мы намеренно не взяли в сравнение архитектуру Kepler — новую версию API эти GPU поддерживают лишь номинально, в некоторых играх D3D12-рендереры вообще не работают на таких GPU, а где работают, то не только не отмечается прироста производительности, а она даже значительно ухудшается, чаще всего. Да и архитектура Maxwell не очень хороша в D3D12-играх, чаще всего и на этих GPU прироста мы не видим. Кроме этого, видеокарты с малым количеством видеопамяти всегда страдают в случае D3D12 больше, так как программисты хуже оптимизируют код, чем это делает предыдущая версия графического API. Мы увидели это на примере игры Civilization IV, в которой в том числе использовался мультисэмплинг, предъявляющий повышенные требования к объему VRAM.
Что можно выделить еще — в случае режима с высокой загрузкой GPU, у видеокарт AMD все неплохо, от новой версии API они получают прирост частоты кадров во многих случаях, хоть и небольшой. За исключением высоких разрешений при малом объеме видеопамяти и некоторых игр, в которых D3D12-движок сделан явно не очень хорошо. Для Pascal в лице GeForce GTX 1060 новая версия API помогает несколько меньше, а иногда и вовсе дает отрицательный прирост FPS.
При упоре производительности в возможности CPU, новая версия Direct3D дает куда больший прирост в большем количестве случаев, и особенно это касается видеокарт AMD, D3D11-драйвер у которых несколько хуже оптимизирован. В своих обзорах мы не раз отмечали, что в таких случаях Radeon частенько проигрывает аналогичным по скорости картам GeForce. Но теперь, когда Direct3D12 используется все чаще, ситуация начинает улучшаться. И игр с поддержкой нового API будет все больше.
Повторим главный вывод нашего небольшого исследования — все игры и движки по-разному оптимизированы для новой версии графического API DirectX, и почти невозможно дать универсальный совет, стоит ли включать D3D12-рендерер или нет. Слишком многое зависит от разработчиков игр, и в случае новой версии D3D их влияние лишь усилилось. На многое также влияет и поддержка со стороны производителей GPU, которые помогают оптимизировать код именно под свои решения. Но DirectX 12 API точно дает важные преимущества и включать его в большинстве игр можно уже без особых опасений.