我正在用C#编写一个Kinect WPF应用程序来向aLinux C++应用程序发送手势命令。
我的问题是,当Linux应用程序的帧率低于Kinect的帧率(25fps)时,它开始注册命令的速度非常慢。轮换将在信息发送后5秒左右发生。从这一点上,我感觉就像是它清空了一些数据包队列,因为它们被备份得非常慢。
由于在Linux端渲染的模型复杂度增加,帧速率下降。
在每个渲染帧中,我通过select()和recvfrom()检查是否在大约1ms内接收到任何数据包,然后对其进行解析。然后更新世界的场景图。在Kinect端,当手势数据被识别时,以稳定的25fps运行是发送手势数据的数据包。
为什么Linux FPS < Kinect FPS会有严重的延迟?它似乎正在执行所有的命令,只是在一个实时应用程序的显着延迟。
另外,有什么可能的解决方案来缓解这种延迟?
我认为延迟是由于Linux无法处理所有传入的数据包造成的,因此数据包会排队。然而,我不确定为什么尽管从技术上讲它每帧读取1个数据包,但仍然有几秒钟没有更新。
这是一个代码片段。
(每帧执行一次)
tv.tv_sec = 0;
tv.tv_usec = 1*1000
//BLOCKING 1ms
retval = select(sfd+1, &fds, NULL, NULL, &tv);
if (retval < 0) {
perror("select");
} else if (retval) {
int n = recvfrom(sfd, recvbuf, 1024, 0, (struct sockaddr *)&caddr, &len);
parse_command(recvbuf);
}//在此之后,它开始更新/转换世界/场景
谢谢!
发布于 2011-08-11 19:37:02
有什么可能的解决方案来缓解这种延迟?
一种非常简单的方法是使用确认数据包。发送一堆消息(直到选定的阈值,例如,1秒的价值)。只要收到确认数据包,您就会继续发送有关Kinect上正在发生的事情的数据包。如果您没有收到任何确认(因此您的Linux应用程序运行得稍微慢了一点),那么您将丢弃数据,直到它跟上为止(您会因为ACK数据包而知道)。
为什么Linux FPS < Kinect FPS会有严重的延迟?它似乎正在执行所有的命令,只是在一个实时应用程序的显着延迟。
这与你的代码的方式和你如何执行它有关。如果没有关于你的parse_command()函数的任何信息,我们将不知道是什么。是的,您正在执行所有命令,但执行这些命令的时间太长。在25帧/秒的速度下,你有40毫秒的时间开始看到延迟。在这段时间内,您需要完成所有的解析、渲染和命令工作。
我认为延迟是由于Linux无法处理所有传入的数据包造成的,所以数据包会被排队。然而,我不确定为什么尽管从技术上讲它每帧读取1个数据包,但仍然有几秒钟没有更新。
请不要在没有做一些研究和有一些确凿证据的情况下对软件(或一般情况下的任何事情)做出假设。Linux完全能够通过网络接收大量数据。事实上,它的性能非常好,一次可以接收千兆位的数据。问题出在您的客户端代码,而不是内核。
https://stackoverflow.com/questions/7024910
复制相似问题