Questa è una domanda "difficile". Non ho trovato nulla di interessante sul web.Gestione memoria C++ per streaming di texture nei videogiochi
Sto sviluppando un modulo di gestione della memoria per la mia azienda. Sviluppiamo giochi per console next-gen (Xbox 360, PS3 e PC ... consideriamo PC una console!).
Avremo bisogno in futuro, per i nostri prossimi giochi, di gestire lo streaming di texture per mondi di gioco di grandi dimensioni che non possono essere caricati tutti nella memoria della console principale (per ora non si parla di PC).
Stiamo per eseguire lo streaming all'inizio delle mipmap ad alta risoluzione delle texture (ovvero circa il 70% delle dimensioni dei dati del mondo). Forse in futuro dovremo eseguire lo streaming anche di geometria, mipmap più piccoli, audio, ecc.
Sto sviluppando un Memory Manager per quel problema, incentrato su X360 (perché su PS3 possiamo usare la memoria host e gli associati , deframmentazione automatica di GMM).
Il problema che sto affrontando è il seguente: Abbiamo deciso di riservare una specifica Area di memoria per lo streaming di texture (ad esempio 64 Megabyte) e vogliamo gestire tutte le allocazioni e le deallocazioni in quell'area. Abbiamo assegnato l'area all'inizio dell'applicazione e l'area è fisicamente garantita per essere contigua (non solo virtualmente, perché abbiamo bisogno di memorizzare le trame lì).
Ho implementato un allocatore di deframmentazione automatica, utilizzando le maniglie anziché i puntatori. Il tempo non è un problema, il problema è la frammentazione della memoria. Nel gioco cariciamo e scarichiamo continuamente bersagli in streaming, quindi vorremmo utilizzare la quantità massima del nostro buffer (64 Megabyte).
Con questo allocatore è possibile utilizzare tutto lo spazio allocato, ma la routine di deframmentazione funziona in un tempo inaccettabile (a volte 60 millisecondi, più di un frame!) Mentre l'algoritmo non è troppo male ... ci sono fin troppi meme non valida!
Sto cercando una soluzione per risolvere questo problema. Mi piacerebbe trovare almeno un buon documento, o un post-mortem, o qualcuno che abbia affrontato il mio stesso problema.
Ora sto scegliendo tra due strategie: 1) sposta la routine di deframmentazione su un thread dedicato (valido per X360 con 6 thread hw, non adatto a PS3 con solo un thread hw ... e non dirmelo per utilizzare SPU!) con tutti i problemi di multithreading delle regioni di blocco, di accedere a una regione che viene spostata, ... 2) trovare una soluzione "incrementale" al problema della deframmentazione: possiamo assegnare a ciascun frame un budget di tempo (ad esempio a 1 millisecondo) per la deframmentazione e Memory Manager farà ciò che può fare nel budget di ogni frame.
Qualcuno può dirmi la sua esperienza?
Come sviluppatore di giochi I secondo questa idea, siamo fortunati che le trame di gioco hanno delle belle dimensioni, per impostazione predefinita, quindi dovrebbe funzionare bene, ma potresti anche voler utilizzare un paio di dimensioni del bucket invece di un singolo bucket. Ora un'altra ottimizzazione da considerare è quella di creare un algoritmo che posiziona le trame da utilizzare nello stesso rendering passandole l'una accanto all'altra, ma non farà una differenza enorme, forse solo ricordare e ottimizzare se davvero ne hai bisogno, dipendere dal gioco e rendering. –
ottimo link, ottima risposta! Molte grazie! – ugasoft
questo è uno dei migliori collegamenti che ho trovato finora. grazie mille. – pigiuz