2010-06-14 44 views
9

我正在使用GameKit添加点对点蓝牙到iPhone拍摄模式,因此速度至关重要。我每次发送大约40条消息,其中大部分使用速度更快的GKSendDataUnreliable,全部使用NSCoding进行序列化。在3G和3GS之间进行测试时,这会使3G的速度比我想要的慢很多。我想知道我应该集中精力加快速度。iPhone:哪些是加速蓝牙最有用的技术?

GKSendDataReliable慢多少?对于具有的少数数据包,如果发送GKSendDataUnreliable并让对等方发送确认,那么如果我在100ms内没有得到Ack,我可以再发送一次?

使用常规C数组创建NSData实例而不是使用NSCoding协议进行归档会快多快?这个序列化过程(对于大约十几个浮点数)就像您期望从对象创建/释放开销期望的那样缓慢,还是发生特别缓慢的事情?我发现(例如)发送四个单独的数据集要比发送一个四倍大小的数据要慢得多。通过发送单独的数据包,当它们在同一时间发生时不会总是一起放在同一个数据包中,我能否通过发送单独的数据包来实现显着的节省?

有没有其他的蓝牙性能秘密我错过了?

感谢您的帮助。

回答

8

我不是蓝牙专家,但一般使用可靠性发送数据是发送数据不可靠的1.5倍速度。我会避免尝试使用不可靠的方法发回ACK,因为那样您将不得不放入各种荒谬的逻辑来检测ACK是否未能到达,这会比使用可靠的发送缓慢得多。

发送数据的延迟时间很长,这意味着发送4个小数据包比发送1个数据包的4倍大小的有效负载需要更多的时间。任何时候您可以增加有效负载大小以减少发送数量,您将获得性能优势。

如果你知道你发送和接收的数据的大小和形状,你也可以通过发送字节数组或数组数组而不是使用NSCoding来挤出一些性能,因为NSCoding将消耗一些时间序列化和反序列化(如果你只是发送数组,那么你可以跳过这一步),NSCoder发送的数据量将比使用原始数组的时候多一些。