Direct3D: эффективный способ получения битовой карты системной памяти из IDirect3DSurface9 (пул по умолчанию)?

У меня есть IDirect3DSurface9, пул по умолчанию, формат YUV. Как я могу эффективно получить из него биты растрового изображения? На данный момент я:

    создаю цель рендера:
    device->CreateRenderTarget(surf_desc.Width, surf_desc. Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
    конвертирую YUV в RGB32:
    device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
    (полный прямоугольник, без растяжения)
    создаем обычную внеэкранную поверхность в системной памяти
    device->CreateOffscreenPlainSurface(surf_desc. Width, surf_desc. Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
    копируем данные из видеопамяти в системную память:
    device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
    GetDC с поверхности оффскрина, создаем совместимый DC и совместимый битмап, BitBlt с оффскрин sufrace DC на совместимый DC и копируем биты битмапа в мой буфер с помощью GetDIBits()

это выглядит немного накладным, из-за стольких копирований: с оригинальной поверхности на цель рендеринга, затем на внеэкранную поверхность, затем на совместимый битмап, и наконец в мой буфер. Как это можно улучшить?

спасибо

5
задан Andriy Tylychko 13 December 2010 в 15:08
поделиться