2014-09-01 5 views
5

Sto realizzando un RPG a giocatore singolo open-world in cui il mondo è composto da regioni per lo più isolate, che per scalabilità sono divise in sezioni. Il mondo contiene esseri che interagiscono tra loro. La maggior parte degli esseri avrà riferimenti ad altri esseri, possibilmente inclusi esseri di altre regioni. Una definizione di classe per being potrebbe apparire comeMemorizzare e recuperare riferimenti a oggetti non caricati nel mondo di gioco

class Being { 
    weak_ptr<Being> target; 
    // other members 
}; 

Naturalmente, ho bisogno di essere in grado di salvare e caricare lo stato del gioco da e su disco. Ora, non voglio avere tutti gli esseri caricati in ogni momento. Voglio solo caricare quegli esseri che sono vicino al giocatore o, nel peggiore dei casi, tutti gli esseri nella regione attualmente caricata. Qual è una buona strategia per realizzare questo? Ecco un paio di idee che ho gettato in giro finora.

  1. Sul disco, gli esseri memorizzeranno un identificatore univoco per ogni essere referenziato. Dato che A viene caricato, se si fa riferimento al fatto che B è già stato caricato, il puntatore viene semplicemente impostato. Se B è scaricato, deve anche essere caricato. Il rovescio della medaglia è che questo potrebbe caricare in modo ricorsivo molti esseri che potrebbero non essere usati direttamente.
  2. Invece di esseri contenenti puntatori effettivi, conterranno identificatori. Quindi, quando vengono utilizzati gli esseri di riferimento (ad esempio, se un essere deve danneggiare un altro bersaglio), verranno caricati solo se necessario. Ciò complica l'utilizzo dei riferimenti e ha il potenziale di causare più operazioni di salvataggio/caricamento, ma evita il caricamento di dati non necessari.

Ci sono alternative migliori a queste opzioni? Immagino che questo sia un problema comune, ma non sono stato in grado di trovare domande correlate su SO.

+0

Il tuo approccio è in effetti il ​​caching degli oggetti. Puoi dare un'occhiata qui: http://stackoverflow.com/questions/17807805/how-to-cache-1000s-of-large-c-objects La domanda principale è come renderlo efficiente trovare gli oggetti da caricare, perché dipende dalla loro posizione e non dal loro ID. – Christophe

risposta

1

È possibile utilizzare qualcosa come il Flyweight Pattern per facilitare l'operazione. Quindi ogni tipo di Essere viene caricato solo una volta (cosa che può essere fatto pigramente come è necessario), quindi ogni istanza di Being contiene solo variabili specifiche dell'istanza come posizione, velocità, ecc.

Se questo non è abbastanza di un risparmio, potresti scrivere un gestore di istanze che ha un'API per richiedere un puntatore conteggiato di riferimento a un Essere. L'oggetto di riferimento notificherà il gestore di istanze quando viene distrutto. Ciò renderebbe più semplice per il gestore di riferimento effettuare il marshalling di Beings da e verso il disco, se necessario.

+0

Sfortunatamente, non penso che il Flyweight Pattern mi darà molti risparmi perché gli Esseri contengono per lo più dati "estrinseci" (come una lunga lista di statistiche, inventario, ecc.). Il secondo approccio sembra interessante. È simile alla mia idea no. 2? In caso contrario, potresti collegarmi a un esempio di questo approccio? Grazie! –

Problemi correlati