注意:通常情况下,连续的帧会有连续的 ID 值。但是某些情况下有些帧 ID 会被跳过。在资源首先的电脑上,LeapMotion 软件会丢弃一些帧。此外,当软件进入有红外补偿照明的鲁棒模式时,每个帧的两个帧都会被分析。连续的 Frame 对象 ID 每一次都会加二。还有,如果你使用 Listener 回调获取帧,那么回调函数的在第一次调用返回前不会被调用。因此你的应用会丢失一些回调函数长时间处理的帧。这种情况下,丢失的真会被插入到历史缓存中。
使用监听器回调是非常复杂的,因为回调涉及到多线程。每次回调都是在一个独立的线程上被调用。你必须确保以线程安全的方式处理任何有多个线程访问的应用程序数据。即便从 API 获得的数据对象是线程安全的,但其他部分可能并不是这样。一个常见的问题就是只能通过只能有特定线程修改的GUI层来更新拥有的对象。在这种情况下,你必须为将你应用做特别的处理,将非线程安全的部分从适当的线程进行更新,而不是回调函数。
#Average a finger position for the last 10 frames
count = 0
average = Leap.Vector()
finger_to_average = frame.fingers[0]
for i in range(0,9):
finger_from_frame = controller.frame(i).finger(finger_to_average.id)
if(finger_from_frame.is_valid):
average = average + finger_from_frame.tip_position
count += 1
average = average/count