Bredd jämfört med tonhöjd (Direct3D 9)
Även om termerna bredd och tonhöjd ofta används informellt, har de mycket viktiga och tydligt olika betydelser. Därför bör du förstå innebörden för var och en och hur du tolkar de värden som Direct3D använder för att beskriva dem.
Direct3D använder D3DSURFACE_DESC struktur för att bära information som beskriver en yta. Den här strukturen definieras bland annat så att den innehåller information om en ytas dimensioner, samt hur dessa dimensioner representeras i minnet. Strukturen använder medlemmarna Höjd och Bredd för att beskriva ytans logiska dimensioner. Båda medlemmarna mäts i bildpunkter. Därför är värdena höjd och bredd för en 640 x 480-yta desamma oavsett om det är en 8-bitars yta eller en 24-bitars RGB-yta.
När du låser en yta med hjälp av metoden IDirect3DSurface9::LockRect fyller metoden i en D3DLOCKED_RECT struktur som innehåller ytans bredd och en pekare till de låsta bitarna. Värdet i Pitch-medlemmen beskriver ytans minneshöjd, även kallat steg. Pitch är avståndet i byte mellan två minnesadresser som representerar början av en bitmappslinje och början av nästa bitmappslinje. Eftersom tonhöjd mäts i byte i stället för bildpunkter har en yta på 640x480x8 ett helt annat lutningsvärde än en yta med samma dimensioner men ett annat pixelformat. Dessutom återspeglar tonhöjdsvärdet ibland byte som Direct3D har reserverat som en cache, så det är inte säkert att anta att tonhöjden bara är bredden multiplicerad med antalet byte per pixel. Visualisera snarare skillnaden mellan bredd och tonhöjd enligt följande diagram.
I det här diagrammet är både den främre bufferten och den bakre bufferten 640x480x8 och cacheminnet är 384x480x8.
När du kommer åt ytor direkt bör du hålla dig inom det minne som allokerats för ytans dimensioner och hålla dig borta från allt minne som är reserverat för cacheminnet. När du låser bara en del av en yta måste du dessutom hålla dig inom den rektangel som du anger när du låser ytan. Om du inte följer dessa riktlinjer får du oförutsägbara resultat. När du återger direkt till ytminnet använder du alltid den tonhöjd som returneras av metoden IDirect3DSurface9::LockRect. Anta inte en tonhöjd som enbart baseras på visningsläget. Om programmet fungerar på vissa bildskärmskort men ser förvrängt ut för andra kan det vara orsaken till problemet.
Mer information finns i Accessing Surface Memory Directly (Direct3D 9).
Relaterade ämnen