2011-04-06 15 views
5

Al momento, ho un sistema in atto in cui registro uno stato di gamepad in una struttura e lo memorizzo in una lista di stati per registrare l'input per la durata di un videogioco. Lo stato completo del pad occupa 192 bit per frame, ma questo è un po 'dispendioso. Ad esempio, se i trigger analogici sul pad non vengono premuti, continuano a essere caricati fino a 32 bit ciascuno. Quindi ovviamente sto cercando di risparmiare un po 'di spazio.Un modo per evitare sprechi di memoria

Avevo provato a impostarlo su NULL ma sembra che non abbia alcun effetto sulla dimensione del file binario che il sistema salva alla fine della partita.

Quali alternative sono disponibili in una situazione in cui è necessario registrare o salvare determinati valori ma mantenere l'integrità di una struttura dati?

EDIT:

Credo di aver trovato una soluzione; di sorta. In precedenza ho provato a impostare valori su NULL sostituendo il float standard con System.Nullable nella struct. La mia idea è che l'impostazione su un valore NULL nella struct sarà serializzata molto più piccola. Ho l'impressione che NULL sia registrato come 4 bit. Potrebbe essere di più, probabilmente lo è. Ad ogni modo, il codice che ho avuto in precedenza ha avuto un errore piuttosto evidente, quindi sono tornato indietro e l'ho riparato di nuovo. Ora sto ottenendo ripetizioni molto più piccole e la precisione sembra essere altrettanto buona, quindi presumo che l'inganno NULL stia facendo qualcosa di appropriato.

risposta

1

Questo è quello che fai.

Si utilizza un flusso di bit per scrivere solo i bit di informazioni che fanno la differenza. Nel caso in cui si disponga di molti dati sparsi, si scrive un bit mask prima di ogni altra cosa, che indica quale dei seguenti bit contiene dati.

In questo modo, qualcosa come un vettore può essere ridotto a soli 3 bit zero. Se il vettore è vuoto/zero. Se solo un componente del vettore è valido, allora sono 3 bit + solo la dimensione di quel componente. Oltre a questo, naturalmente, è possibile aggiungere la compressione, tuttavia a un certo punto la distribuzione dei bit (quando si sta facendo la mannaia) diventa molto uniforme. Ciò rende i metodi di compressione generici meno ottimali e potrebbero addirittura aumentare le dimensioni dell'output.

E quello che fai è che periodicamente scrivi queste cose su disco, in modo da non tenerne mai un enorme pezzo in memoria.

+0

Il problema che ho avuto con la scrittura periodica è che sto salvando un file binario. Posso usare la modalità Append per scrivere sul file ma non viene riprodotto correttamente; si ferma nel punto in cui si verifica la prima scrittura e successivamente non riproduce nulla. Inoltre, ho trovato che il file allegato era enorme. Questo è ancora molto lavoro in corso; Sto solo cercando di appianare i nodi uno alla volta. –

+0

Qualcosa come la funzionalità di replay è un lavoro noioso, perché gli errori più semplici mettono a posto tutto il resto. Se hai problemi con lo stream e scrivi cose su disco, interlaccia il tuo flusso di dati con informazioni sui metadati e di debug, sarà molto utile per rilevare i problemi. Se sei molto desideroso di quello che metti in quel flusso, la quantità di dati si accumulerà molto rapidamente, sono 60 FPS ma hai bisogno di eseguire il tuo loop di input di gioco anche a quella velocità? Spesso un approccio input bufferizzato con una frequenza inferiore produce risultati altrettanto buoni ma a un costo inferiore. –

+0

Il sistema che sto facendo al momento è in realtà una prova di concetto che sto mettendo insieme per la mia tesi. Il metodo di registrazione che ho al momento funziona bene, ma ovviamente ci sono miglioramenti che potrebbero essere fatti e discussi sull'argomento. Sfortunatamente, la registrazione di input per i replay, almeno da una prospettiva di gioco, sono pochi e distanti tra loro e quello che ho trovato è stato piuttosto vago, quindi sono stato pugnalato selvaggiamente nell'oscurità. Avrò un'occhiata riducendo la velocità dell'aggiornamento del gioco; grazie per l'idea –

2

Non in una struttura, penso. Potrebbe essere necessario un protocollo un po 'più complicato.

Ad esempio (molto agitato e non ponderate) (COSA 3xough):

Il primo byte contiene lo stato di 8 tasti, un bit per ogni pulsante. Se un bit per un pulsante è impostato su 1, il client (per ora lo chiamo il client) si aspetta dati più specifici per quel pulsante, come la direzione e così via, in un ordine specifico.

1

È possibile dividere la struttura e/o utilizzare una compressione.

Ma il principale risparmio potrebbe essere quello di salvare durante il il gioco, non tutto alla fine.

0

È possibile memorizzare solo i delta? In molte situazioni, ciò fornisce una buona compressione.

Per gli stati del tipo di bit, non modifica le dimensioni, ma solo il significato.

Per i tipi di float, tuttavia, si riduce a 1 bit nella maggior parte dei casi e aumenta solo di 1 bit negli altri casi.

Problemi correlati