我使用Direct2D渲染我的用户界面。
我想要的是更容易分析我的ui渲染(因为我使用图形调试器使用多个面板有点麻烦)。
由于我知道Direct2D使用Direct3D设备(完全是使用10_0功能级别的d3d11设备),我想知道是否可以从ID2D1RenderTarget或ID2D1Factory对象检索ID310Device或ID3D11Device实例
在这种情况下,我可以轻松地在BeginDraw / EndDraw调用上附加时间戳查询。
我尝试了几个QueryInterface调用,但到目前为止它们都没有成功。
答案 0 :(得分:1)
一个有趣的未记载的秘密是,ID2D1RenderTarget
获得的任何ID2D1Factory
也将是ID2D1DeviceContext
(它似乎是故意从我收集到的,只是意外没有记录?)。只需致电IUnknown::QueryInterface()
即可。从那里你可以玩弄GetDevice()
和GetTarget()
等方法。如果您可以获得目标,那么您可以狡猾地获得支持IDXGISurface
https://msdn.microsoft.com/en-us/library/windows/desktop/bb174529(v=vs.85).aspx的IDXGIDeviceSubObject::GetDevice()
(我还没有对此部分进行验证)
在Win10中看起来ID2D1Device2
可以准确地为您提供所需内容:GetDxgiDevice()
https://msdn.microsoft.com/en-us/library/windows/desktop/dn917489(v=vs.85).aspx。因此,在这种情况下,ID2D1RenderTarget
通过ID2D1DeviceContext
投放到IUnknown::QueryInterface()
,然后通过ID2D1Device
获得ID2D1DeviceContext::GetDevice()
,然后将其转换为ID2D1Device2
{1}}通过另一次调用IUnknown::QueryInterface()
。