hwe*_*eom 7 multithreading direct2d
我正在为Windows Store编写电子书阅读器应用程序.我正在使用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直接在main中使用结果位图,因为它属于不同的工厂.我必须将位图数据移动到CPU内存,然后将其复制到主内存的GPU内存中ID2D1Factory.这个操作也引入了显着的滞后(我认为这是由于大量的内存访问,但我不确定).
有没有办法有效地做到这一点?
PS此处的所有时间均为Acer Switch 10平板电脑.在常规的Core i7 PC上,两种方法都可以在没有任何明显滞后的情
好的,我找到了解决方案.
基本上,我需要的是修改方法2以在两个DirectX工厂集之间使用DXGI资源共享.我将跳过所有的血腥细节(可以在这里找到:http://xboxforums.create.msdn.com/forums/t/66208.aspx),但基本步骤是:
ID3D11Device2从主资源集,创建由D3D 2D纹理CreateTexture2D D3D11_BIND_RENDER_TARGET,D3D11_BIND_SHADER_RESOURCE,D3D11_RESOURCE_MISC_SHARED_NTHANDLE和D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX标志.IDXGIResource1并CreateSharedHandle使用XGI_SHARED_RESOURCE_READ和从中调用来获取它的共享句柄DXGI_SHARED_RESOURCE_WRITE.ID3D11Device2::OpenSharedResource1.IDXGIKeyedMutex::AcquireSync)的键控互斥锁ID2D1Factory2::CreateDxgiSurfaceRenderTarget,从中创建渲染目标(),在其上绘制并释放互斥(IDXGIKeyedMutex::ReleaseSync).请注意,互斥锁定是必要的.不这样做会导致一些神秘的DirectX调试错误消息,以及错误的操作甚至崩溃.