2011-06-08 84 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