RequestAdditionalFrame

RequestAdditionalFrame

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

IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame()

从C++ / CX端执行的调用。 XAML引擎本身会调用此端来执行Draw
这里的问题如下:
  • 似乎是从Windows Phone应用程序的所谓“撰写”线程中调用了DrawDirect3DContentProvider方法。这是正确的吗?
  • 方法从WinRT组件调用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/

    10-09 01:10