使用DrawingSurfaceBackgroundGrid重绘框架的正确技术是什么? (DirectX + xaml应用程序)

时间:2013-11-28 06:27:14

标签: c++ xaml windows-phone-8 windows-runtime directx

在Windows Phone 8的混合Direct3D + Xaml应用程序中(在Visual Studio中选择项目类型时可在C ++子树中访问),有一种笨拙的机制可以重绘由DrawingSurfaceBackGroundGrid控件托管的视口。在项目模板中,这由

完成
IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame()

从C ++ / CX方面调用。 XAML引擎本身调用此方来执行Draw。 这里的问题如下:

  1. 似乎Draw的{​​{1}}方法是从所谓的" Composition" Windows Phone应用程序的主题。这是对的吗?
  2. 从WinRT组件调用方法Direct3DContentProvider - 此调用是否跨越ABI(即创建特定于WinRT / COM的开销)?
  3. 可以从调用RequestAdditionalFrame()方法的线程以外的线程调用方法RequestAdditionalFrame()吗?我对它进行了测试,并没有使应用程序崩溃,但是对此有一些评论可以。

1 个答案:

答案 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()上下文中执行。