Огромная разница в частоте кадров в Direct2D при двух разных настройкахC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Огромная разница в частоте кадров в Direct2D при двух разных настройках

Сообщение Гость »


Сейчас я изучаю Direct2D и наткнулся на два разных метода установки в msdn. При первом методе настройки я получаю в среднем вдвое больше кадров в секунду по сравнению со вторым методом.

Скриншот первой настройки: Direct2dSetup Скриншот второй настройки: настройка Directx11

Код первой установки (более быстрый результат):

Параметры D2D1_FACTORY_OPTIONS; options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION; HRESULT hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_MULTI_THREADED, параметры, m_pD2DFactory.GetAddressOf() ); // Получаем размер области рисования. ПРЯМОЙ rc; GetClientRect(hwnd, &rc); // Создаем цель рендеринга Direct2D hr = m_pD2DFactory->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties( хунд, D2D1::SizeU( rc.right - rc.left, rc.bottom — rc.top), D2D1_PRESENT_OPTIONS_IMMEDIATELY // D2D1_PRESENT_OPTIONS_NONE // D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS // D2D1_PRESENT_OPTIONS_IMMEDIATELY // D2D1_PRESENT_OPTIONS_FORCE_DWORD ), m_pD2D1RenderTarget.GetAddressOf() ); m_pD2D1RenderTarget->QueryInterface(m_pD2DDeviceContext.GetAddressOf()); m_pD2DDeviceContext->CreateSpriteBatch(&m_pSpriteBatch); DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(pDWriteFactory), reinterpret_cast(pDWriteFactory.GetAddressOf()) ); pDWriteFactory->CreateTextFormat( Л"Вердана", НУЛЕВОЙ, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 20, L"", // локаль pDWriteTextFormat.GetAddressOf() ); pDWriteTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING); pDWriteTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_FAR); Второй код установки (медленнее, но с DirectX11):

