我的书籍内容有时相当复杂(几何、位图、掩模等),因此渲染可能需要高达100毫秒的时间。因此,我正在尝试在单独的线程中进行离屏渲染到位图,然后在主线程中仅显示该位图。
但是,我无法有效地解决这个问题。
到目前为止,我已经尝试了两种方法:
使用带有 D2D1_FACTORY_TYPE_MULTI_THREADED 标志的单个 ID2D1Factory,在后台线程中创建 ID2D1BitmapRenderTarget 并用于离屏渲染(这还需要在 IDXGISwapChain::Present 操作上使用 ID2D1Multithread::Enter/Leave)。问题是,后台线程中的 ID2D1RenderTarget::EndDraw 操作有时需要长达 100 毫秒,由于内部 Direct2D 锁定,主线程渲染会被阻塞。
在后台线程中使用单独的 ID2D1Factory(如 http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering 中所述),并关闭内部 Direct2D 同步。在这种情况下,两个线程之间没有交叉锁定。不幸的是,在这种情况下,我不能直接在主 ID2D1Factory 中使用生成的位图,因为它属于不同的工厂。我必须将位图数据移动到 CPU 内存,然后将其复制到主 ID2D1Factory 的 GPU 内存中。此操作也会引入显著的延迟(我认为这是由于大量的内存访问,但我不确定)。
有没有一种高效的方法来完成这个任务?
P.S. 这里的所有时间都是针对 Acer Switch 10 平板电脑的。在普通的 Core i7 PC 上,这两种方法都可以无延迟地工作。