在Windows Phone 8的Direct3D + Xaml混合应用程序中(在Visual Studio中选择一种类型的项目时,可以在C++子树中访问),有一个笨拙的机制来重绘DrawingSurfaceBackGroundGrid
控件托管的视口(viewport)。在项目模板中,这是通过
IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame()
从C++ / CX端执行的调用。 XAML引擎本身会调用此端来执行
Draw
。这里的问题如下:
Draw
的Direct3DContentProvider
方法。这是正确的吗? RequestAdditionalFrame()
-此调用是否跨ABI(即,创建特定于WinRT / COM的开销)? RequestAdditionalFrame()
方法的线程之外的线程中调用Draw
方法吗?我对其进行了测试,它不会使应用程序崩溃,但是可以对此发表一些评论。 最佳答案
关于#3,我发现当当前带有drawingsurface的页面更改时,RequestAdditionalFrame()
可能崩溃。
我的情况如下:
当页面更改时,从UI线程调用IDrawingSurfaceBackgroundContentProviderNative::Disconnect()
。当我在不同的线程中执行绘图时,我在这里等待关键部分以完成RequestAdditionalFrame()
。
在我的绘图线程中,在保留关键部分的情况下调用了RequestAdditionalFrame()
。它崩溃在RequestAdditionalFrame()
内部。
因此,看起来在D3D(或任何内部)上下文被破坏之后,调用了Disconnect()
,并且避免竞争情况的唯一方法是我看到的这种情况-是将“RequestAdditionalFrame”消息从绘图线程“发布”到UI线程。但是在Windows Phone 8平台中,后者需要.NET WinRT编码(请参见http://robwirving.com/2013/07/17/guide-to-getting-to-the-ui-thread-for-any-type-of-windows-phone-8-app/)
对我来说,重写绘图代码更加容易,因此可以在Draw()上下文中执行。
关于c++ - 用DrawingSurfaceBackgroundGrid重画框架的正确技巧是什么? (DirectX + XAML应用程序),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20259166/