Sto scrivendo un'app di ebook reader per Windows Store. Uso le catene di scambio Direct2D + DXGI per rendere le pagine dei libri sullo schermo.Multithreading Direct2D efficiente
Il contenuto del mio libro a volte è piuttosto complesso (geometria, bitmap, maschere, ecc.), Quindi può essere necessario fino a 100 ms per renderlo. Quindi sto cercando di eseguire un rendering off-screen su una bitmap in un thread separato, quindi mostrerò questa bitmap nel thread principale.
Tuttavia, non riesco a capire come farlo in modo efficiente.
Finora ho provato due approcci:
Utilizzare un unico
ID2D1Factory
con la bandiera D2D1_FACTORY_TYPE_MULTI_THREADED, creareID2D1BitmapRenderTarget
e utilizzarlo in thread in background per il rendering off-screen. (Questo richiede inoltreID2D1Multithread::Enter/Leave
sulle operazioniIDXGISwapChain::Present
). Il problema è che l'operazioneID2D1RenderTarget::EndDraw
nel thread in background richiede talvolta fino a 100 ms e il rendering del thread principale è bloccato per questo periodo a causa del blocco interno di Direct2D.Utilizzare un codice
ID2D1Factory
separato nella discussione in background (come descritto in http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering) e disattivare la sincronizzazione interna di Direct2D. In questo caso non c'è cross-locking tra due thread. Sfortunatamente, in questo caso non posso usare direttamente la bitmap risultante nel principaleID2D1Factory
, perché appartiene a una fabbrica diversa. Devo spostare i dati bitmap nella memoria della CPU, quindi copiarli nella memoria GPU del principaleID2D1Factory
. Questa operazione introduce anche ritardi significativi (credo che sia dovuto ad ampi accessi di memoria, ma non ne sono sicuro).
C'è un modo per farlo in modo efficiente?
P.S. Tutto il tempo qui è dato per tablet Acer Switch 10. Sul normale PC Core i7 entrambi gli approcci funzionano senza alcun ritardo visibile.