2011-06-08 66 views
13

我正在寫一個C#應用程序,它使用Kinect,我正在將輸出結果寫入Shader資源並將其渲染爲紋理,我的問題是Kinect(顯然)只運行在30fps,所以它嚴重扼殺了我的表現。使用Kinect進行線程處理

克服這個問題的最好方法是多線程嗎? 是否有某種設計模式可以幫助解決這類問題? 據我可以告訴我可能想要處理線程上的數據,然後在過程完成時訪問它,但我不知道以安全的方式從那開始。

感謝您提供任何建議。

我目前使用OpenNI作爲kinect drivers/api,SlimDX作爲directX渲染的一面。

+0

我與Kinect的沒有經驗,但如果花費的時間來處理數據,然後將數據應該在一個單獨的,而不是UI線程處理的顯著量。你可以嘗試[BackgroundWorker Class](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)。 – Centro 2011-06-08 11:05:47

回答

8

我之前沒有使用過Kinect,也沒有指定使用哪種驅動程序/包裝,但我懷疑它可能無所謂。

什麼,你可能需要做的是以下幾點:

  1. 單獨的「更新」爲Kinect的週期到它自己的線程。這將使您的應用程序邏輯儘可能快地運行,而不會停止等待來自kinect硬件的更新。
  2. 當kinect填入新數據時,您需要「鎖定」每次通過時的圖像/深度數據。
  3. 如果Kinect填充數據的過程需要兩個長時間,如果驅動程序尚未這樣做,則可以嘗試緩存圖像和深度數據。這意味着只需將兩個副本保存在內存中,並在另一個寫入時讀取一個副本。

對於c#中的線程優秀教程,我總是推薦Albahari's Threading in C#。我還建議如果你想了解你可以做什麼來加快你的應用程序的更具體的信息,你應該編輯你的問題,並添加有關具體如何現在結構和你使用什麼包裝/驅動程序等的細節。

+0

感謝您的迴應,當我執行此操作時,如果有人遇到此問題,我會針對自己的操作拋出一些代碼。 – Craig 2011-06-13 10:51:19

1

任何使用Kinect開發的需要高性能的開發應使用池模型來代替事件模型。與此相輔相成的是,您最好的選擇是打開一個線程並進行池化操作。 您可以在事件模型中使用太多的線程,以進行長時間的操作並且不凍結用戶界面。

你可以看到這一點:http://msdn.microsoft.com/en-us/library/hh973076