Как улучшить скорость рендеринга Direct2D под DPI - PullRequest
0 голосов
/ 15 октября 2018

Для поддержки воспроизведения нескольких фильмов и записей мне нужно установить для ID2D1HwndRenderTarget значение D2D1_RENDER_TARGET_TYPE_SOFTWARE (см. https://docs.microsoft.com/en-us/windows/desktop/Direct2D/resources-and-resource-domains#sharing_render_target_resources),, но тест «Моя локальная машина» (CPU i7-7710, 16G, Geforce GTX1060 6GB) обнаружил, чтоузкое место производительности рисования ("_ pRenderTarget-> EndDraw ()") относительно высокое:

HRESULT CD2D1Context::Present()
{
    if (!_pRenderTarget || !_pBackRenderTarget)
    {
        return E_FAIL;
    }
    CComPtr<ID2D1Bitmap> pBackBitmap;
    HRESULT hr = _pBackRenderTarget->GetBitmap(&pBackBitmap);
    if (FAILED(hr))
    {
        return hr;
    }
    _pRenderTarget->BeginDraw();
    _pRenderTarget->Clear(D2D1::ColorF(1.0f, 1.0f, 1.0f, 1.0f));
    D2D1_SIZE_F sizeF = pBackBitmap->GetSize();
    _pRenderTarget->DrawBitmap(pBackBitmap, D2D1::RectF(0, 0, sizeF.width, sizeF.height));
    hr = _pRenderTarget->EndDraw();
    if (hr == D2DERR_RECREATE_TARGET)
    {
        hr = S_OK;
        DiscardDeviceResources();
    }
    return hr;

}

  • , если вы не включаете DPI, но используете D2D1_RENDER_TARGET_TYPE_SOFTWARE, затемРендеринг займет немного времени, около 0-16 миллисекунд (используйте GetTickCount64).
  • , если вы включите высокий DPI (например, 384) и D2D1_RENDER_TARGET_TYPE_HARDWARE (что означает, что снимки экрана не поддерживаются), потребление рендера также мало,около 0-16 миллисекунд.
  • , если вы включите DPI (например, значение 144) и D2D1_RENDER_TARGET_TYPE_SOFTWARE, это займет около 70-100 миллисекунд.
  • Поскольку необходимо реализовать функциюВключение DPI и воспроизведение видеофайлов (возможно, 30 кадров) и экраны записи, естьразрыв между этими требованиями.Как мы можем добиться лучшей реализации?
...