Delen via


Breedte versus pitch (Direct3D 9)

Hoewel de termen breedte en toonhoogte vaak informeel worden gebruikt, hebben ze zeer belangrijke en duidelijk verschillende betekenissen. Als gevolg hiervan moet u de betekenissen voor elk begrijpen en hoe u de waarden interpreteert die Direct3D gebruikt om ze te beschrijven.

Direct3D maakt gebruik van de D3DSURFACE_DESC structuur om informatie over een oppervlak te bevatten. Deze structuur wordt onder andere gedefinieerd om informatie over de afmetingen van een oppervlak te bevatten, evenals hoe deze dimensies worden weergegeven in het geheugen. De structuur maakt gebruik van de leden Hoogte en Breedte om de logische afmetingen van het oppervlak te beschrijven. Beide leden worden gemeten in pixels. Daarom zijn de waarden voor hoogte en breedte voor een 640 x 480 oppervlak hetzelfde, ongeacht of het een 8-bits oppervlak of een 24-bits RGB-oppervlak is.

Wanneer u een oppervlak vergrendelt met behulp van de methode IDirect3DSurface9::LockRect, vult de methode een D3DLOCKED_RECT structuur in die de toonhoogte van het oppervlak bevat en een aanwijzer naar de vergrendelde bits. De waarde in het Pitch-lid beschrijft de geheugenhoogte van het oppervlak, ook wel 'stride' genoemd. Pitch is de afstand, in bytes, tussen twee geheugenadressen die het begin van één bitmaplijn en het begin van de volgende bitmaplijn vertegenwoordigen. Omdat de toonhoogte wordt gemeten in bytes in plaats van pixels, heeft een oppervlak van 640x480x8 een zeer andere pitchwaarde dan een oppervlak met dezelfde afmetingen, maar een andere pixelindeling. Daarnaast weerspiegelt de pitchwaarde soms bytes die Direct3D als cache heeft gereserveerd, dus het is niet veilig om ervan uit te gaan dat pitch alleen de breedte is vermenigvuldigd met het aantal bytes per pixel. Visualiseer liever het verschil tussen breedte en toonhoogte, zoals wordt weergegeven in het volgende diagram.

diagram van de pitch en breedte voor dezelfde voorbuffer, achterbuffer en cache

In dit diagram zijn de voorbuffer en de achterbuffer zowel 640x480x8 als de cache 384x480x8.

Wanneer u rechtstreeks toegang krijgt tot oppervlakken, moet u ervoor zorgen dat u binnen het geheugen blijft dat is toegewezen voor de afmetingen van het oppervlak en dat u geen geheugen meer hebt gereserveerd voor de cache. Bovendien moet u, wanneer u slechts een deel van een oppervlak vergrendelt, binnen de rechthoek blijven die u opgeeft bij het vergrendelen van het oppervlak. Als u deze richtlijnen niet volgt, zijn er onvoorspelbare resultaten. Wanneer u rechtstreeks in surface memory wordt weergegeven, gebruikt u altijd de pitch die wordt geretourneerd door de methode IDirect3DSurface9::LockRect. Ga niet uit van een pitch op basis van de weergavemodus. Als uw toepassing op sommige beeldschermadapters werkt, maar er vervormd uitziet op andere, kan dit de oorzaak van het probleem zijn.

Zie Toegang tot Surface Memory Directly (Direct3D 9)voor meer informatie.

Direct3D Surfaces