IOS / MultipeerConnectivity / SendData和ReceiveData之间的延迟

时间:2016-08-04 10:02:46

标签: ios objective-c iphone delay multipeer-connectivity

我有一个游戏,使用Multipeer senddata每隔0.05秒在一个mutablearray中发送一个玩家位置x,position.y和角度。

NSMutableArray *Messagee = [[NSMutableArray alloc] initWithCapacity:10];
[Messagee addObject:x];
[Messagee addObject:y];
[Messagee addObject:ang];


NSData* Message = [NSKeyedArchiver archivedDataWithRootObject:Messagee];
dispatch_async(dispatch_get_main_queue(), ^(void) {  
[self.partyTime sendData:Message
                withMode:MCSessionSendDataUnreliable
                   error:nil];      
});

其他玩家使用

获取数据
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID;

我遇到的问题是,didrecievedata被称为非常不规则,因为它应该每0.05秒调用一次(我每隔0.05秒发送一次数据)。

我在两个测试数据之间的延迟上升到0.20秒之间存在巨大差异,接着是下一个数据包的0.00001秒。

我需要0.05秒的常数didrecievedata等于来自其他玩家的senddata来同步玩家位置。

有没有办法在senddata和recievedata之间有一点延迟?例如Ping等于Ping?

我发送的数据(NSMutablearray)是否为big - >延迟

我应该使用Streams吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

通过开放网络发送的任何内容都会遇到不规则的延迟,具体取决于网络的繁忙程度以及有多少干扰。这是你需要处理的事情。

通常有两种方法可以用来处理,选择最适合您应用的方法:

  1. 在邮件中加上一个时间戳,让接收方直接处理它们,但是使用时间戳知道每条消息的使用时间,并将逻辑调整为该值。
  2. 在接收方引入固定延迟,大致等于最长的预期延迟。然后对收到的消息进行排队,并以常规速率将它们转发给应用程序的其余部分。
  3. 在任何一种情况下,您都需要为丢弃的消息做好准备。