2010-04-27 5 views
8

Ich schreibe ein Videospiel, Humm and Strumm, das eine Netzwerkkomponente in seiner Game-Engine benötigt. Ich kann leicht mit Unterschieden in der Endianz umgehen, aber ich habe eine Wand in dem Versuch getroffen, mit möglichen float Speicherformaten umzugehen. Ich weiß, dass moderne Computer alle ein ganzzahliges Standardformat haben, aber ich habe gehört, dass sie nicht alle den IEEE-Standard für Gleitkomma-Ganzzahlen verwenden. Ist das wahr?Gibt es moderne Plattformen mit Nicht-IEEE C/C++ Float-Formaten?

Während sicherlich könnte ich es nur als Zeichenfolge in jedes Paket ausgeben, würde ich immer noch zu einem "bekannten Format" von jedem Client, unabhängig von der Plattform konvertieren müssen. Der Standard printf() und atod() wäre unzureichend.

Bitte beachten Sie, da dieses Spiel eine Freie/Open Source Software ist, die unter GNU/Linux, * BSD und Microsoft Windows läuft, kann ich weder proprietäre Lösungen noch Einzelplatzlösungen verwenden.

Cheers,
Patrick

Antwort

4

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.

+0

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! –

+0

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. –

1

Einige Embedded-Prozessoren enthalten keine Gleitkomma-Hardware alle an. Für Desktop-Computer sehe ich keinen Grund, sich zu viel Sorgen zu machen, abgesehen von Details, die die Spezialisten nur ärgern (sqrt wird auf dem Alpha falsch gerundet.) Die Unterschiede, die sie stören, sind die Implementierung der Operationen. sowieso nicht vom format).

Eine Variation zwischen den Plattformen bezieht sich auf die Handhabung von Denormalen. I asked a question about those a while back. Auch das war nicht so schlimm wie ich erwartet hatte.

+0

In Ordnung, danke Pascal. Es wird definitiv helfen, sich nicht so viel Gedanken über das binäre Format von Floats im Spiel machen zu müssen. Die Annahme von IEEE-754-Schwimmern macht mein Leben sehr viel einfacher.^_^ –

6

Wenn Sie Ihre Netzwerkschnittstelle ordnungsgemäß abstrahieren, können Sie Funktionen/Objekte verwenden, die die Float-Datentypen serialisieren und deserialisieren. Bei jedem System, das mir einfällt, handelt es sich um den IEEE-Standard. Sie sollten die Daten also unverändert weitergeben (der Compiler wird es wahrscheinlich sogar optimieren, damit Sie keine Performance verlieren). Wenn Sie auf ein System mit einem anderen Format stoßen, können Sie Code in diesen Funktionen bedingt kompilieren, um Bit-Hacks auszuführen, um vom IEEE-Standard in das native Format zu konvertieren. Sie müssen es nur an einer Stelle ändern. Sie werden dies wahrscheinlich nie tun müssen, es sei denn, Sie kommen in Konsolen/Handhelds/etc.

+0

So ist mein System im Moment entworfen. Ich war nicht sicher, wie häufig es für einen Nicht-IEEE-Float ist. Ich werde Ihrem Rat folgen und ihn behalten. Danke! –

Verwandte Themen