Ich denke, es ist sicher anzunehmen, dass jede Plattform eine Implementierung der IEE-754-Spezifikation hat, auf die Sie sich verlassen können, aber selbst wenn sie alle dieselbe Spezifikation implementieren, gibt es keine Garantie, dass jede Plattform dieselbe hat Implementierung, hat die gleichen FP-Steuerflags gesetzt, führt die gleichen Optimierungen durch oder implementiert die gleichen Nicht-Standard-Erweiterungen. Dies macht es schwierig, den Gleitkommadeterminismus zu kontrollieren und etwas unzuverlässig für diese Art von Sache zu verwenden (wo Sie FP-Werte über das Netzwerk mitteilen werden).
Für weitere Informationen darüber; lesen http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/
Ein anderes Problem zu behandeln ist die Behandlung von Clients, die keine Gleitkommaeinheit haben; Meistens handelt es sich um Low-End-CPUs, Konsolen oder Embedded-Geräte. Achten Sie darauf, dies zu berücksichtigen, wenn Sie sie als Ziel haben möchten. FP Emulation kann getan werden, aber neigt dazu, auf diesen Geräten sehr langsam zu sein, so dass Sie einen Hang von Fixpunktberechnungen bekommen müssen. Seien Sie jedoch darauf aufmerksam, dass das Verfassen ausgefeilter Klassen, um Fließkomma- und Fixpunktberechnungen zum gleichen Code zu illustrieren, wie ein Plan klingt; aber auf den meisten Geräten nicht. Es erlaubt Ihnen nicht, die maximale Genauigkeit und Leistung bei Fixpunktwerten zu erreichen.
Ein weiteres Problem ist die Endianess der Fließkommawerte, weil man nicht einfach Bytes vertauschen und m in einem Fließkomma-Register wieder stapeln kann (die Bytes könnten eine andere Bedeutung bekommen, siehe dazu http://www.dmh2000.com/cpp/dswap.shtml).
Mein Rat wäre, die Floats zu Fixpunkt-Zwischenwerten zu konvertieren, bei Bedarf eine Endian-Korrektur durchzuführen und diese zu übertragen. Nehmen Sie außerdem nicht an, dass zwei Gleitkommaberechnungen auf verschiedenen Computern zu denselben Ergebnissen führen. sie nicht. Andere Gleitkommaimplementierungen als IEEE-754 sind jedoch selten. Zum Beispiel neigten Grafikprozessoren dazu, Fixpunkte zu verwenden, haben aber heutzutage eher eine Untergruppe von IEEE-754, weil sie sich nicht mit Division-durch-Null-Ausnahmen befassen wollen, aber sie werden Erweiterungen für Halb-Floats haben, die hineinpassen 16 Bits.
Auch erkennen, dass es Bibliotheken gibt, die dieses Problem bereits gelöst haben (Low-Level-Datenformate in einem Gaming-Kontext senden) für Sie. Eine solche Bibliothek ist RakNet, speziell die BitStream-Klasse ist dafür ausgelegt, diese Arten von Daten zuverlässig an verschiedene Plattformen zu senden, während der Aufwand auf ein Minimum beschränkt bleibt. zum Beispiel durchläuft RakNet einige Schwierigkeiten, beim Senden von Strings oder Vektoren keine Bandbreite zu verschwenden.
Der Determinismuslink, den Sie mir gegeben haben, ist sehr interessant. Ich hatte darüber nachgedacht, das mit einigen größeren Nachrichten zu tun, um sicherzustellen, dass die Clients synchronisiert wurden. Solange die Positionen nahe genug sind (eine Einheit ist ein Meter), denke ich, das wird gut. Ich beabsichtige nicht, auf Konsolenplattformen und die meisten eingebetteten Systeme zu zielen; Ich bin mir nicht einmal sicher, ob ich das als Freie Software machen kann. Für Low-End-Prozessoren ist das eher ein Problem. Das Byte-Swap-Problem ist sehr bedauerlich ... Ich habe den Artikel kurz überflogen, aber ich muss es später lesen. Vielen Dank für die Informationen! –
Es gibt einige weniger bekannte (Handheld-) Konsolen, mit denen Sie Open-Source-Software wie GP2X und Open Pandora veröffentlichen können. Das Gleitkommadeterminismus-Problem tritt hauptsächlich auf, wenn Sie sich dazu entschließen, die physikalischen Routinen zu dezentralisieren (z. B. auf den Clients auszuführen) oder Wiederholungen auf verschiedenen Maschinen auszuführen, da sie dazu neigen, Fehler recht schnell zu akkumulieren. –