Gestione automatica delle trame (Direct3D 9)
La gestione delle trame è il processo di determinazione delle trame necessarie per il rendering in un determinato momento e la garanzia che tali trame vengano caricate nella memoria video. Come per qualsiasi algoritmo, gli schemi di gestione delle trame variano in complessità, ma qualsiasi approccio alla gestione delle trame comporta le attività chiave seguenti.
- Rilevamento della quantità di memoria della trama disponibile.
- Calcolo delle trame necessarie per il rendering e non necessarie.
- Determinare quali risorse di trama esistenti possono essere ricaricate con un'altra immagine di trama e quali superfici devono essere eliminate e sostituite con nuove risorse di trama.
Direct3D implementa la gestione delle trame supportata dal sistema per garantire che le trame vengano caricate per ottenere prestazioni ottimali. Le risorse di trama gestite da Direct3D vengono definite trame gestite.
Il gestore delle trame tiene traccia delle trame con un timestamp che identifica quando è stata usata l'ultima trama. Usa quindi un algoritmo usato meno di recente per determinare quali trame devono essere rimosse. Le priorità delle trame vengono usate come tie breaker quando due trame sono destinate alla rimozione dalla memoria. Se due trame hanno lo stesso valore di priorità, la trama usata meno di recente viene rimossa. Tuttavia, se due trame hanno lo stesso timestamp, la trama con priorità più bassa viene rimossa per prima.
È necessario richiedere la gestione automatica delle trame per le superfici delle trame quando vengono create. Per recuperare una trama gestita in un'applicazione C++, creare una risorsa trama chiamando IDirect3DDevice9::CreateTexture e specificando il D3DPOOL_MANAGED per il parametro Pool. Non è consentito specificare dove si vuole creare la trama. Non è possibile usare i flag D3DPOOL_DEFAULT o D3DPOOL_SYSTEMMEM durante la creazione di una trama gestita. Dopo aver creato la trama gestita, è possibile chiamare il metodo IDirect3DDevice9::SetTexture per impostarlo su una fase nella cascata di trama del dispositivo di rendering.
È possibile assegnare una priorità alle trame gestite chiamando il metodo IDirect3DResource9::SetPriority per la superficie di trama.
Direct3D scarica automaticamente le trame nella memoria video in base alle esigenze. Il sistema potrebbe memorizzare nella cache le trame gestite nella memoria video locale o non locale, a seconda della disponibilità della memoria video non locale o di altri fattori. La posizione della cache delle trame gestite non viene comunicata all'applicazione, né queste informazioni necessarie per usare la gestione automatica delle trame. Se l'applicazione usa più trame di quanto possa adattarsi alla memoria video, Direct3D rimuove le trame precedenti dalla memoria video per liberare spazio per le nuove trame. Se si usa nuovamente una trama rimossa, il sistema usa la superficie di trama originale della memoria di sistema per ricaricare la trama nella cache di memoria video. Anche se è necessario ricaricare la trama, riduce anche le prestazioni dell'applicazione.
È possibile modificare dinamicamente la copia originale della memoria di sistema della trama aggiornando o bloccando la risorsa trama. Quando il sistema rileva una superficie dirty, dopo il completamento di un aggiornamento o quando la superficie viene sbloccata, la gestione trame aggiorna automaticamente la copia della memoria video della trama. Il successo delle prestazioni è simile al ricaricamento di una trama rimossa.
Quando si immette un nuovo livello in un gioco, l'applicazione potrebbe dover scaricare tutte le trame gestite dalla memoria video (chiamando IDirect3DDevice9::EvictManagedResources).
Per altre informazioni sulla gestione delle risorse, vedere Gestione delle risorse (Direct3D 9).