2012-08-23 5 views
12

Ich arbeite mit GameKit.framework und ich versuche, eine zuverlässige Kommunikation zwischen zwei iPhones zu erstellen.Ist die Kommunikation des GameKit zuverlässig mit GKMatchSendDataReliable?

Ich sende Pakete mit dem GKMatchSendDataReliable Modus.

Die Dokumentation sagt:

GKMatchSendDataReliable

Die Daten kontinuierlich gesendet wird, bis sie erfolgreich durch die vorgesehenen Empfänger oder die Verbindung unterbrochen wird empfangen wird. Zuverlässige Getriebe werden in der Reihenfolge geliefert, in der sie gesendet wurden. Verwenden Sie dies, wenn Sie die Lieferung garantieren müssen.

Verfügbar in iOS 4.1 und höher. In GKMatch.h deklariert.

Ich habe einige Probleme auf einer schlechten WiFi-Verbindung erfahren. Die GameKit deklariert die Verbindung nicht verloren, aber einige Pakete kommen nie an.

Kann ich bei Verwendung von GKMatchSendDataReliable auf eine 100% zuverlässige Kommunikation zählen, oder verwendet Apple nur ausgefallene Namen für etwas, das nicht implementiert wurde?

+0

Ich habe nie den zuverlässigen Modus verwendet, aber ich habe viele Probleme beim Testen von GC-Apps auf dem Simulator erlebt. Stellen Sie sicher, dass Sie Ihre App auf zwei Geräten testen. – Adam

Antwort

1

Meine Benutzer beschweren sich auch, dass einige Daten versehentlich während des Spiels verloren gehen können. Ich schrieb eine test app und fand heraus, dass GKMatchSendDataReliable nicht wirklich zuverlässig ist. Bei einer schwachen Internetverbindung (z. B. EDGE) werden einige Pakete regelmäßig ohne Fehler von der Game Center-API verloren.

So ist die einzige Option, eine zusätzliche Transportschicht für wirklich zuverlässige Lieferung hinzuzufügen.

Ich schrieb eine einfache lib für diesen Zweck: RoUTP. Es speichert alle gesendeten Nachrichten bis zur Bestätigung für jede empfangene, sendet verloren und puffert empfangene Nachrichten im Falle einer unterbrochenen Sequenz. In meinen Tests funktioniert die Kombination "RoUTP + GKMatchSendDataUnreliable" sogar besser als "RoUTP + GKMatchSendDataReliable" (und natürlich besser als die reine GKMatchSendDataReliable, die nicht wirklich zuverlässig ist).

+1

Ich habe Beweise gesammelt, die mit Ihnen übereinstimmen. Ich muss zugeben, dass ich darüber sehr erstaunt bin, ganz zu schweigen von Apple. Ich meine ernsthaft, ihre verlässliche Verbindung ist einfach eklatant unzuverlässig? Ich muss eine Transportschicht über einer Spieleschicht hinzufügen, die sich auf mehreren Transportschichten befindet. Was sollen wir als nächstes anfangen, eine Hardware-Flusskontrolle in der App zu schreiben? FFS. – theLastNightTrain

0

Es ist fast 100% zuverlässig, aber vielleicht nicht das, was Sie manchmal brauchen ... Zum Beispiel haben Sie das Netzwerk verlassen alle Sachen, die Sie über GKMatchSendDataReliable senden, werden in der Reihenfolge gesendet, die Sie ihnen gesendet haben. Das ist genial für rundenbasierte Spiele zum Beispiel, aber wenn schnelle Reaktion notwendig ist, würde ein Aussetzer des Netzwerks nicht nur die verpassten Pakete vergessen, er würde alle jetzt späte Pakete bekommen, bis er wieder in Echtzeit kommt.

Der Fall, dass GKMatchSendDataReliable die Daten nicht sendet, ist ein Verbindungstimeout. Ich denke, das wäre auch der Fall, wenn Sie die App schließen

Verwandte Themen