Параметры D2D1_FACTORY_OPTIONS; options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION; HRESULT hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_MULTI_THREADED, параметры, m_pD2DFactory.GetAddressOf() ); // Этот флаг добавляет поддержку поверхностей с другим порядком цветовых каналов, чем в API по умолчанию. // Это нужно для совместимости с Direct2D. UINT CreationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; // Этот массив определяет набор уровней аппаратных функций DirectX, которые поддерживает это приложение. // Порядок важен, и вы должны его сохранить. // Не забудьте объявить минимальный необходимый уровень функциональности вашего приложения в его // описание. Предполагается, что все приложения поддерживают версию 9.1, если не указано иное. D3D_FEATURE_LEVEL FeatureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; // Создайте объект устройства API DX11 и получите соответствующий контекст. m_D3DFeatureLevel = D3D_FEATURE_LEVEL_11_1; DX::ThrowIfFailed( D3D11CreateDevice( nullptr, // указываем ноль, чтобы использовать адаптер по умолчанию D3D_DRIVER_TYPE_HARDWARE, 0, CreationFlags, // опционально устанавливаем флаги отладки и совместимости с Direct2D FeatureLevels, // список уровней функций, которые может поддерживать это приложение ARRAYSIZE(featureLevels), // количество возможных уровней функций D3D11_SDK_VERSION, &m_pD3D11Device, // возвращает созданное устройство Direct3D &m_D3DFeatureLevel, // возвращает уровень функций созданного устройства &m_pD3D11DeviceContext // возвращает непосредственный контекст устройства ) ); // Получение базового устройства DXGI устройства Direct3D11. DX::ThrowIfFailed( m_pD3D11Device.As(&dxgiDevice) ); // Получение устройства Direct2D для 2D-рендеринга. DX::ThrowIfFailed( m_pD2DFactory->CreateDevice(dxgiDevice.Get(), &m_pD2DDevice) ); // Получаем соответствующий объект контекста устройства Direct2D-устройства. DX::ThrowIfFailed( m_pD2DDevice->CreateDeviceContext( D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &m_pD2DDeviceContext ) ); // Выделяем дескриптор. DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = 0; // используем автоматическое определение размера swapChainDesc.Height = 0; swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // это наиболее распространенный формат цепочки обмена swapChainDesc.Stereo = ложь; swapChainDesc.SampleDesc.Count = 1; // не использовать множественную выборку swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // используем двойную буферизацию, чтобы включить переворот swapChainDesc.Scaling = DXGI_SCALING_NONE; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // все приложения должны использовать этот SwapEffect swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; // Определите физический адаптер (графический процессор или карту), на котором работает это устройство. Microsoft::WRL::ComPtr dxgiAdapter; DX::ThrowIfFailed( dxgiDevice->GetAdapter(&dxgiAdapter) ); // Получаем фабричный объект, создавший устройство DXGI. Microsoft::WRL::ComPtr dxgiFactory; DX::ThrowIfFailed( dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)) ); // Получите окончательную цепочку подкачки для этого окна от фабрики DXGI. DX::ThrowIfFailed( dxgiFactory->CreateSwapChainForHwnd( m_pD3D11Device.Get(), хунд, &swapChainDesc, nullptr, // разрешить на всех дисплеях нульптр, &m_DXGISwapChain ) ); // Убедитесь, что DXGI не ставит в очередь более одного кадра за раз. DX::ThrowIfFailed( dxgiDevice->SetMaximumFrameLatency (1) ); // Получаем задний буфер для этого окна, которое является конечной целью 3D-рендеринга. DX::ThrowIfFailed( m_DXGISwapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)) ); // Теперь мы настраиваем целевое растровое изображение рендеринга Direct2D, связанное с цепочкой обмена. // Всякий раз, когда мы визуализируем это растровое изображение, оно непосредственно визуализируется в // цепочка обмена, связанная с окном. D2D1_BITMAP_PROPERTIES1 растровое изображениеСвойства = D2D1::BitmapProperties1( D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE), 96, 96 ); // Direct2D нужна версия dxgi указателя поверхности обратного буфера. DX::ThrowIfFailed( m_DXGISwapChain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer)) ); // Получаем поверхность D2D из заднего буфера DXGI для использования в качестве цели рендеринга D2D. DX::ThrowIfFailed( m_pD2DDeviceContext->CreateBitmapFromDxgiSurface( dxgiBackBuffer.Get(), &Свойства растрового изображения, &m_pD2D1TargetBitmap ) ); // Теперь мы можем установить цель рендеринга Direct2D. m_pD2DDeviceContext->SetTarget(m_pD2D1TargetBitmap.Get()); m_pD2DDeviceContext->CreateSpriteBatch(&m_pSpriteBatch); DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(pDWriteFactory), reinterpret_cast(pDWriteFactory.GetAddressOf()) ); pDWriteFactory->CreateTextFormat( Л"Вердана", НУЛЕВОЙ, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 20, L"", // локаль pDWriteTextFormat.GetAddressOf() ); pDWriteTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING); pDWriteTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_FAR); При использовании DirectX11 и DXGI мне также приходится использовать функцию SwapChain Present1 в моем методе рендеринга:

DXGI_PRESENT_PARAMETERS pp = {}; pp.DirtyRectsCount = 0; pp.pDirtyRects = NULL; pp.pScrollRect = NULL; pp.pScrollOffset = NULL; DX::ThrowIfFailed( m_DXGISwapChain->Present1(0, DXGI_PRESENT_ALLOW_TEARING, &pp) ); Почему у меня такой нестабильный (и низкий) показатель кадров в секунду при настройке DirectX11/Direct2D?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Огромная разница между моделью (входные данные, обучение = True) и моделью (входные данные, обучение = False)
    Anonymous » » в форуме Python
    0 Ответы
    54 Просмотры
    Последнее сообщение Anonymous
  • Как создать наложение, невидимое на скриншоте, с помощью DirectComposition и Direct2D в C++?
    Anonymous » » в форуме C++
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Создание ID2D1DeviceContext в Direct2D
    Anonymous » » в форуме C++
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Direct2D вызывает предупреждения LiveObjects с D3D
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Получите 0x887a0022 для CreateHwndRenderTarget с помощью Direct2D в UWP.
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»