私はWindowsストア用の電子ブックリーダーアプリケーションを作成しています。私はDirect2D + DXGIのスワップチェーンを使って画面上のブックページをレンダリングしています。効率的なDirect2Dマルチスレッド
私の書籍のコンテンツは時には非常に複雑(ジオメトリ、ビットマップ、マスクなど)なので、レンダリングには最大100ミリ秒かかることがあります。だから、別のスレッドでビットマップにオフスクリーンレンダリングを実行しようとしているし、メインスレッドでこのビットマップを表示するだけです。
しかし、私はそれを効率的に行う方法を理解することはできません。
は、これまでのところ私は2つのアプローチを試してみた:
は、D2D1_FACTORY_TYPE_MULTI_THREADEDフラグで単一
ID2D1Factory
を使用ID2D1BitmapRenderTarget
を作成し、オフスクリーンレンダリングのためのバックグラウンドスレッドでそれを使用しています。 (これにはさらに、IDXGISwapChain::Present
の操作でID2D1Multithread::Enter/Leave
が必要です)。問題は、バックグラウンドスレッドでID2D1RenderTarget::EndDraw
の操作が最大100msかかることがあり、内部Direct2Dロッキングのためにメインスレッドレンダリングがこの期間中ブロックされることです。バックグラウンドスレッドで(http://www.sdknews.com/ios/using-direct2d-for-server-side-renderingに記載されているように)個別の
ID2D1Factory
を使用し、内部Direct2D同期をオフにします。この場合、2つのスレッド間にはクロスロックはありません。残念ながら、このケースでは、別のファクトリに属しているため、メインビットID2D1Factory
で結果のビットマップを直接使用することはできません。ビットマップデータをCPUメモリに移動してから、メインのID2D1Factory
のGPUメモリにコピーする必要があります。この操作でも大きな遅延が発生します(大きなメモリアクセスが原因と思われますが、わかりません)。
これを効率的に行う方法はありますか?
P.S.ここのタイミングはすべてAcer Switch 10タブレットに与えられています。通常のCore i7 PCでは、両方のアプローチが目に見える遅れなく動作します。