2010-06-14 45 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發送的數據量將比使用原始數組的時候多一些。