Новые возможности DirectX 11: многопоточный рендеринг
🕛 19.12.2008, 02:01
Возвращаясь к нашему разговору о новом в DirectX 11, который, как многие из вас заметили, уже присутствует в сборке Windows 7 build 6956, стоит отметить, что Microsoft опровергла заявление Бена Базарика (Ben Basaric), продукт-менеджера Windows, который не так давно сказал, что Microsoft не успевает завершить работу над DirectX 11 к релизу Windows 7. Ну а сегодня мы поговорим о еще одной ключевой особенности нового API - многопоточного рендеринга.Хотя многопоточный рендеринг сложно назвать новой частью графического конвейера, это невероятно важная особенность DirectX 11. Она становится еще более важной, если вы посмотрите на ее потенциал с расчетом на портирование этих усовершенствований на аппаратные средства класса DirectX 10 при помощи обновления драйверов.
Сегодня на рынке преобладают двуядерные CPU, хотя четырехядерные модели становятся все более доступными для геймеров и энтузиастов, поэтому в ближайшем будущем четырехядерные процессоры заменят своих двуядерных собратьев, став в области процессоров стандартом де-факто. Учитывая этот факт, возникает резонный вопрос, почему DirectX до сих пор не поддерживает многопоточный рендеринг. Справедливости ради стоит отметить, что и AMD, и Nvidia уже работали над многопоточными драйверами, однако успех этих начинаний был ограничен тем, что API в конечном счете сводил все к одному потоку.
Мы поговорили на эту тему с много разработчиками - некоторые из них придумывали способы использования дополнительных ядер, в то время как другие изо всех сил пытались извлечь больше производительности и часто оставляли простаивать эти дополнительные ядра. Сегодня таких проблем становится все меньше, поскольку разработчики стали думать по поводу распараллеливания потоков, но все еще есть такие сценарии, когда приложение сильно ограничивается возможностями CPU.
К счастью, с приходом DirectX 11 ситуация должна коренным образом изменится, и Microsoft сделает возможным получение выгоды от использования этих функций на аппаратном обеспечении DirectX 10. Команды разработчиков соответствующих драйверов в AMD и Nvidia должны будут проделать определенный комплекс работ, чтобы осуществить поддержку этих функций в своих драйверах, но как только они это сделают для DX11, им не составит большого труда перенести эту поддержку и в DX10.
Microsoft удалось достичь этого путем разбиения устройства Direct3D на три отдельных интерфейса: Device, Immediate Context (прямой контекст) и Deferred Context (отложенный контекст). Каждый из них назначается на поток, поэтому благодаря интерфейсам Device и Deferred Context на задачи, стоящие в очереди Immediate Context или потока обработки, может быть назначено больше одного потока.
Переключение между потоками легко контролировать, так что разработчик должен будет сам решать, как и в каком порядке операции будут помещаться в очередь для интерфейса Immediate Context. Каждый интерфейс Device может загружать потоковые ресурсы как и когда угодно в то время, как интерфейс Deferred Context служит в качестве работающего с потоками контекста устройств для будущих операций рендеринга - он организует очередь из запросов прорисовки (или списков команд Display List) прежде, чем передать их интерфейсу Immediate Context, когда он будет готов.
Для графических карт поколения DirectX 10 интерфейс Deferred Context должен реализоваться на программном, а не аппаратном, уровне, поскольку в новом аппаратном обеспечении будут сделаны соответствующие оптимизации для многопоточного рендеринга. Из-за этого интерфейсы Deferred Context не смогут самостоятельно распределяться по потокам на аппаратном обеспечении DX10 и это придется делать на уровне API.
Ну вот подошла к концу очередная статья нашего цикла. В следующий раз мы поговорим о еще одной интересной особенности DX11 - динамическом подключении шейдеров.