2

我正在使用带有 XNA Game Studio 4.0 的官方 Kinect SDK 1.6。

我想知道是否有人有一个很好的解决方法可以一次轮询所有帧,而不是以下:

ColorImageFrame cFrame = _Device.ColorStream.OpenNextFrame(100);
DepthImageFrame dFrame = _Device.DepthStream.OpenNextFrame(100);
SkeletonFrame sFrame = _Device.SkeletonStream.OpenNextFrame(100);

我宁愿不在我的循环中进行三个同步调用。我真的很希望有类似的东西,_Device.OpenAllFrames(100)但轮询方法似乎没有等效的 AllFramesReady 事件。

我无法切换到事件驱动方法,因为它并不真正适合 XNA。或者有没有人有更好的方法来访问 XNA 循环内的 Kinect 流?

4

1 回答 1

1

我建议在 SDK 之上制作您自己的简单 Kinect 管理器(这是我在我的一个项目中所做的)。

这个管理器可以是一个单例对象,它监听来自深度、颜色和骨架流的事件,并将最新的可用帧保存到一些局部变量中(如果不需要它们,您还可以优化和禁用一些流)

在您的 XNA 游戏循环中,您可以访问这些变量,您将获得最新的可用帧。需要一些线程同步来防止在管理器写入变量时读取变量。

除了这个功能,这个管理器还帮我处理了 Kinect 传感器断开/重新连接的情况。管理器对象不是总是测试传感器是否连接,而是始终存在,但它不会在本地存储任何新帧。

当然,如果 XNA 游戏想要做一些特别的事情,它仍然可以处理断开/连接事件,但是在游戏循环中我不必总是测试是否连接了有效的 kinect 传感器。

于 2013-05-25T20:19:24.957 回答