2010-06-14 2 views
9

Ich füge Peer-to-Peer-Bluetooth mit GameKit zu einem iPhone Shoot-em-up, so Geschwindigkeit ist von entscheidender Bedeutung. Ich sende etwa 40 Nachrichten pro Sekunde, die meisten davon mit dem schnelleren GKSendDataUnreliable, alle serialisieren mit NSCoding. Beim Testen zwischen 3G und 3GS verlangsamt dies die 3G viel mehr, als ich möchte. Ich frage mich, wo ich meine Bemühungen konzentrieren sollte, um es zu beschleunigen.iPhone: Welche sind die nützlichsten Techniken für schnellere Bluetooth?

Wie viel langsamer ist GKSendDataReliable? Für die wenigen Pakete, die haben, um dorthin zu kommen, wäre es schneller, ein GKSendDataUnreliable zu senden und der Peer eine Bestätigung senden, damit ich wieder senden kann, wenn ich nicht die Bestätigung innerhalb, sagen wir, 100ms?

Wie viel schneller wäre es, die NSData -Instanz mit einem normalen C-Array anstatt mit dem NSCoding-Protokoll zu erstellen? Ist dieser Serialisierungsprozess (für etwa ein Dutzend Floats) genauso langsam, wie Sie es von einem Objekterstellungs-/Freigabe-Overhead erwarten würden, oder läuft etwas besonders langsam?

Ich habe gehört, dass (zum Beispiel) das Senden von vier separaten Datensätzen viel, viel langsamer ist, als das Senden eines Datenstücks, das viermal so groß ist. Würde ich eine signifikante Ersparnis erzielen, indem ich separate Datenpakete aussende, die nicht immer im gleichen Paket zusammenlaufen, wenn sie gleichzeitig passieren?

Gibt es noch andere Bluetooth-Leistungsgeheimnisse, die ich verpasst habe?

Danke für Ihre Hilfe.

Antwort

8

Ich bin kein Bluetooth-Experte, aber im Allgemeinen Senden von Daten mit zuverlässigen ist 1.5x die Geschwindigkeit des Sendens von Daten unzuverlässig. Ich würde es vermeiden, einen ACK mit einer unzuverlässigen Methode zurückzusenden, denn dann müssen Sie alle möglichen lächerlichen Logiken einsetzen, um festzustellen, ob der ACK nicht angekommen ist, was Sie mehr verlangsamen wird, als nur einen zuverlässigen Versand zu verwenden .

Das Senden von Daten hat eine hohe Latenz, was bedeutet, dass das Senden von 4 kleinen Paketen mehr Zeit in Anspruch nimmt als das Senden von 1 Paket mit einer 4x großen Nutzlast. Jedes Mal, wenn Sie die Nutzlastgröße erhöhen können, um weniger Sends zu senden, erhalten Sie einen Leistungsvorteil.

Wenn Sie die Größe und Form der zu sendenden und empfangenden Daten kennen, können Sie auch etwas Leistung durch das Senden von Bytearrays oder Zahlenarrays erzielen, anstatt NSCoding zu verwenden, da das NSCoding einige Zeit in Anspruch nimmt serialisieren und deserialisieren (ein Schritt, den Sie überspringen können, wenn Sie nur Arrays senden) und die Menge der Daten, die Sie senden, ist etwas mehr mit NSCoder als mit einem RAW-Array.