Szélesség és hangmagasság (Direct3D 9)
Bár a szélességet és a hangmagasságot gyakran informálisan használják, nagyon fontos és eltérő jelentéssel rendelkeznek. Ennek eredményeképpen meg kell értenie az egyes jelentések jelentését, és hogy hogyan értelmezheti a Direct3D által a leírásukhoz használt értékeket.
A Direct3D a D3DSURFACE_DESC struktúrát használja a felület leírását leíró információk hordozására. Ez a struktúra többek között úgy van definiálva, hogy információkat tartalmazzon egy felület dimenzióiról, valamint arról, hogy ezek a dimenziók hogyan jelennek meg a memóriában. A struktúra a Magasság és szélesség tagokkal írja le a felület logikai dimenzióit. Mindkét tag képpontban van megmérve. Ezért a 640 x 480-es felület magassági és szélességi értékei megegyeznek, akár 8 bites, akár 24 bites RGB felületről van szó.
Ha egy felületet az IDirect3DSurface9::LockRect metódussal zárol, a metódus egy D3DLOCKED_RECT szerkezetet tölt ki, amely tartalmazza a felület hangmagasságát, és egy mutatót a zárolt bitekhez. A Pitch-tag értéke a felület memóriahelyét írja le, más néven stride. A hangmagasság két memóriacím közötti távolság bájtban, amelyek egy bitképsor elejét és a következő bitképsor elejét jelölik. Mivel a hangmagasságot nem képpontokban, hanem bájtokban mérik, a 640x480x8-os felületnek nagyon más a hangmagassága, mint egy azonos méretű, de eltérő képpontformátumú felületnek. Emellett a hangmagasság értéke néha azokat a bájtokat tükrözi, amelyeket a Direct3D gyorsítótárként foglalt le, ezért nem biztonságos feltételezni, hogy a hangmagasság csak a képpontonkénti bájtok számával megszorozva. Inkább vizualizálja a szélesség és a dobás közötti különbséget az alábbi ábrán látható módon.
Ebben a diagramban az első és a hátsó puffer 640x480x8, a gyorsítótár pedig 384x480x8.
Amikor közvetlenül fér hozzá a felületekhez, ügyeljen arra, hogy a felület méreteihez lefoglalt memóriában maradjon, és ne maradjon a gyorsítótár számára fenntartott memóriából. Ezenkívül, ha csak egy felület egy részét zárolja, a felület zárolásakor megadott téglalapon belül kell maradnia. Ha nem követi ezeket az irányelveket, az kiszámíthatatlan eredményeket fog eredményezni. Amikor közvetlenül a felületi memóriába renderel, mindig használja a IDirect3DSurface9::LockRect metódus által visszaadott hangmagasságot. Ne feltételezze, hogy a dobás kizárólag a megjelenítési módon alapul. Ha az alkalmazás működik néhány kijelzőadapteren, de másokon nem látható, ez lehet a probléma oka.
További információ: Surface Memória közvetlen elérése (Direct3D 9).
Kapcsolódó témakörök