Multithreading eficiente do Direct2D
Estou escrevendo um aplicativo de leitor de e-book para a Windows Store. Estou usando as cadeias de troca Direct2D + DXGI para renderizar as páginas dos livros na tela.
Às vezes, o conteúdo do meu livro é bastante complexo (geometria, bitmaps, máscaras etc.), portanto, pode demorar até 100 ms para renderizá-lo. Então, eu estou tentando fazer uma renderização fora da tela para um bitmap em um thread separado e depois mostrar esse bitmap no thread principal.
No entanto, não consigo descobrir como fazê-lo com eficiência.
Até agora, tentei duas abordagens:
Use um únicoID2D1Factory
com o sinalizador D2D1_FACTORY_TYPE_MULTI_THREADED, crieID2D1BitmapRenderTarget
e use-o no thread de segundo plano para renderização fora da tela. (Isso requer adicionalmenteID2D1Multithread::Enter/Leave
emIDXGISwapChain::Present
operações). O problema é,ID2D1RenderTarget::EndDraw
a operação no encadeamento em segundo plano às vezes leva até 100ms, e a renderização do encadeamento principal é bloqueada nesse período devido ao bloqueio interno do Direct2D.
Use umID2D1Factory
no encadeamento em segundo plano (como descrito emhttp://www.sdknews.com/ios/using-direct2d-for-server-side-rendering) e desative a sincronização interna do Direct2D. Não há travamento cruzado entre dois threads neste caso. Infelizmente, neste caso, não posso usar o bitmap resultante nas principaisID2D1Factory
diretamente, porque pertence a uma fábrica diferente. Eu tenho que mover dados de bitmap para a memória da CPU e copiá-los na memória da GPU do principalID2D1Factory
. Essa operação também apresenta atrasos significativos (acredito que seja devido a grandes acessos à memória, mas não tenho certeza).
Existe uma maneira de fazer isso de forma eficiente?
P.S. Todo o tempo aqui é dado para o Acer Switch 10 tablet. No PC Core i7 comum, ambas as abordagens funcionam sem nenhum atraso visível.