在Windows Phone 8的混合Direct3D + Xaml应用程序中(在Visual Studio中选择项目类型时可在C ++子树中访问),有一种笨拙的机制可以重绘由DrawingSurfaceBackGroundGrid
控件托管的视口。在项目模板中,这由
IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame()
从C ++ / CX方面调用。 XAML引擎本身调用此方来执行Draw
。
这里的问题如下:
Draw
的{{1}}方法是从所谓的" Composition" Windows Phone应用程序的主题。这是对的吗?Direct3DContentProvider
- 此调用是否跨越ABI(即创建特定于WinRT / COM的开销)?RequestAdditionalFrame()
方法的线程以外的线程调用方法RequestAdditionalFrame()
吗?我对它进行了测试,并没有使应用程序崩溃,但是对此有一些评论可以。答案 0 :(得分:1)
关于#3我发现当带有drawingurface的当前页面正在发生变化时,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()上下文中执行。