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.
fonte
2010-04-27 20:07:42
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! –
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. –