2013-11-28 81 views
3

在用於Windows Phone 8的混合Direct3D + Xaml應用程序(在Visual Studio中選擇項目類型時可在C++子樹中訪問)中,有一種笨拙的機制來重繪由DrawingSurfaceBackGroundGrid控件託管的視口。在項目模板中,這由什麼是用DrawingSurfaceBackgroundGrid重繪框架的正確技術? (DirectX + xaml應用程序)

IDrawingSurfaceRuntimeHostNative->RequestAdditionalFrame() 

調用從C++/CX端執行。這一方本身被XAML引擎稱爲做Draw。 這裏的問題有以下幾點:

  1. 似乎Direct3DContentProviderDraw方法是從Windows Phone應用程序的所謂的「成分」線程調用。這是對的嗎?
  2. 方法RequestAdditionalFrame()從WinRT組件調用 - 此調用是否跨越ABI(即創建特定於WinRT/COM的開銷)?
  3. 可以調用Draw方法以外的線程調用方法RequestAdditionalFrame()嗎?我測試了它,它並沒有使應用程序崩潰,但是它有一些評論。

回答

1

關於#3我發現RequestAdditionalFrame()會在當前頁面的圖面改變時崩潰。

我的情況如下:

當頁面正在發生變化,IDrawingSurfaceBackgroundContentProviderNative::Disconnect()從UI線程調用。當我在不同的線程中執行繪圖時,我在這裏等待關鍵部分RequestAdditionalFrame()完成。 在我的繪圖線程中,RequestAdditionalFrame()被稱爲臨界區。它崩潰在RequestAdditionalFrame()內部。

所以看起來Disconnect()之後 D3D(或內部)上下文中調用已被破壞,並避免競爭狀態的唯一途徑是這樣的場景,我看到 - 是「後」 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()上下文中執行。

+0

感謝您寶貴的意見,我對您的案例有一些疑問。 1)「頁面正在改變」是什麼意思?是關於你的當前DrawingSurface的完全破壞,所以你需要調用Connect來附加一個新的? 2)爲什麼我們需要等待'RequestAdditionalFrame'完成? 3)您已經重寫了您的繪圖代碼以在Draw上下文中執行,但是這是否意味着您的UI現在由於額外的渲染工作而變得不太敏感?你的情況看起來像「buggy併發代碼」,也許這是問題,而不是'RequestAdditionalFrame'? –

+0

(抱歉 - 發佈太早) 1.不完全。對不起,誤導你,我再次檢查,發現我的應用程序只有當Windows響應接近傳感器和變暗屏幕時崩潰。在這種情況下,調用Disconnect()。 2.我需要同步訪問'IDrawingSurfaceRuntimeHostNative'接口,因爲我在另一個線程中執行繪製。我不能只在'Disconnect()'中將它NULL,因爲同時可以調用RequestAdditionalFrame。 3.一切皆有可能,但我相信我找到了正確的理由。 – Zakhar

相關問題