gpt4 book ai didi

multithreading - 高效的 Direct2D 多线程

转载 作者:行者123 更新时间:2023-12-04 11:49:55 28 4
gpt4 key购买 nike

我正在为 Windows 应用商店编写一个电子书阅读器应用程序。我正在使用 Direct2D + DXGI 交换链在屏幕上呈现书页。

我的图书内容有时非常复杂(几何、位图、蒙版等),因此渲染它可能需要长达 100 毫秒的时间。所以我试图在单独的线程中对位图进行屏幕外渲染,然后在主线程中显示该位图。

但是,我无法弄清楚如何有效地做到这一点。

到目前为止,我已经尝试了两种方法:

  • 使用单个 ID2D1Factory使用 D2D1_FACTORY_TYPE_MULTI_THREADED 标志,创建 ID2D1BitmapRenderTarget并在后台线程中使用它进行离屏渲染。 (这在 ID2D1Multithread::Enter/Leave 操作上还需要 IDXGISwapChain::Present)。问题是,ID2D1RenderTarget::EndDraw后台线程中的操作有时需要长达 100 毫秒,并且由于内部 Direct2D 锁定,主线程渲染在此期间被阻塞。
  • 使用单独的 ID2D1Factory在后台线程中(如 http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering 中所述)并关闭内部 Direct2D 同步。在这种情况下,两个线程之间没有交叉锁定。不幸的是,在这种情况下,我不能在主 ID2D1Factory 中使用生成的位图。直接,因为它属于不同的工厂。我必须将位图数据移动到 CPU 内存,然后将其复制到主 ID2D1Factory 的 GPU 内存中.此操作还引入了显着的滞后(我认为这是由于大量内存访问,但我不确定)。

  • 有没有办法有效地做到这一点?

    附言这里的所有时间都是针对 Acer Switch 10 平板电脑给出的。在普通的 Core i7 PC 上,这两种方法都可以正常工作,没有任何明显的延迟。

    最佳答案

    好的,我找到了解决方案。

    基本上,我所需要的只是修改方法 2 以在两个 DirectX 工厂集之间使用 DXGI 资源共享。我将跳过所有血腥的细节(它们可以在这里找到:http://xboxforums.create.msdn.com/forums/t/66208.aspx),但基本步骤是:

  • 创建两组 DirectX 资源:主要(用于屏幕渲染)和次要资源(用于屏幕外渲染)。
  • 使用 ID3D11Device2从主要资源集中,通过 CreateTexture2D 创建 D3D 2D 纹理D3D11_BIND_RENDER_TARGET , D3D11_BIND_SHADER_RESOURCE , D3D11_RESOURCE_MISC_SHARED_NTHANDLED3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX旗帜。
  • 通过将其强制转换为 IDXGIResource1 来从中获取共享句柄并调用 CreateSharedHandle从它与 XGI_SHARED_RESOURCE_READDXGI_SHARED_RESOURCE_WRITE .
  • 通过调用 ID3D11Device2::OpenSharedResource1 在后台线程中设置的辅助资源中打开此共享纹理.
  • 获取此纹理的键控互斥锁 ( IDXGIKeyedMutex::AcquireSync ),从中创建渲染目标 ( ID2D1Factory2::CreateDxgiSurfaceRenderTarget ),在其上绘制并释放互斥锁 ( IDXGIKeyedMutex::ReleaseSync )。
  • 在主线程上,在主资源集中,获取互斥锁并从步骤2中创建的纹理创建共享位图,绘制该位图,然后释放互斥锁。

  • 请注意,互斥锁的东西是必要的。不这样做会导致一些神秘的 DirectX 调试错误消息、错误操作甚至崩溃。

    关于multithreading - 高效的 Direct2D 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143589/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com