I mapping si trovano in un pool di riquadri
Quando una risorsa viene creata come risorsa streaming, i riquadri che la costituiscono provengono da posizioni in un pool di riquadri. Un pool di riquadri è un pool di memoria (supportato da una o più allocazioni dietro le quinte, senza visualizzare l'applicazione). Il sistema operativo e il driver di visualizzazione gestiscono questo pool di memoria e il footprint di memoria è facilmente comprensibile da un'applicazione. Le risorse di streaming mappano le aree di 64 KB puntando alle posizioni in un pool di riquadri. Un fallout di questa configurazione è che consente a più risorse di condividere e riutilizzare gli stessi riquadri e anche per riutilizzare gli stessi riquadri in posizioni diverse all'interno di una risorsa, se necessario.
Il costo per la flessibilità del popolamento dei riquadri per una risorsa da un pool di riquadri è che la risorsa deve fare il lavoro di definire e mantenere la mappatura di quali riquadri nel pool rappresentano quelli necessari per la risorsa. È possibile modificare i mapping dei riquadri. Inoltre, non tutti i riquadri in una risorsa devono essere mappati alla volta; una risorsa può avere mapping di valore NULL . Un mapping NULL definisce un riquadro come non disponibile dal punto di vista della risorsa che vi accede.
È possibile creare più pool di riquadri e qualsiasi numero di risorse di streaming può essere mappato contemporaneamente a qualsiasi pool di riquadri specificato. I pool di riquadri possono anche essere cresciuti o compattati. Per altre info, vedi Ridimensionamento del pool di riquadri. Un vincolo esistente per semplificare l'implementazione del driver di visualizzazione e del runtime consiste nel fatto che una determinata risorsa di streaming può avere mapping al massimo un pool di riquadri alla volta (anziché eseguire il mapping simultaneo a più pool di riquadri).
La quantità di spazio di archiviazione associato a una risorsa di streaming stessa (ovvero, la memoria indipendente del pool di riquadri) è approssimativamente proporzionale al numero di riquadri effettivamente mappati al pool in qualsiasi momento. Nell'hardware, questo fatto riduce il ridimensionamento del footprint di memoria per l'archiviazione tabelle di pagine con la quantità di riquadri mappati (ad esempio, usando uno schema di tabella di pagine multilivello in base alle esigenze).
Il pool di riquadri può essere considerato come un'astrazione interamente software che consente alle applicazioni Direct3D di essere in grado di programmare efficacemente le tabelle di pagine nell'unità di elaborazione grafica (GPU) senza dover conoscere direttamente i dettagli di implementazione di basso livello (o gestire direttamente gli indirizzi del puntatore). I pool di riquadri non applicano livelli aggiuntivi di riferimento indiretto nell'hardware. Le ottimizzazioni di una tabella di pagina a livello singolo che usano costrutti come le directory di pagine sono indipendenti dal concetto di pool di riquadri.
Si esaminerà l'archiviazione che la tabella di pagine stessa potrebbe richiedere nel peggiore dei casi (anche se in pratica le implementazioni richiedono solo l'archiviazione approssimativamente proporzionale a ciò che viene mappato).
Si supponga che ogni voce della tabella di pagina sia a 64 bit.
Per le dimensioni peggiori della tabella delle pagine con un'unica superficie, dato i limiti delle risorse in Direct3D 11, si supponga che una risorsa di streaming venga creata con un formato a 128 bit per elemento (ad esempio, un float RGBA), quindi un riquadro da 64 KB contiene solo 4096 pixel. Le dimensioni massime supportate Texture2DArray pari a 16384*16384*2048 (ma con un solo mipmap) richiedono circa 1 GB di spazio di archiviazione nella tabella di pagine se completamente popolate (non incluse le mipmap) usando voci di tabella a 64 bit. L'aggiunta di mipmap aumenta l'archiviazione delle tabelle di pagine completamente mappata (nel peggiore deI casI) di circa un terzo, a circa 1,3 GB.
Questo caso consente di accedere a circa 10,6 terabyte di memoria indirizzabile. Potrebbe esserci un limite alla quantità di memoria indirizzabile, che potrebbe ridurre questi importi, forse intorno all'intervallo di terabyte.
Un altro caso da considerare è una singola risorsa di streaming Texture2D 16384*16384 con un formato a 32 bit per elemento, inclusi mipmap. Lo spazio necessario in una tabella di pagine completamente popolata sarebbe di circa 170 KB con voci di tabella a 64 bit.
Si consideri infine un esempio che usa un formato BC, ad esempio BC7 con 128 bit per riquadro di 4x4 pixel. Questo è un byte per pixel. Texture2DArray di 16384*16384*2048, incluse le mipmap, richiederebbe circa 85 MB per popolare completamente questa memoria in una tabella di pagine. Non è male se si considera che una risorsa di streaming può coprire 550 gigapixel (512 GB di memoria in questo caso).
In pratica, non si potrebbero definire mappature così complete, dato che la quantità di memoria fisica disponibile non consentirebbe di mappare e referenziare così tanto alla volta. Tuttavia, con un pool di riquadri, le applicazioni potrebbero scegliere di riutilizzare i riquadri (ad esempio, riutilizzando un riquadro colorato "nero" per aree nere di grandi dimensioni in un'immagine), usando in modo efficace il pool di riquadri (ovvero i mapping delle tabelle di pagine) come strumento per la compressione della memoria.
Il contenuto iniziale della tabella di pagina è NULL per tutte le voci. Le applicazioni non possono anche passare i dati iniziali per il contenuto della memoria della superficie perché inizia senza backup della memoria.
In questa sezione
Argomento | Descrizione |
---|---|
Le applicazioni possono creare uno o più pool di riquadri per ogni dispositivo Direct3D. Le dimensioni totali di ogni pool di riquadri sono ridotte al limite di dimensioni delle risorse di Direct3D 11, che è approssimativamente 1/4 di RAM GPU. |
|
Ridimensionare un pool di riquadri per aumentare le dimensioni di un pool di riquadri se l'applicazione necessita di un set di lavoro maggiore per il mapping delle risorse di streaming oppure per la riduzione se è necessario meno spazio. |
|
Confronto tra il monitoraggio dei pericoli e le risorse del pool di riquadri |
Per le risorse non in streaming, Direct3D può prevenire determinate condizioni di pericolo durante il rendering, ma poiché il rilevamento dei rischi sarebbe a livello di riquadro per le risorse di streaming, il monitoraggio delle condizioni di pericolo durante il rendering delle risorse di streaming potrebbe essere troppo ingente in termini di costi. |
Argomenti correlati
Creazione di risorse di streaming