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.

questionAnswers(2)

yourAnswerToTheQuestion