使用DrawingSurfaceBackgroundGrid重画框架的正确技术是什么?(DirectX和xaml应用程序) < P>在Windows 8的混合Direct3D + XAML应用程序中(在Visual Studio中选择项目类型时,在C++子树中访问)有一个尴尬的机制,即重新绘制由 DePrimeSureBeSeBurdGeals控件托管的视图。在项目模板中,这是由 IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame()

使用DrawingSurfaceBackgroundGrid重画框架的正确技术是什么?(DirectX和xaml应用程序) < P>在Windows 8的混合Direct3D + XAML应用程序中(在Visual Studio中选择项目类型时,在C++子树中访问)有一个尴尬的机制,即重新绘制由 DePrimeSureBeSeBurdGeals控件托管的视图。在项目模板中,这是由 IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame(),c++,xaml,windows-phone-8,windows-runtime,directx,C++,Xaml,Windows Phone 8,Windows Runtime,Directx,从C++/CX端调用。XAML引擎本身调用此端来执行绘制。 这里的问题如下: 似乎Direct3DContentProvider的Draw方法是从Windows Phone应用程序的所谓“合成”线程调用的。对吗 方法RequestAdditionalFrame()是从WinRT组件调用的-此调用是否跨ABI(即创建特定于WinRT/COM的开销) 方法RequestAdditionalFrame()是否可以从调用Draw方法以外的线程调用?我测试了它,它没有崩溃的应用程序,但有一些评论,它可以

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

  • 似乎
    Direct3DContentProvider
    Draw
    方法是从Windows Phone应用程序的所谓“合成”线程调用的。对吗
  • 方法
    RequestAdditionalFrame()
    是从WinRT组件调用的-此调用是否跨ABI(即创建特定于WinRT/COM的开销)
  • 方法
    RequestAdditionalFrame()
    是否可以从调用
    Draw
    方法以外的线程调用?我测试了它,它没有崩溃的应用程序,但有一些评论,它可以
  • 关于#3,我发现当带有drawingsurface的当前页面发生更改时,
    RequestAdditionalFrame()
    可能会崩溃

    我的情况如下:

    更改页面时,将从UI线程调用IDrawingSurfaceBackgroundContentProviderNative::Disconnect()。当我在不同的线程中执行绘图时,我在这里的关键部分等待
    RequestAdditionalFrame()
    完成。 在我的绘图线程中,
    RequestAdditionalFrame()
    被调用,并保留临界部分。它崩溃了一些在
    RequestAdditionalFrame()
    内的文件

    所以它看起来像是在D3D(或任何内部)上下文被破坏后调用的
    Disconnect()
    ,避免争用条件的唯一方法是我看到的这种情况-是从绘图线程向UI线程“post”RequestAdditionalFrame消息。但在Windows Phone 8平台中,后者需要.NETWinRT编组(请参见示例)


    对我来说,重写绘图代码更容易,因此可以在Draw()上下文中执行。

    感谢您的宝贵意见,我对您的案例有一些问题。1) 你说的“页面在变化”是什么意思?这是因为您完全破坏了当前DrawingSurface,所以需要调用Connect来附加一个新的吗?2) 为什么我们需要等待
    RequestAdditionalFrame
    完成?3) 您已经重写了绘图代码以在绘图上下文中执行,但这是否意味着由于要渲染的额外工作,现在的UI响应性变差了?您的案例看起来像是“错误的并发代码”,可能这就是问题所在,而不是关于
    RequestAdditionalFrame
    ?(抱歉,发布得太早)1。不完全是。很抱歉误导您,我再次检查,发现我的应用程序只有在windows对接近传感器做出反应并使屏幕变暗时才会崩溃。在这种情况下,将调用
    Disconnect()
    。2.我需要同步对
    IDrawingSurfaceRuntimeHostNative
    接口的访问,因为我正在另一个线程中执行绘制。我不能在'Disconnect()'中将其置空,因为同时可以调用
    RequestAdditionalFrame
    。3.一切皆有可能,但我相信我已经正确地找到了原因。