我正在使用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流?
答案 0 :(得分:1)
我建议在SDK之上创建您自己的简单Kinect管理器(这是我在其中一个项目中所做的)。
这个管理器可以是一个单独的对象,它可以侦听来自深度,颜色和骨架流的事件,只是将最新的可用帧保存到某些局部变量中(如果不需要,还可以优化和禁用某些流)
在您的XNA游戏循环中,您可以访问这些变量,并且您将获得最新的帧。在管理器写入变量时,需要进行一些线程同步以防止读取变量。
除此功能外,该经理还帮助我处理了Kinect传感器断开/重新连接的情况。管理器对象始终存在,而不是始终测试是否连接了传感器,但它不会在本地存储任何新帧。
当然,XNA游戏仍然可以处理断开/连接事件,以防它想要做一些特别的事情,但在游戏循环中我不必总是测试是否附加了有效的kinect传感器。