Strategie di gestione della memoria
Un gestore di memoria per Direct3D 12 potrebbe essere molto complicato con tutti i diversi livelli di supporto, per schede UMA o discrete (non UMA) e con una vasta gamma di differenze di architettura tra schede GPU.
La strategia consigliata per la gestione della memoria Direct3D 12 , descritta in questa sezione, è "classificare, budget e flusso".
Tipi di risorsa
Il concetto di base di una risorsa "commit" (creazione di spazi indirizzi virtuali e fisici inizializzati nella memoria fisica gestita) è stato intorno a partire da Direct3D 9, anche se l'indirizzamento virtuale (VA) e l'indirizzamento fisico possono essere indirizzati a parte in Direct3D 12 per consentire all'app di gestire attentamente la memoria fisica.
Oltre alle risorse di commit, il costrutto heap di Direct3D 12 abilita due altri tipi di risorsa: "inseriti" e "riservati". In Direct3D 11 una risorsa "riservata" era nota come "risorsa riquadri".
Le risorse riservate differiscono dalle risorse inserite in cui le risorse riservate dispongono del proprio spazio di indirizzi virtuale GPU univoco. Ciò consente un'allocazione elevata dello spazio VA in primo piano e quindi consente il mapping di pagine VA a determinate sezioni dell'heap in un secondo momento e l'applicazione riconfigura la disposizione sul volo. Lo spazio VA è contiguo e può essere mappato in modo sparse.
La risorsa riservata può essere effettuata per fare riferimento alle aree di riferimento nell'heap con chiamate API come UpdateTileMappings e possono essere rese residenti dall'app aggiornando le tabelle di pagina al volo. Quando un intervallo va viene mappato a NULL o a un heap non residente, tale parte della risorsa viene considerata non residente. Quando un intervallo di va viene mappato a un heap residente, tale parte della risorsa viene considerata residente. Gli heaps si trovano al momento della creazione.
Le risorse posizionate sono una progettazione molto più semplice, essendo semplicemente un puntatore a una determinata area di un heap (ad esempio, un'area di 1 Mb per una trama in un heap di 5 Mb). Le barriere di aliasing consentono l'uso delle risorse posizionate sovrapposte (vedere CreatePlacedResource e ResourceBarrier).
Le risorse riservate non sono disponibili in tutti gli hardware Direct3D 12 e le risorse inserite sono un fallback ragionevole, anche se le risorse inserite devono essere contigue e non possono essere parzialmente residenti.
Budget di memoria
In Direct3D 12 quando si alloca un heap si sta creando l'aspetto fisico della memoria di una risorsa con commit. La scelta del segmento di memoria più esplicita è disponibile in Direct3D 12 (scelta tra video e memoria di sistema). Le schede UMA hanno solo un singolo segmento di memoria, memoria di sistema.
Le GPU non supportano l'errore di pagina, quindi gli sviluppatori devono essere consapevoli che non esegue il commit, soprattutto per i sistemi che dicono con solo 1 Gb di memoria di sistema. Se un'app esegue il commit, il sistema operativo usa la pianificazione con granularità grossolana dei processi in base alla richiesta sulla memoria fisica. L'utilità di pianificazione congelerà i processi in primo piano e in sostanza verrà visualizzata una pagina per un processo in background che vuole eseguire. La memoria fisica disponibile può variare notevolmente a seconda di ciò che l'utente sta facendo in background (ad esempio l'esecuzione di un browser o la visualizzazione di un video).
L'API per il budget di memoria è QueryVideoMemoryInfo. Per le schede discrete "local" è memoria video, "non locale" è memoria di sistema. Per le schede UMA non locali è sempre zero. Una domanda di progettazione è se il motore gestirà entrambi i budget o solo il budget locale. La gestione solo del budget locale è più semplice, ma ha alcune avvertenze; ad esempio, esiste un budget locale massimo di 1 Gb, quindi tutti gli heaps provengono da quel 1 Gb in un sistema UMA e non esiste alcun overflow alla memoria di sistema (chiaramente, come non esiste nessuna).
Poiché Direct3D11 è stata gestita la memoria per le applicazioni, le risorse inutilizzate verranno essenzialmente annullate.
Scegliere le dimensioni delle risorse più appropriate. Valutare se le dimensioni di una risorsa sono appropriate per la situazione in cui l'applicazione è effettivamente in esecuzione. Alcuni utenti possono eseguire l'applicazione in una finestra o con una risoluzione dello schermo di 800x600.
Strategia di classificazione
Per gestire le risorse in modo efficace negli scenari associati alla memoria, è consigliabile classificare le risorse nel modo seguente:
Classificazione | Esempio | Funzionalità di oggetti e API | Note sulla gestione |
---|---|---|---|
Critico | Interfaccia utente del gioco | Allocatore dei comandi, code di comandi, heaps di query, risorse e heaps delle risorse. | Questi elementi devono essere inseriti in memoria non impaginabile/sempre con commit. |
Ridimensionato/Facoltativo | Modelli e trame specifiche del livello, catene di scambio, caselle di cielo, modelli di personaggio di prima persona | Risorse e heaps. Le risorse di commit, ma anche le risorse inserite e riservate potrebbero funzionare anche. | Integrare il budget della residenza della memoria negli algoritmi di rendering. Scegliere il livello appropriato di dettaglio disponibile e rivalutare meno di una volta per frame. Le tecniche includono l'uso di risorse di dimensioni variabili e il ridimensionamento della catena di scambio. |
Risorse riutilizzate | Buffer shadow, risorse di rendering posticipate, risorse di post-elaborazione, cache dei dati di illuminazione | Risorse e heaps. Sovrapposizione delle risorse su heaps e barriere di aliasing. | Riutilizzare risorse di grandi dimensioni o aree heap all'interno di un frame per ridurre i requisiti per l'intero frame. Usare la tecnica di riutilizzo della memoria intra frame. In Direct3D 11 le applicazioni potrebbero riutilizzare solo le risorse con lo stesso tipo e dimensioni potenzialmente sufficienti. Direct3D 12 heaps consente risorse sovrapposte per un riutilizzo molto più semplice e maggiore. |
Risorse di streaming | Terreno, trame open-world e geometria | Risorse e heaps. Creazione con thread gratuiti, thread CPU in background e code e elenchi di comandi di copia in background. | Residenza parziale, comunemente basata sulla visibilità (usando la valutazione basata sulla visualizzazione o sulla distanza) e rivalutare la residenza richiede ogni cornice. La tecnica dell'uso di una gestione parziale della residenza parziale per riquadro e il riutilizzo tra frame è disponibile quando l'adattatore GPU supporta le risorse riservate all'interno di heaps. L'uso della tecnica di uso della memoria tra fotogrammi può essere eseguito, la residenza parziale di sottoresource può essere eseguita, ma è meno ottimale. Le risorse inserite con heaps devono abilitare il riciclo più veloce, ma le risorse di commit possono essere usate come fallback. |
Più applicazioni gravitano sulle risorse di streaming per la maggior parte del lavoro, più sfruttano le risorse posizionate e riservate, che ottimizzano il riutilizzo della memoria tra queste quattro classificazioni. Più applicazioni di flusso, più budgetano e assegnano priorità alla larghezza di banda.
In genere con i motori grafici Direct3D 12 è necessario onorare un budget più diversificato e dinamico e farlo più strettamente di quanto hanno fatto in passato. Le migliori applicazioni individuano tutte e quattro le categorie nel budget assegnato al processo, ridimensionando il gioco dall'app per dispositivi mobili in background ai budget discreti a schermo intero. Tuttavia, molte applicazioni avranno probabilmente difficoltà a partire da troppi tipi di categorie critiche di risorse. Le risorse direct3D 11 abilitate per la creazione anonima e l'occupazione dello stato critico senza influire sulle prestazioni. Tuttavia, per Direct3D 12, gli sviluppatori devono cercare in modo diligente risorse create in modo casuale in tutto il motore e middleware e riassegnare loro a una delle altre categorie.
Altre aree di problema sono componenti middleware, controlli utente e streaming intra-frame. I componenti middleware potrebbero non essere esposti a un budget, né devono lavorare strettamente insieme. I componenti middleware probabilmente potrebbero esporre le funzionalità come tecniche di rendering; e l'applicazione può basarsi sull'esposizione di middleware e impostazioni del motore. Gli sviluppatori possono basarsi su Direct3D 11 per eseguire il paging e ottenere la velocità di frame corretta. In alcuni casi, le applicazioni Direct3D 11 potrebbero essere state paging del contenuto delle risorse in e fuori ogni frame; e ha generato tassi di frame accettabili per l'utente. La maggior parte dei motori trasmette solo i dati delle risorse come attività in background, in cui non ha un fallback tolleranza per lo streaming intra-frame con priorità elevata. Chiedere ai motori di implementare che eseguono l'erosione di alcuni dei guadagni del sovraccarico della CPU che stanno cercando passando a Direct3D 12. Gli sviluppatori di motori potrebbero prendere in considerazione il tè dei loro frame in fasi per offrire più opportunità per le risorse riabilitabili; e probabilmente lavora con i fornitori di middleware per supportare le risorse inserite e gli heaps per il riutilizzo della memoria intra-frame.