Multihilo Direct2D eficiente

Estoy escribiendo una aplicación de lector de libros electrónicos para la Tienda Windows. Estoy usando cadenas de intercambio Direct2D + DXGI para representar las páginas del libro en la pantalla.

El contenido de mi libro a veces es bastante complejo (geometría, mapas de bits, máscaras, etc.), por lo que puede tomar hasta 100 ms para representarlo. Así que estoy tratando de hacer una representación fuera de la pantalla en un mapa de bits en un hilo separado, y luego solo mostrar este mapa de bits en el hilo principal.

Sin embargo, no puedo entender cómo hacerlo de manera eficiente.

Hasta ahora he probado dos enfoques:

Usa un soloID2D1Factory con el indicador D2D1_FACTORY_TYPE_MULTI_THREADED, creeID2D1BitmapRenderTarget y úselo en hilo de fondo para renderizar fuera de pantalla. (Esto además requiereID2D1Multithread::Enter/Leave enIDXGISwapChain::Present operaciones). El problema es,ID2D1RenderTarget::EndDraw la operación en el subproceso en segundo plano a veces demora hasta 100 ms, y la representación del subproceso principal se bloquea durante este período debido al bloqueo interno de Direct2D.

Use un separadoID2D1Factory en hilo de fondo (como se describe enhttp://www.sdknews.com/ios/using-direct2d-for-server-side-rendering) y apague la sincronización interna de Direct2D. No hay bloqueo cruzado entre dos hilos en este caso. Desafortunadamente, en este caso no puedo usar el mapa de bits resultante en mainID2D1Factory directamente, porque pertenece a una fábrica diferente. Tengo que mover los datos de mapa de bits a la memoria de la CPU, luego copiarlos en la memoria de la GPU del principalID2D1Factory. Esta operación también introduce retrasos significativos (creo que se debe a grandes accesos a la memoria, pero no estoy seguro).

¿Hay alguna manera de hacer esto de manera eficiente?

PD Todos los tiempos aquí se dan para la tableta Acer Switch 10. En la PC Core i7 normal, ambos enfoques funcionan sin ningún retraso visible.

Respuestas a la pregunta(2)

Su respuesta a la pregunta