company_banner

Что нового в Direct3D 11.2

    DirectX 11.2 вошедший в выпуск Windows 8.1 насчитывает ряд интересных и нужных нововведений. В этом посте будет проведен краткий обзор основных новинок, а так же рассмотрены некоторые сценарии применения. Несмотря на то что нововведений не так много, некоторые из них будут весьма кстати при разработке приложений для мобильных устройств, и приложений для Windows Store.

    Кратко о новинках.


    Основная часть работ которые были проделаны с DirectX 11.2 связана в первую очередь с производительностью и эффективностью, и на прямую не коснется программистов. Ваши приложения будут быстрее работать и требовать меньше ресурсов. Тем не менее в Direct3D 11.2 API включено некоторое количество новых API:

    1. Поддержка аппаратных оверлеев: инструмент динамического масштабирования с интересными вариантами сценариев.
    2. Компиляция и линковка шейдеров HLSL в рантайме: возможность которая позволяет компоновать шейдеры во время выполнения, в том числе для приложений Windows Store.
    3. Отображаемые в память буфферы: Возможность которая позволяет убрать необходимость дополнительных операций копирования данных при обмене данными с GPU
    4. API снижения задержек ввода: Механизм который позволяет значительно снизить время задержки между пользовательским вводом и выводом результатов на экран.
    5. Тайловые ресурсы: Улучшение качества рендера с применением карт текстур.

    Поддержка аппаратных оверлеев.


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


    Как уже понятно из картинки, аппаратный оверлей позволяет осуществлять рендер в буфер с низким разрешением, а затем увеличивать это изображение до необходимого размера и смешивать с дополнительными буферами через альфа-маску. Игра может отображать 3D сцену в первом оверлее с сниженным качеством, но при этом HUD или другие графические элементы приложения могут отображаться с высоким качеством.
    При этом поддерживается два основных сценария применения аппаратных оверлеев — статический и динамический.

    Статический оверлей.

    Данный тип оверлея просто принимает уровень масштабирования при инициализации буфера и в дальнейшем не меняет своих значений. Для инициализации достаточно указать флаг DXGI_SCALING_STRETCH:

    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
    swapChainDesc.Width = screenWidth / 1.5f;
    swapChainDesc.Height = screenHeight / 1.5f;
    swapChainDesc.Scaling = DXGI_SCALING_STRETCH; 
    ...
    dxgiFactory->CreateSwapChainForCoreWindow(
        m_d3dDevice.Get(),
        reinterpret_cast<IUnknown*>(m_window.Get()),
        &swapChainDesc,
        nullptr,
        &swapChain
        );
    


    Применимость этого метода ограничивается случаями, в которых вы уже знаете уровень масштабирования заранее.

    Динамический оверлей.

    Более интересный вариант, в котором уровень масштабирования может меняться «на лету», без повторной инициализации буферов (Swapchain). Вам достаточно вызвать функцию SetSourceSize перед каждым рендером:

    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
    swapChainDesc.Width = screenWidth;
    swapChainDesc.Height = screenHeight;
    swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
    dxgiFactory->CreateSwapChainForCoreWindow( ... );
    ...
    if (fps_low == true) {
        swapChain->SetSourceSize(screenWidth * 0.8f, screenHeight * 0.8f);
    }
    // рендер.
    ...
    swapChain->Present(1, 0);
    


    Динамический оверлей позволяет, в зависимости от текущей нагрузки на аппаратные ресурсы, моментально менять качество картинки без ущерба к FPS. Порой даже 10% снижение разрешения конечного изображения может в разы ускорить процедуры рендера, что положительно скажется на динамичных нагруженных сценах. У игроков пропадет ощущение «тормозов» в случаях когда на экран выводится слишком много объектов.

    Компиляция и линковка шейдеров.


    Динамическая компиляция шейдеров — это весьма удобный инструмент оптимизации во время работы приложения. К сожалению, в Windows 8.0, для приложений Windows Store эта возможность была недоступна, и разработчикам необходимо было создавать бинарные блобы шейдеров заранее. С выходом Windows 8.1 эта возможность вернулась и для приложений Windows Store.
    В дополнение к этому появилась опция компиляции шейдеров ‘lib_5_0', которая позволяет компоновать вычислительные блоки шейдеров и затем, во время исполнения программы, не компилировать шейдеры, а только собирать из готовых библиотек. Эта возможность позволяет значительно повысить время подключения шейдера и исключить дорогую операцию компиляции во время исполнения приложения.

    Отображаемые в память буферы.


    В Windows 8.0 обмен данными с GPU для вычислительных шейдеров требует использования вспомогательных буфферов. Это налагает некоторые издержки, и как раз таки для вычислительных шейдеров может стоить дорого.


    Если вы используете Windows 8.1 и DirectX 11.2 у вас есть возможность убрать две вспомогательные операции воспользовавшись флагом CPU_ACCESS. Тогда картинка будет выглядеть следующим образом:


    Тем самым можно достичь увеличения производительности для вычислительных шейдеров. Следует отметить что пока эта возможность работает только для буферов данных, но не для текстур (Texture1D/2D/3D). Во всяком случае у разработчика есть простой путь проверки и работы напрямую или же с помощью вспомогательного буфера:

    D3D11_FEATURE_DATA_D3D11_OPTIONS1 featureOptions;
    m_deviceResources->GetD3DDevice()->CheckFeatureSupport(
        D3D11_FEATURE_D3D11_OPTIONS1,
        &featureOptions,
        sizeof(featureOptions)
        );
    ...
    If (featureOptions.MapDefaultBuffers) {
        deviceContext->Map(defaultBuffer, ...);
    } else {
        deviceContext->CopyResource(stagingBuffer, defaultBuffer);
        deviceContext->Map(stagingBuffer, ...);
    }
    


    API снижения задержек ввода


    Время, между реакцией на ввод и реальным отображением результатов на экране, является критичным для многих приложений, а особенно игр. Если это время слишком велико, то у игрока появляется ощущение «тормозов» и дискомфорт. Оптимизация этого времени достаточно кропотливый процесс, но вместе с выходом DirectX 11.2 у программистов появился дополнительный механизм значительно облегчающий эту задачу. Появилось новое API IDXGISwapChain2::GetFrameLatencyWaitableObject которое позволяет получить WAIT HANDLE и в дальнейшем используя WaitForMultipleObjectEx дождаться самого удачного момента рендера:

    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
    ...
    swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT;
    dxgiFactory->CreateSwapChainForCoreWindow( ... );
    HANDLE frameLatencyWaitableObject = swapChain->GetFrameLatencyWaitableObject();
    while (m_windowVisible)
    {
        WaitForSingleObjectEx(
            frameLatencyWaitableObject,
            INFINITE,
            true
            );
        Render();
        swapChain->Present(1, 0);
    }
    


    Например, результатом использования этого API может быть снижение времени задержки более чем вдвое на таких устройствах как Surface, с 46 миллисекунд до 20 миллисекунд.

    Тайловые ресурсы



    Современные игры требуют все большего и большего количества видео памяти, в том числе для текстур. От качества текстур и их разрешения напрямую зависит качество конечной картинки. Одним из методов оптимизации используемой видео памяти является механизм тайловых ресурсов Direct X 11.2 (Tiled resources). Чтобы понять о чем речь лучше посмотреть трехминутный ролик из пленарного доклада Build.

    Ссылки и примеры


    1. Новое в C++/DirectX 11.2 разработке для Windows 8.1
    2. Тайловые ресурсы – доклад конфереции Build’13
    3. DirectX Foreground swapchain sample
    4. HLSL Shader Compiler sample
    5. DirectX latency sample
    6. Tiled resources sample
    Microsoft
    Microsoft — мировой лидер в области ПО и ИТ-услуг

    Похожие публикации

    Комментарии 30

      +1
      То есть видеокарта может теперь «забирать» ресурсы оперативной памяти на «мега-текстуру» если мало видеопамяти на борту видеокарточки?
      Если в 2 словах и на 2 пальцах?
      И еще вопрос — 11.2 это софтовый апдеит или все таки аппаратный и придется менять карту?
        0
        Вы можете использовать «мега текстуру» размером ну скажем в 128 мегабайт, но при этом реальный объем используемой видеопамяти будет 64 мегабайта. Хитрый механизм тайлинга подргузит нужную часть.
          0
          Т.е. с прицелом в будущее имеет таки смысл собирать игровую конфигурацию с 16+ Гб памяти?
            –2
            Вы что, саботируете продажи новых видеокарт? :)
              –1
              У видеокарт уже давно памяти с избытком.
              2Gb на борту имеют хоть какой-то смысл только при очень мощном GPU, а их уже и в ноутбучные карты ставят.
                +1
                Вообще-то это неправда, в этом году 2Gb уже минимум, и то только для 1080p.
            0
            Напоминает механизм подкачки страниц, только применительно к GPU. Текстура нарезается на небольшие кусочки, которые хранятся в обычной памяти, и при обращении к ним подгружаются автоматически (для разработчика текстура выглядит цельной). Такой своего рода своп.
            Очень удобно для текстурных атласов — пустые области, не содержащие реальных данных, не занимают видеопамяти вообще, туда попадает только то, что реально используется.
              +1
              Большинство анонсированных возможностей не требуют аппаратной поддержки в видеокарте.

              Надо отметить, что карты nVidia ограничены уровнем DX11_0, не поддерживают некоторых фич DX11.1 и DX11.2 (Target-Independent Rasterization (2D-Rendering), 16xMSAA Rasterization (2D-Rendering), Orthogonal Line Rendering Mode, UAV in non-pixel-shader stages).

              Карты AMD от 7000 серии поддерживают все возможности 11.2.
              0
              Планируется ли низкоуровневое API наподобие Mantle?
              Где можно посмотреть примерные планы на DirectX 12? :)
                +1
                Странно как-то Ваш вопрос звучит. Mantle есть. Зачем Вам ещё одно низкоуровневое API «наподобие» его?
                  0
                  у AMD сейчас 32.66% видеокарт на РС, Mantle насколько я понимаю будет работать только на новых моделях — это еще меньший процент.
                  DirectX 11 — это 62.79% видеокарт прямо сейчас, к тому 11.2 обещают на Xbox One
                  store.steampowered.com/hwsurvey?l=russian
                  Низкоуровневое API закроет существующие провалы по производительности и дополнит стек.
                    0
                    Вы же не будете спорить с тем, что единое низкоуровневое API для графики оказало бы феноминально положительный эффект на всю индустрию? Так вот, пока на эту роль кандидат только один — Mantle, и у него уже почти треть рынка (по Вашим цифрам). В идеале Nvidia нужно реализовать поддержку Mantle у себя (или, хотя бы, сообществу вокрут открытых драйверов Nvidia начать двигаться в эту сторону). Естественно, надеяться на то, что MS спокойно останется в стороне, наивно.

                    Давайте предположим, что MS выкатило свой низкоуровневый API. Единственное железо, которое будет поддерживать его, будет Xbox One. Понятно, что AMD делает это железо, и что AMD было бы проще разработать драйвера для MS API и под Windows, но зачем им идти на этот шаг, когда у них уже есть рабочий Mantle? Nvidia же встанет перед тяжким (в плане денег и репутации) выбором, хотя главное, чтобы они не «пошли своим путём», а то опять канём в эру первобытности и многообразия.

                    Заключение: MS может и выкатит свой API, но хорошего в этом мало.
                      0
                      Альтернативный вариант: MS добавляет поддержку Mantle в Xbox One (дешевле, чем новый стандарт создавать). У NVidia не остаётся выбора. Разработчики счастливы!
                  +4
                  примерные планы на DirectX 12?
                  windows 9 only.
                    –1
                    DirectX как раз и абстрагирует от низкоуровневого API
                    +6
                    Я верно понял, что данный directX не совместим с windows 7?
                      +1
                      *direct3d
                        0
                        Он эксклюзивен для Windows 8.1 и X-Box One.
                          –1
                          Что за вопрос, это же Microsoft.
                        • НЛО прилетело и опубликовало эту надпись здесь
                            –2
                            Интересно было бы узнать, есть ли среди этих новшеств такие, коих ещё не представлено в виде ARB расширений OpenGL.
                              +1
                              Сложно сравнивать, т.к. часть этих новых фич больше походит на синтаксический сахар или особенности реализации. Например, API для упрощённого/улучшенного рендеринга WPF-элементов — оно ведь изначально под DX заточено. Или поддержка WARP devices, тоже чисто виндовая фича.
                              В целом же в OpenGL многое не столько отсутствует, сколько реализовано через одно место, например:
                              • Tiled resources. Пожалуй, самое полезное из DX11.2-нововведений, в OpenGL есть лишь в виде GL_AMD_sparse_texture. Со стороны NVidia аналога нет вообще, как нет и ARB-расширения.
                              • Прекомпиляция/линковка шейдеров. Вообще-то часть OpenGL 4.1 core (описано в разделе 2.11), но тут есть нюанс: HLSL компилируется в байт-код, который заявлен кроссплатформенным. GLSL же даёт сразу нативный код, т.е. оно оказывается привязано к конкретному девайсу.
                                0
                                Спасибо за ответ! Не понял только, за что минусы…
                              +2
                              А чем аппаратный оверлей лучше, чем срендерить сцену в текстуру, и вывести квад с этой текстурой растянув ее как угодно? И потом во фреймбуффер дорисовать все, что душе угодно.
                                +1
                                По перформансу звучит печальненько.
                                  0
                                  Рендер в текстуру намного медленнее рендера во фреймбуффер? Если нет, то к выводу добавится один батч (рисование этого самого квада). Я что-то упускаю?
                                    –1
                                    Там же написано с что возможно использовать более низкие разрешения — как я понимаю, в текстуру вы срендерите полностью ФулХД сцену(допустим), а потм еще будете чтото с нею манипулировать,
                                      0
                                      В текстуру можно рендерить картинку в любом разрешении (в пределах, поддерживаемых видеокартой, конечно). Хотите — 320x180 и растягивайте потом до FullHD, хотите — рендерите в 4K, и даунсемплите до того же FullHD (если мощи хватит).
                                  0
                                  Подумал о том же. Наворачивать функциональность только чтобы сэкономить один квад — это как-то неэффективно с позиции MS.
                                  0
                                  То есть карты типа GTX770/780 и вероятно 780ti не будут поддерживать таилинг?
                                  Раз про них говорят, что они DX11_0…

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое