使用Kinect进行线程处理

时间:2011-06-08 09:42:01

标签: c# multithreading slimdx kinect openni

我正在编写一个使用Kinect的C#应用​​程序,我正在获取当前的输出并将其写入着色器资源并将其渲染为纹理,我的问题是Kinect(显然)仅以30fps运行,所以它严重限制了我的表现。

解决这个问题的最佳方法是多线程吗? 是否有某种设计模式可以帮助解决这类问题? 据我所知,我可能希望让kinect处理线程上的数据,然后在进程完成时访问它,但我不知道从哪里开始以安全的方式。

感谢您提供任何建议。

我目前正在使用OpenNI作为kinect驱动程序/ api,而SlimDX则用于渲染的directX端。

2 个答案:

答案 0 :(得分:8)

我之前没有使用过Kinect,你没有指定你使用的驱动程序/包装器,但我怀疑它可能无关紧要。

您可能需要做的是以下内容:

  1. 将Kinect的“更新”周期分隔到它自己的线程上。这将使您的应用程序逻辑可以尽可能快地运行,而不会停止等待来自kinect硬件的更新。
  2. 当kinect填写新数据时,您需要“锁定”每次传递的图像/深度数据。
  3. 如果Kinect填充数据的过程耗时两年,您可以尝试缓存图像和深度数据(如果驱动程序尚未执行此操作)。这意味着只需将两个副本保留在内存中,然后在另一个副本写入时读取一个副本。
  4. 有关c#中线程的优秀教程,我总是建议Albahari's Threading in C#。我还建议,如果您想了解更多关于如何加速应用程序的具体信息,您应该编辑您的问题并添加具体的详细信息,了解您现在的结构以及您正在使用的包装/驱动程序等。< / p>

答案 1 :(得分:1)

任何需要高性能的Kinect开发都应该使用池化模型代替事件模型。与此相辅相成,您最好的选择是打开一个线程并进行池化操作。 您可以使用具有事件模型的线程来进行长时间操作而不冻结用户界面。

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