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 per accedere direttamente. Per richiedere che l'intera superficie sia bloccata, impostare pRect su NULL. È anche possibile specificare un RECT che copre solo una parte della superficie. Se non si sovrappongono due rettangoli, due thread o processi possono bloccare simultaneamente più rettangoli in una superficie. Si noti che non è possibile bloccare un buffer back 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, chiamare il metodo IDirect3DSurface9::UnlockRect per sbloccarlo.

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

  • Non presupporre mai un passo di visualizzazione costante. Esaminare sempre le informazioni sul passo restituite dal metodo IDirect3DSurface9::LockRect . Questa inclinazione può variare per diversi motivi, tra cui la posizione della memoria della superficie, il tipo di scheda di visualizzazione o anche la versione del driver Direct3D. Per altre informazioni, vedere Width vs. Pitch (Direct3D 9).
  • Assicurati di copiare nelle 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 per visualizzare la memoria. Windows 98 usa un gestore di errori di pagina, Vflatd.386, per implementare un buffer di frame flat virtuale per le schede di visualizzazione con memoria con cambio di banca. Il gestore consente a questi dispositivi di visualizzazione di presentare un buffer di frame lineare a Direct3D. La copia dei dati non allineati per visualizzare la memoria 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 si tratti di una trama dinamica o di una superficie creata usando IDirect3DDevice9::CreateOffscreenPlainSurface. Le superfici del buffer nascosto, a cui è possibile accedere 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