Fließkomma-Determinismus zwischen Apple A5- und Apple A6-CPUs

8

Ich entwickle ein Multiplayer-Spiel mit Box2D-Physik für iOS. Der Multiplayer verwendet wie üblich die Lock-Step-Methode. Das Spiel aktualisiert die Physik weltweit - zeitnah. Es gibt keine Desynchronisierung unter iOS-Geräten mit derselben CPU.

Beim Testen mit neuen iOS-Geräten mit Apple A6-Chip ist jedoch eine Desynchronisierung aufgetreten. Wenn ich meine Log-Datei anschaue, habe ich den Eindruck, dass die Desynchronisation ziemlich schnell abläuft und es war wahrscheinlich wegen einer Gleitkomma-Operation, die ich noch nicht herausfinden konnte.

Ich kann garantieren, dass nur Box2D das einzige Modul ist, das im Design des Spiels synchronisiert werden muss, und alle mutliplayer Befehle und Eingaben sind nicht synchron mit meinem Log.

Ich habe versucht, alle transzendenten Funktionen zu ändern: sinf, cosf, pow, sqrtf, atan2f, um die Version zu verdoppeln, aber ohne Glück.

Gibt es eine Möglichkeit, Apple A6 zu zwingen, Gleitkommazahlen wie Apple A5 wie einige Compiler-Optionen zu behandeln?

Ich werde wirklich jede Antwort zu schätzen wissen.

    
Nguyễn Trường Chung 15.12.2012, 02:57
quelle

3 Antworten

5

Eine Reihe von Math-Bibliotheksfunktionen verwenden unterschiedliche Algorithmen für A5 und A6. Wenn sie sich um mehr als ein ul oder zwei unterscheiden, haben Sie möglicherweise einen Fehler gefunden. Bitte melde es. Andernfalls liegt die Abweichung wahrscheinlich innerhalb der erwarteten Toleranzen einer guten Mathebibliothek. Für einen Einblick in die Gründe, warum dies so ist, ist die beste Referenz Ian Ollmanns Mail an die Mailingliste mac-games-dev vor einigen Jahren, " Die Mathebibliothek ist kein Sicherheitstool ", die genau dieses Problem im Kontext von Mac OS X anspricht. (Die tl; dr-Version ist das.) Das Ziel, bitidentische Ergebnisse über Architekturen hinweg zu liefern, was einige Spieleentwickler wollen, steht grundsätzlich im Widerspruch zur Bereitstellung von hochpräzisen Antworten auf allen Architekturen, was allen Entwicklern [und Benutzern, da es Reaktionsfähigkeit und Akkulaufzeit zugute kommt] wollen, etwas muss geben, und für eine universelle Systembibliothek hat letzteres notwendigerweise Vorrang). Die Apple-Entwicklerforen wären ein weiterer guter Ort, um nach Informationen zu suchen.

    
Stephen Canon 16.12.2012, 23:48
quelle
3

es ist tatsächlich Nguyen Truong Chung wieder.

Vielen Dank für Ihre bisherigen Antworten. Ich schätze deine Antworten sehr, die mir den Weg zum Debuggen eröffnet haben! Im Moment habe ich irgendwie den Grund des Desync herausgefunden, aber noch keine konkreten Lösungen. Ich möchte Sie mit Informationen versorgen, die ich bekommen habe, und hoffentlich kann ich weitere Einblicke bekommen.

1. Finden:

Ich habe diese Funktion, die cos verwendet. Ich habe das Protokoll folgendermaßen ausgedruckt:

void rotateZ (Gleitwinkel)

{

%Vor%

}

Desync ist so passiert:

Auf dem iPad4: Vector3D :: SelfRotateZ (404800d2) bf7ff708, 3c8782bc Auf dem iPhone4: Vector3D :: SelfRotateZ (404800d2) bf7ff709, 3c8782bc

2. Erneutes Testen:

Und die Geschichte hört hier nicht auf, weil:

  1. Ich habe diese Codezeile zu Beginn des Spiels ausprobiert:

{     unsigned int zz = 0x404800d2;

%Vor%

}

  1. Ich habe den obigen Code auf dem gleichen iPhone4 ausgeführt und rate mal was? Ich habe das: bf7ff708

  2. Ich habe diesen Code in die Update-Schleife des Spiels eingefügt und das Ergebnis, das ich bekommen habe, war immer bf7ff708 bei jeder Schleife.

  3. Was ist mehr? Der Wert 0x404800d2 ist ein Initialisierungswert des Spiels, daher sind bei jedem Spielstart die zwei oben genannten Desynchronisationslinien immer vorhanden.

3: Die Befragung:

Also habe ich beschlossen, zu vergessen, was oben passiert ist, und habe die sin-cos-Funktion vorübergehend durch einfache Taylor-Implementierungen ersetzt, die ich auf dreamcode.net gefunden habe. Das Desync ist nicht mehr passiert.

Es scheint, dass die cos-Funktion auf dem gleichen iPhone 4 (OS Version 5) nicht einmal deterministisch ist.

Meine Frage ist: Haben wir eine Erklärung, warum die cos-Funktion für dieselbe Eingabe auf einem Telefon ein anderes Ergebnis liefert? Hier habe ich den Eingang 0x404800d2 und zwei verschiedene Ausgänge: bf7ff708 und bf7ff709. Allerdings kann ich das Ergebnis bf7ff709 nicht einfach durch Kodierung reproduzieren.

Ich denke, ich brauche den Quellcode der mathematischen Funktionen des Betriebssystems (Gleitkomma-Version), um dies klar zu verstehen. Ist das obige Problem als Bug-Report ausreichend?

    
Tín Tả Tơi 18.12.2012 10:02
quelle
1

Es ist tatsächlich wieder Nguyen Truong Chung. :)

Vielen Dank für Ihre Hilfe bis jetzt.

Ich möchte nur berichten, dass das Desync behoben ist, nachdem ich alle transzendenten Funktionen wie cos, sin, sqrt, pow, atan2, atan, asin, acos usw. (so viele wie möglich) umgeschrieben habe.

    
Tín Tả Tơi 19.12.2012 15:38
quelle