Для поддержки воспроизведения нескольких фильмов и записей мне нужно установить для 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 кадров) и экраны записи, естьразрыв между этими требованиями.Как мы можем добиться лучшей реализации?