Condividi tramite


Strategie di gestione della memoria

Un gestore di memoria per Direct3D 12 potrebbe diventare molto complicato rapidamente con tutti i diversi livelli di supporto, per schede UMA o discrete (non UMA) e con una notevole gamma di differenze di architettura tra schede GPU.

La strategia consigliata per la gestione della memoria Direct3D 12, descritta in questa sezione, è "classificazione, budget e flusso".

Tipi di risorse

Il concetto di base di una "risorsa di cui è stato eseguito il commit" (creazione di spazi di indirizzi virtuali e fisici inizializzati nella memoria fisica gestita) è stato intorno a Direct3D 9, anche se l'indirizzamento virtuale (VA) e l'indirizzamento fisico possono essere inseriti separatamente in Direct3D 12 per consentire all'app di gestire attentamente la memoria fisica.

Oltre alle risorse di cui è stato eseguito il 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 affiancata".

Le risorse riservate differiscono dalle risorse inserite in cui le risorse riservate hanno uno spazio di indirizzi virtuale GPU univoco. Ciò consente un'allocazione elevata di spazio va in primo piano e quindi abilita il mapping delle pagine va a determinate sezioni dell'heap in un secondo momento e l'applicazione riconfigura la disposizione in tempo reale. Lo spazio VA è contiguo e può essere mappato in modo sparse.

La risorsa riservata può essere effettuata per fare riferimento alle aree nell'heap con chiamate API, ad esempio UpdateTileMappings e possono essere effettuate residente dall'app aggiornando le tabelle delle pagine in tempo reale. Quando viene eseguito il mapping di un intervallo va a NULL o a un heap non residente, tale parte della risorsa viene considerata non residente. Quando un intervallo di va va viene mappato a un heap residente, tale parte della risorsa viene considerata residente. Gli heap sono residenti al momento della creazione.

Le risorse inserite 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 da 5 Mb). Le barriere di aliasing consentono l'uso di 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 della memoria

In Direct3D 12 quando si alloca un heap si sta creando l'aspetto della memoria fisica di una risorsa di cui è stato eseguito il commit. La scelta del segmento di memoria più esplicita è disponibile in Direct3D 12 (scegliendo 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 superano il commit, soprattutto per i sistemi, ad esempio con solo 1 GB di memoria di sistema. Se un'app esegue il commit, il sistema operativo usa una pianificazione più grossolana dei processi in base alla richiesta di memoria fisica. L'utilità di pianificazione congelerà i processi in primo piano e ne eseguirà essenzialmente alcune pagine, per eseguire il paging in un processo in background che vuole essere eseguito. La memoria fisica disponibile può variare notevolmente a seconda delle operazioni eseguite dall'utente 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" è la 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 presenta alcune avvertenze; Ad esempio, si supponga che vi sia un budget locale massimo di 1 Gb, quindi tutti gli heap provengono da tale 1 Gb in un sistema UMA e non c'è alcun overflow alla memoria di sistema (chiaramente, perché non c'è nessuno).

Poiché la memoria gestita direct3D11 per le applicazioni, le risorse inutilizzate vengono essenzialmente eliminate.

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, valutare la possibilità di classificare le risorse nei modi seguenti:

Classificazione Esempi Funzionalità di oggetti e API Note sulla gestione
Critico Interfaccia utente del gioco Allocatore dei comandi, code di comandi, heap di query, risorse e heap delle risorse. Questi elementi devono essere inseriti nella memoria non impaginabile/sempre sottoposta a commit.
Ridimensionato/Facoltativo Modelli e trame specifici del livello, catene di scambio, caselle di cielo, modelli di personaggio di prima persona Risorse e heap. Le risorse di cui è stato eseguito il commit, ma anche le risorse inserite e riservate potrebbero funzionare altrettanto bene. Integrare il budget di residenza della memoria negli algoritmi di rendering. Scegliere il livello appropriato di dettaglio disponibile e rivalutare meno di una volta per fotogramma. 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 heap. Sovrapposizione delle risorse sugli heap e sulle 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 all'interno del frame. In Direct3D 11, le applicazioni potrebbero riutilizzare solo le risorse con lo stesso tipo e dimensioni potenzialmente sufficienti. Gli heap direct3D 12 consentono la sovrapposizione delle risorse per un riutilizzo molto più semplice e maggiore.
Risorse di streaming Terreno, trame aperte e geometria Risorse e heap. Creazione a thread libero, thread CPU in background ed elenchi di comandi di copia in background. Residenza parziale, in genere basata sulla visibilità (usando la valutazione view-frustum o distance-based) e rivalutare la residenza richiede ogni fotogramma.
La tecnica di utilizzo di una gestione parziale della residenza per riquadro e del riutilizzo tra frame è disponibile quando l'adattatore GPU supporta risorse riservate all'interno degli heap.
Usando la tecnica di utilizzo della memoria tra fotogrammi, è possibile ottenere la residenza parziale delle sottorisorse, ma è meno ottimale. Le risorse inserite con heap dovrebbero consentire un riciclo più rapido, ma le risorse di cui è stato eseguito il commit possono essere usate come fallback.

Più applicazioni gravitano sulle risorse di streaming per la maggior parte del lavoro, più sfruttano le risorse inserite e riservate, in modo da ottimizzare il riutilizzo della memoria tra queste quattro classificazioni. Maggiore è il flusso di applicazioni, maggiore è il budget e la priorità della larghezza di banda.

In genere con i motori di grafica Direct3D 12 è necessario rispettare un budget più diversificato e dinamico e farlo più rigorosamente di quanto facessero 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 probabilmente avranno difficoltà a partire da troppi tipi di risorse di categoria critici. Direct3D 11 ha abilitato le risorse per essere create in modo anonimo e occupare lo stato critico senza influire sulle prestazioni. Tuttavia, per Direct3D 12, gli sviluppatori devono cercare accuratamente risorse create in modo casuale in tutto il motore e il middleware e riassegnare loro a una delle altre categorie.

Altre aree problematiche 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 potrebbero probabilmente esporre funzionalità come tecniche di rendering; e l'applicazione può basarsi sull'esposizione delle impostazioni del middleware e del motore. Gli sviluppatori possono affidarsi a Direct3D 11 per eseguire il paging e ottenere la frequenza dei fotogrammi corretta. In alcuni casi, le applicazioni Direct3D 11 potrebbero aver eseguito il paging del contenuto delle risorse in e in ogni fotogramma; e ha generato frequenze di fotogrammi 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 normale allo streaming intra-frame ad alta priorità. Chiedere ai motori di implementare che eroseranno alcuni dei vantaggi del sovraccarico della CPU che stanno cercando passando a Direct3D 12. Gli sviluppatori di motori potrebbero prendere in considerazione la possibilità di inserire i fotogrammi in fasi per offrire più opportunità per le risorse riabilitabili; e probabilmente collaborano con i fornitori di middleware per supportare le risorse inserite e gli heap per il riutilizzo della memoria intra-frame.

CreateCommittedResource

CreateReservedResource

guida alla programmazione direct3D 12

gestione della memoria

binding di risorse