Larghezza e pitch (Direct3D 9)

Anche se i termini spesso vengono usati in modo informale, hanno significati molto importanti e distinti. Di conseguenza, è necessario comprendere i significati per ognuno e come interpretare i valori usati da Direct3D per descriverli.

Direct3D usa la struttura D3DSURFACE_DESC per contenere informazioni che descrivono una superficie. Tra le altre cose, questa struttura è definita per contenere informazioni sulle dimensioni di una superficie, nonché sul modo in cui tali dimensioni sono rappresentate in memoria. La struttura utilizza i membri Height e Width per descrivere le dimensioni logiche della superficie. Entrambi i membri vengono misurati in pixel. Pertanto, i valori Height e Width per una superficie 640 x 480 sono uguali se si tratta di una superficie a 8 bit o di una superficie RGB a 24 bit.

Quando si blocca una superficie usando il metodo IDirect3DSurface9::LockRect , il metodo riempie una struttura D3DLOCKED_RECT che contiene il passo della superficie e un puntatore ai bit bloccati. Il valore nel membro Pitch descrive l'inclinazione della memoria della superficie, detta anche stride. Pitch è la distanza, in byte, tra due indirizzi di memoria che rappresentano l'inizio di una riga bitmap e l'inizio della riga bitmap successiva. Poiché il passo viene misurato in byte anziché in pixel, una superficie di 640x480x8 ha un valore di passo molto diverso rispetto a una superficie con le stesse dimensioni ma un formato pixel diverso. Inoltre, il valore di passo a volte riflette i byte riservati da Direct3D come cache, quindi non è sicuro presupporre che il passo sia solo la larghezza moltiplicata per il numero di byte per pixel. Visualizzare invece la differenza tra larghezza e inclinazione, come illustrato nel diagramma seguente.

diagramma dell'inclinazione e della larghezza dello stesso buffer anteriore, del buffer nascosto e della cache

In questo diagramma il buffer anteriore e il buffer nascosto sono entrambi 640x480x8 e la cache è 384x480x8.

Quando si accede direttamente alle superfici, prestare attenzione a rimanere all'interno della memoria allocata per le dimensioni della superficie e rimanere fuori da qualsiasi memoria riservata per la cache. Inoltre, quando si blocca solo una parte di una superficie, è necessario rimanere all'interno del rettangolo specificato durante il blocco della superficie. Se non si seguono queste linee guida, i risultati saranno imprevedibili. Quando si esegue il rendering direttamente nella memoria superficiale, usare sempre l'inclinazione restituita dal metodo IDirect3DSurface9::LockRect . Non presupporre un pitch basato esclusivamente sulla modalità di visualizzazione. Se l'applicazione funziona su alcuni adattatori di visualizzazione, ma sembra incomprensibile su altri, questa potrebbe essere la causa del problema.

Per altre informazioni, vedere Accesso diretto alla memoria di Surface (Direct3D 9).

Superfici Direct3D