Condividi tramite


Accesso diretto alla memoria surface (Direct3D 9)

È possibile accedere direttamente alla memoria della superficie usando il metodo IDirect3DSurface9::LockRect. Quando si chiama questo metodo, il parametro pRect è un puntatore a una struttura RECT che descrive il rettangolo sulla superficie a cui accedere direttamente. Per richiedere che l'intera superficie sia bloccata, impostare pRect su NULL. Inoltre, è possibile specificare un RECT che copre solo una parte della superficie. A condizione che due rettangoli non si sovrappongano, due thread o processi possono bloccare simultaneamente più rettangoli in una superficie. Si noti che non è possibile bloccare un back buffer multisample.

Il metodo IDirect3DSurface9::LockRect riempie una struttura D3DLOCKED_RECT con tutte le informazioni per accedere correttamente alla memoria della superficie. La struttura include informazioni sul passo e ha un puntatore ai bit bloccati. Al termine dell'accesso alla memoria della superficie, chiama il metodo IDirect3DSurface9::UnlockRect per eseguire lo sblocco.

Mentre hai una superficie bloccata, puoi manipolare direttamente il contenuto. L'elenco seguente descrive alcuni suggerimenti per evitare problemi comuni con la memoria della superficie di rendering direttamente.

  • Non presupporre mai un passo di visualizzazione costante. Esaminare sempre le informazioni sul pitch restituite dal metodo IDirect3DSurface9::LockRect. Questo livello può variare per diversi motivi, tra cui la posizione della memoria della superficie, il tipo di scheda grafica o anche la versione del driver Direct3D. Per altre informazioni, vedere Width vs. Pitch (Direct3D 9).
  • Assicurati di copiare su superfici sbloccate. I metodi di copia Direct3D avranno esito negativo se viene chiamato su una superficie bloccata.
  • Limitare l'attività dell'applicazione mentre una superficie è bloccata.
  • Copiare sempre i dati allineati alla memoria di visualizzazione. Windows 98 usa un gestore di eccezioni di pagina, Vflatd.386, per implementare un buffer a cornice piatta virtuale per le schede di visualizzazione con memoria commutata a banchi. Il gestore consente a questi dispositivi di visualizzazione di presentare un buffer di frame lineare a Direct3D. La copia di dati non allineati alla memoria visualizzata può causare la sospensione delle operazioni del sistema se la copia si estende su banche di memoria.
  • Una superficie potrebbe non essere bloccata se appartiene a una risorsa assegnata al pool di memoria D3DPOOL_DEFAULT, a meno che non sia una trama dinamica o una superficie creata usando IDirect3DDevice9::CreateOffscreenPlainSurface. Le superfici del buffer nascosto, accessibili usando i metodi IDirect3DDevice9::GetBackBuffer e IDirect3DSwapChain9::GetBackBuffer, possono essere bloccate solo se la catena di scambio è stata creata con il membro Flags di D3DPRESENT_PARAMETERS per includere D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

superfici Direct3D