Compressie blokkeren
Vanaf Windows 8.1 ondersteunt Direct2D verschillende blok gecomprimeerde pixelindelingen. Daarnaast bevat Windows 8.1 een nieuwe DDS-codec (Windows Imaging Component) om gecomprimeerde blokafbeeldingen in de DDS-bestandsindeling te laden en op te slaan. Blokcompressie is een techniek voor het verminderen van de hoeveelheid grafische geheugen die wordt gebruikt door bitmapinhoud. Door blokcompressie te gebruiken, kan uw app het geheugenverbruik en de laadtijden voor dezelfde resolutieafbeeldingen verminderen. Of uw app kan meer of hogere resolutieafbeeldingen gebruiken terwijl u nog steeds dezelfde GPU-geheugenvoetafdruk gebruikt.
Blokcompressie is al lange tijd gebruikt door Direct3D-toepassingen en met Windows 8.1 zijn ook beschikbaar voor mainstream- en Direct2D-toepassingsontwikkelaars.
In dit onderwerp wordt beschreven hoe blokcompressie werkt en hoe u deze kunt gebruiken in WIC en Direct2D.
Over blokcompressie
Blokcompressie (BC) verwijst naar een klasse van compressietechnieken voor het verminderen van textuurgrootten. Direct3D 11 ondersteunt maximaal 7 verschillende BC-indelingen, afhankelijk van functieniveau. In Windows 8.1 Direct2D wordt ondersteuning geïntroduceerd voor de BC1-, BC2- en BC3-indelingen die beschikbaar zijn voor alle functieniveaus.
Hoe blokcompressie werkt
De gecomprimeerde blokindelingen gebruiken allemaal dezelfde basistechniek om de ruimte te verminderen die wordt gebruikt door kleurgegevens. In deze sectie vindt u een overzicht van het eenvoudigste algoritme, BC1. Zie Blokcompressievoor een gedetailleerdere uitleg.
Ten eerste is de afbeelding onderverdeeld in blokken van 4 bij 4 pixels. Elk blok wordt afzonderlijk gecomprimeerd.
Notitie
Dit betekent dat de breedte en hoogte van een afbeelding elk een veelvoud van 4 pixels moeten zijn om deze te kunnen comprimeren.
In deze voorbeeldafbeelding ziet u een blok van 4x4 pixels in een afbeelding.
Vervolgens worden binnen een blok van 4 bij 4 twee referentiekleuren geselecteerd en gecodeerd als twee 16 bitswaarden (5 bits rood, 6 bits groen, 5 bits blauw). De keuze van deze kleuren is aanzienlijk van invloed op de beeldkwaliteit en is niet-trivieel. Twee tussenliggende kleuren worden berekend door lineair te interpoleren tussen de twee referentiekleuren in de RGB-kleurruimte. Dit produceert in totaal 4 verschillende kleuren; aan elke kleur wordt een twee-bits indexwaarde toegewezen. Houd er echter rekening mee dat alleen de twee eindpuntkleuren moeten worden opgeslagen omdat de interpolatie is opgelost.
In deze afbeelding worden kleuren 0 en 3 geselecteerd als referentiekleuren voor het blok, terwijl kleuren 1 en 2 worden berekend met behulp van lineaire interpolatie.
Ten slotte wordt elke pixel in het blok toegewezen aan een van de vier eerder berekende kleuren en wordt elke pixel gecodeerd met behulp van de twee bitsindexwaarde.
De totale hoeveelheid gegevens die wordt gebruikt om deze 16 pixels weer te geven, is:
16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits
Dit resulteert in een gemiddelde dichtheid van 4 bits per pixel. Ter vergelijking verbruikt de algemene DXGI_FORMAT_B8G8R8A8_UNORM pixelindeling 32 bits per pixel.
In dit diagram ziet u dat elke pixel wordt gecodeerd als een 2-bits index. Het hele blok wordt gecodeerd in 64 bits.
Er zijn variaties ter ondersteuning van alfagegevens en verschillende aantallen kleurkanalen. BC6H en BC7 gebruiken aanzienlijk verschillende algoritmen om respectievelijk HDR-inhoud (High Dynamic Range) te ondersteunen en de beeldkwaliteit te verhogen.
DDS-bestandsindeling (DirectDraw Surface)
Gecomprimeerde blokgegevens worden doorgaans opgeslagen in DDS-bestanden (DirectDraw Surface) bestanden. Mogelijk bent u bekend met DDS-bestanden als u een Direct3D-ontwikkelaar bent. Direct2D ondersteunt alleen bepaalde DDS-functies; Zie DDS-vereistenvoor meer informatie.
Voordelen van blokcompressie
Gecomprimeerde blokindelingen verschillen van veelgebruikte indelingen voor afbeeldingscompressie in de branche, zoals JPEG, omdat BC-indelingen systeemeigen worden ondersteund door moderne GPU's. Dit betekent dat u een blok gecomprimeerde installatiekopie rechtstreeks kunt laden op de GPU zonder decoderen of decomprimeren. BC-indelingen verbruiken gemiddeld 4 tot 8 bits per pixel; in vergelijking met een typische ongecomprimeerde 32-bits per pixel BGRA-bitmap, resulteert dit in geheugenbesparing van 75% tot 87,5%. Omdat er geen decodestap is, wordt de tijd voor het laden van een BC-afbeelding aanzienlijk verminderd in vergelijking met indelingen zoals JPEG.
Wanneer gebruikt u blokcompressie
Overweeg het gebruik van gecomprimeerde blokafbeeldingen in uw app in plaats van andere indelingen, zoals JPEG, als u het geheugenverbruik van bitmaps wilt verminderen of de decoderen en laadtijden wilt verminderen.
Blokcompressie is echter niet geschikt voor alle gevallen en vereist enkele compromissen. Ten eerste zijn de algoritmen voor blokcompressie lossy. Blokcompressie werkt goed met natuurlijke fotografische inhoud, maar kan ongewenste visuele artefacten introduceren in afbeeldingen met scherpe, hoge contrastgrenzen, zoals door de computer gegenereerde schermopnamen. Zorg ervoor dat de gecomprimeerde afbeeldingsassets van uw blok acceptabele afbeeldingskwaliteit hebben voordat u deze gebruikt.
Ten tweede verbruiken gecomprimeerde DDS-bestanden meestal meer ruimte op schijf dan vergelijkbare JPEG-afbeeldingen. Hierdoor worden de pakketgrootte en netwerkbandbreedtevereisten van uw app verhoogd.
Blokcompressie gebruiken
In deze sectie wordt uitgelegd hoe u gecomprimeerde blokassets in een Direct2D-app genereert en gebruikt.
Overzicht
Gecomprimeerde DDS-bestanden blokkeren zijn een door runtime geoptimaliseerde indeling, wat betekent dat ze specifiek zijn geoptimaliseerd voor goede prestaties tijdens app-runtime. U wordt aangeraden uw bestaande pijplijn voor het maken en bewerken van assets te blijven gebruiken en alleen te converteren naar een blok gecomprimeerde indeling wanneer u ze in uw toepassingsproject importeert of tijdens het bouwen.
DDS-vereisten
De DDS-bestandsindeling is ontworpen ter ondersteuning van een breed scala aan functies die worden gebruikt in Direct3D. Direct2D maakt alleen gebruik van een subset van deze functies. Houd daarom rekening met de volgende beperkingen wanneer u DDS-installatiekopieën maakt voor gebruik met Direct2D:
- Alleen de volgende DXGI_FORMAT waarden zijn toegestaan:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
- Vooraf gedefinieerde alfagegevens moeten worden gebruikt. Dit omvat verouderde DDS-bestanden met indelingen die expliciet vooraf gedefinieerde alfa (DXT1, DXT2, DXT4) en DDS-bestanden die gebruikmaken van de DDS_HEADER_DX10 structuur met de DDS_ALPHA_MODE_OPAQUE en DDS_ALPHA_MODE_PREMULTIPLIED waarden.
- De X- en Y-afmetingen moeten veelvouden van 4 pixels zijn.
- Volumetextuur, kubuskaarten, mipmaps of bitmapmatrices zijn niet toegestaan. Gebruik slechts enkele framebroninstallatiekopieën.
Gecomprimeerde blokassets genereren
Er zijn verschillende DDS-ontwerpprogramma's beschikbaar voor het maken of converteren van gecomprimeerde DDS-bestanden. Niet alle hulpprogramma's ondersteunen de vereisten voor het gebruik van DDS-bestanden met Direct2D, zoals beschreven in de vorige sectie.
Vanaf Visual Studio 2013 kunt u visual Studio bestaande visuele assets, zoals JPEG en PNG, laten converteren naar de juiste gecomprimeerde DDS-blokindeling als een automatisch onderdeel van uw buildproces. Dit wordt bereikt met behulp van de aangepaste buildstap Afbeeldingsinhoudstaak.
Zie voor meer informatie over het instellen van dit voor uw project: How to: Export a Texture for Use with Direct2D or Javascipt Apps.
Direct2D-API's
Direct2D wordt bijgewerkt in Windows 8.1 ter ondersteuning van de volgende pixelindelingen:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
Voor de voorgaande notaties moet u premultiplied alfa gebruiken. Bovendien zijn deze indelingen alleen geldig voor gebruik als bron, niet als doel. Dit betekent bijvoorbeeld dat u een Direct2D-bitmap kunt maken met BC1, maar geen apparaatcontext.
De volgende methoden worden bijgewerkt in Windows 8.1 ter ondersteuning van BC-indelingen:
- ID2D1DeviceContext::IsDxgiFormatSupported
- ID2D1DeviceContext::CreateBitmap
- ID2D1DeviceContext::CreateBitmapFromDxgiSurface
- ID2D1RenderTarget::CreateSharedBitmap
- ID2D1RenderTarget::CreateBitmapFromWicBitmap
- ID2D1Bitmap::CopyFromMemory
- ID2D1Bitmap::CopyFromBitmap
- ID2D1Bitmap1::GetSurface
Houd er rekening mee dat CreateBitmapFromWicBitmapIWICBitmapSource als interface gebruikt; In Windows 8.1 biedt WIC echter geen ondersteuning voor het verkrijgen van geblokkeerde gegevens uit IWICBitmapSource, en er is geen WIC-pixelindeling die overeenkomt met DXGI_FORMAT_BC1_UNORM, enzovoort. In plaats daarvan bepaalt CreateBitmapFromWicBitmap of de IWICBitmapSource een geldigE DDS-IWICBitmapFrameDecode is en de gecomprimeerde blokgegevens rechtstreeks laadt. U kunt de pixelnotatie expliciet opgeven in de D2D1_BITMAP_PROPERTIES1 struct of Direct2D toestaan om automatisch de juiste indeling te bepalen.
Windows Imaging Component-API's
Het Windows Imaging Component (WIC) voegt een nieuwe DDS-codec toe in Windows 8.1. Daarnaast worden er nieuwe interfaces toegevoegd die ondersteuning bieden voor toegang tot DDS-specifieke gegevens, waaronder gecomprimeerde pixelgegevens blokkeren:
Gecomprimeerde WIC-pixelindelingen blokkeren
Er zijn geen nieuwe wic blok gecomprimeerde pixelindelingen in Windows 8.1. Als u in plaats daarvan een IWICBitmapFrameDecode van de DDS-decoder verkrijgt en Copy Pixelsaanroept, ontvangt u standaard niet-gecomprimeerde pixels zoals WIC PixelFormat32bppPBGRA. U kunt IWICDdsFrameDecode::CopyBlocks gebruiken om de onbewerkte blok gecomprimeerde gegevens te verkrijgen in de vorm van een geheugenbuffer uit een DDS-bestand.
DDS-toegang met meerdere frames
Met de DDS-bestandsindeling kunnen meerdere gerelateerde afbeeldingen in één bestand worden opgeslagen. Een DDS-bestand kan bijvoorbeeld een kubuskaart, volumepatroon of patroonmatrix bevatten, die allemaal kunnen worden aangepast. In Direct3D worden deze meerdere afbeeldingen weergegeven als subresources. In WIC worden meerdere afbeeldingen weergegeven als frames (IWICBitmapFrameDecode en IWICBitmapFrameEncode).
WIC ondersteunt alleen het begrip van één dimensionale matrix van frames, terwijl DDS drie onafhankelijke dimensies ondersteunt (hoewel slechts twee in één bestand kunnen worden gebruikt). WIC biedt handige methoden voor het toewijzen van een DDS-subresource en WIC-frame. Voor decodering kunt u IWICDsDecoder::GetFrame kunt u de matrixindex, het mip-niveau en de segmentindex van de subresource opgeven en het juiste WIC-frame retourneren.
Voor codering berekent IWICDdsEncoder::CreateNewFrame de resulterende matrixindex, het mip-niveau en de segmentindex berekenen wanneer u een nieuw frame maakt. U moet eerst IWICDdsEncoder::SetParameters hebben aangeroepen om de DDS-specifieke bestandsparameters te definiëren.
Verwante onderwerpen