l'app si arresta in modo anomalo quando raggiunge 1,5 GB.
Questo suggerisce fortemente che non stai rappresentando correttamente le tue tessere, poiché ciò significherebbe che ogni tessera ha una dimensione di ~ 80 byte.
Quello che devi capire è che deve esserci una separazione tra il concetto di gioco di una tessera e la tessera visiva che l'utente vede. Questi due concetti non sono la stessa cosa .
Prendi Terraria per esempio. Il mondo Terraria più piccolo occupa 4200x1200 tessere, ovvero 5 milioni di tessere. Ora, quanta memoria ci vuole per rappresentare quel mondo?
Bene, ogni piastrella ha uno strato in primo piano, uno strato di sfondo (le pareti dello sfondo), uno "strato di filo" dove vanno i fili e uno "strato di mobili" dove vanno gli oggetti di arredamento. Quanta memoria occupa ogni tessera? Ancora una volta, stiamo solo parlando concettualmente, non visivamente.
Una tessera in primo piano può essere facilmente memorizzata in un corto senza segno. Non ci sono più di 65536 tipi di riquadri in primo piano, quindi non ha senso usare più memoria di così. I riquadri di sfondo potrebbero trovarsi facilmente in un byte senza segno, poiché esistono meno di 256 tipi diversi di riquadri di sfondo. Lo strato di filo è puramente binario: o una piastrella ha un filo o no. Quindi questo è un bit per tessera. E lo strato di mobili potrebbe essere di nuovo un byte senza segno, a seconda di quanti possibili diversi mobili ci sono.
Dimensione totale della memoria per riquadro: 2 byte + 1 byte + 1 bit + 1 byte: 4 byte + 1 bit. Pertanto, la dimensione totale per una piccola mappa Terraria è 20790000 byte, o ~ 20 MB. (nota: questi calcoli si basano su Terraria 1.1. Da allora il gioco si è molto ampliato, ma anche la moderna Terraria potrebbe contenere 8 byte per posizione delle tessere o ~ 40 MB. Ancora abbastanza tollerabile).
Non si dovrebbe mai avere questa rappresentazione memorizzata come array di classi C #. Dovrebbero essere matrici di numeri interi o qualcosa di simile. Anche AC # struct avrebbe funzionato.
Ora, quando arriva il momento di disegnare parte di una mappa (notare l'enfasi), Terraria deve convertire queste tessere concettuali in tessere reali . Ogni tessera deve effettivamente scegliere un'immagine in primo piano, un'immagine di sfondo, un'immagine del mobile opzionale e avere un'immagine a filo. È qui che entra in gioco XNA con i suoi vari fogli sprite e così via.
Quello che devi fare è convertire la parte visibile della tua mappa concettuale in tessere di sprite XNA reali. Non dovresti provare a convertire l' intera cosa in una volta . Ogni riquadro che memorizzi dovrebbe essere solo un indice che dice "Sono un tipo di riquadro X", dove X è un numero intero. Usa quell'indice intero per recuperare quale sprite usi per visualizzarlo. E usi i fogli sprite di XNA per renderlo più veloce del semplice disegno di singoli quadricipiti.
Ora la regione visibile delle tessere deve essere suddivisa in vari blocchi, in modo da non creare costantemente fogli sprite ogni volta che la telecamera si sposta. Quindi potresti avere blocchi 64x64 del mondo come fogli sprite. Qualunque pezzo 64x64 del mondo sia visibile dalla posizione attuale della telecamera del giocatore sono i pezzi che disegni. Altri pezzi non hanno nemmeno fogli di sprite; se un pezzo cade dallo schermo, lo butti fuori (nota: non lo elimini davvero; lo tieni attorno e lo rispetti per un nuovo pezzo che potrebbe diventare visibile in seguito).
Vorrei che l'intera mappa fosse elaborata almeno sull'app server (e sul client, se possibile).
Il tuo server non ha bisogno di conoscere o preoccuparsi della rappresentazione visiva dei riquadri. Tutto ciò che deve preoccuparsi è la rappresentazione concettuale. L'utente aggiunge un riquadro qui, quindi cambia l'indice del riquadro.