2010-04-27 9 views
8

Sto scrivendo un videogioco, Humm and Strumm, che richiede un componente di rete nel suo motore di gioco. Sono in grado di gestire facilmente le differenze di endianness, ma ho tentato di affrontare i possibili formati di memoria float. So che i computer moderni hanno tutti un formato intero standard, ma ho sentito che potrebbero non tutti utilizzare lo standard IEEE per gli interi in virgola mobile. È vero?Esistono piattaforme moderne con formati float non IEEE C/C++?

Mentre sicuramente potevo solo stamparlo come stringa di caratteri in ogni pacchetto, dovevo comunque convertirlo in un "formato noto" di ciascun client, indipendentemente dalla piattaforma. Lo standard printf() e atod() sarebbe inadeguato.

Nota: poiché questo gioco è un programma software libero/open source che funziona su GNU/Linux, * BSD e Microsoft Windows, non è possibile utilizzare alcuna soluzione proprietaria, né alcuna soluzione a piattaforma singola.

Cheers,
Patrick

risposta

4

Penso che sia sicuro presumere che ogni piattaforma abbia un'implementazione della specifica IEE-754 su cui si può fare affidamento, tuttavia, anche se tutti implementano le stesse specifiche, non c'è alcuna garanzia che ogni piattaforma abbia la stessa identica implementazione, ha gli stessi flag di controllo FP impostati, esegue le stesse ottimizzazioni o implementa le stesse estensioni non standard. Questo rende il determinismo in virgola mobile molto difficile da controllare e in qualche modo inaffidabile da usare per questo genere di cose (dove comunicherai i valori FP sulla rete).

Per ulteriori informazioni al riguardo; leggi http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/

Un altro problema da affrontare è la gestione di client che non dispongono di un'unità in virgola mobile; il più delle volte queste saranno CPU, console o dispositivi embedded di fascia bassa. Assicurati di tenerne conto se vuoi prenderli come bersaglio. L'emulazione FP può essere fatta, ma tende a essere molto lenta su questi dispositivi, quindi dovrai imparare a fare calcoli in virgola fissa. Tuttavia, si consiglia di scrivere classi elaborate per astrarre calcoli in virgola mobile e punto fisso sullo stesso codice che suona come un piano; ma sulla maggior parte dei dispositivi non lo è. Non ti consente di spremere la massima precisione e prestazioni quando si gestiscono valori a virgola fissa.

Un altro problema è la gestione della endianità dei valori in virgola mobile perché non è possibile scambiare byte e impilarli nuovamente in un registro a virgola mobile (i byte potrebbero avere un significato diverso, vedere http://www.dmh2000.com/cpp/dswap.shtml su quello).

Il mio consiglio sarebbe di convertire i float in valori intermedi a punto fisso, fare una correzione endian se necessario e trasmetterlo. Inoltre, non dare per scontato che due calcoli in virgola mobile su macchine diverse produrranno gli stessi risultati; loro no Tuttavia, le implementazioni in virgola mobile diverse da IEEE-754 sono rari. Ad esempio le GPU tendono ad utilizzare il punto fisso, ma sono più propensi ad avere un sottoinsieme di IEEE-754 in questi giorni perché non vogliono gestire eccezioni division-by-zero ma avranno estensioni per half-float che si adattano a 16 bit.

Realizza anche che ci sono librerie là fuori che hanno già risolto questo problema (inviando formati di dati di basso livello in un contesto di gioco) per te. Una di tali librerie è RakNet, in particolare la classe BitStream è progettata per inviare questi tipi di dati in modo affidabile a piattaforme diverse, mantenendo al contempo il sovraccarico; ad esempio, RakNet attraversa un bel po 'di problemi per non perdere larghezza di banda nell'invio di stringhe o vettori.

+0

Il collegamento determinismo che mi hai dato è molto interessante. Stavo pensando di farlo con alcuni messaggi più grandi per assicurarmi che i client fossero sincronizzati. Finché le posizioni sono abbastanza vicine (una unità è di un metro), penso che andrà bene. Non ho intenzione di indirizzare le piattaforme di console e la maggior parte dei sistemi incorporati; Non sono nemmeno sicuro di poterlo fare come software libero. Per quanto riguarda i processori di fascia bassa, è più una preoccupazione. Il problema dello swap di byte è molto sfortunato ... ho brevemente sfogliato l'articolo, ma dovrò leggerlo in seguito. Grazie mille per l'informazione! –

+0

Esistono alcune console (palmari) meno conosciute che consentono di pubblicare software open source per loro come GP2X e Open Pandora. Il problema del determinismo in virgola mobile si verifica principalmente quando decidete di decentralizzare le routine fisiche (ad esempio eseguirle sui client) o eseguire replay su macchine diverse perché tendono ad accumulare errori abbastanza velocemente. –

1

Alcuni processori embedded non includono alcun hardware in virgola mobile a tutti. Per i computer desktop, non vedo alcun motivo per preoccuparmi troppo, a parte i dettagli che infastidiscono solo gli specialisti (sqrt erroneamente arrotondati sull'Alfa, questo genere di cose.) Le differenze che li infastidiscono sono nell'implementazione delle operazioni, non del formato, comunque).

Una variazione tra piattaforme è correlata alla gestione di denormali. I asked a question about those a while back. Anche quello non era così male come mi aspettavo.

+0

OK, grazie Pascal. Aiuterà sicuramente a non doversi preoccupare tanto del formato binario dei float nel gioco. Supponendo che i galleggianti IEEE-754 mi rendano la vita molto più facile.^_^ –

6

Se si astraggono correttamente l'interfaccia di rete, è possibile avere funzioni/oggetti che serializzano e deserializzano i tipi di dati float. Su ogni sistema a cui riesco a pensare, questi sono gli standard IEEE, quindi dovresti semplicemente passare loro i dati invariati (il compilatore probabilmente lo ottimizzerà, in modo da non perdere alcuna prestazione). Se si incontra qualche sistema con un formato diverso, è possibile compilare in modo condizionato in alcuni codici in queste funzioni per eseguire i bit di hacking per convertire dallo standard IEEE al formato nativo. Dovrai solo cambiarlo in un posto. Probabilmente non avrai mai bisogno di farlo, tuttavia, a meno che non entri in console/palmari/ecc.

+0

Ecco come è progettato il mio sistema al momento. Non ero sicuro di quanto sia comune per un float non IEEE. Seguirò il tuo consiglio e lo terrò. Grazie! –

Problemi correlati