Does PVRTC support ASTC texture compression?

Revolutionér Dine iOS-Teksturer: PVRTC vs. ASTC

23/03/2024

Rating: 4.17 (2842 votes)

I mange år har PVRTC været standarden for teksturkomprimering på iOS-enheder, især inden for spiludvikling med motorer som Unity. Det har været den foretrukne metode til at reducere filstørrelser og hukommelsesforbrug. Men med introduktionen af A8-processoren og nyere, understøtter iOS nu også ASTC-teksturkomprimering, en mere avanceret og potentielt langt bedre løsning. Mange udviklere er stadig uvidende om denne mulighed eller udnytter den ikke fuldt ud, hvilket kan føre til suboptimale resultater både visuelt og ydeevnemæssigt. Denne artikel vil dykke ned i forskellene mellem PVRTC og ASTC, belyse deres fordele og ulemper, og give dig indsigt i, hvordan du kan optimere dine applikationer og spil ved at vælge den rette komprimeringsmetode.

Does PVRTC support ASTC texture compression?
PVRTC texture compression format has been a long time default, but did you know from A8 processor onwards the device now supports ASTC texture compression? (and perhaps you are not taking advantage of it) In this blog post we will compare it against PVRTC.

Når vi taler om, at en enhed 'understøtter' en komprimeringsmetode, betyder det, at den kan bruge det komprimerede billede direkte på grafikkortet uden først at skulle dekomprimere det. Dette er hele pointen med at bruge disse specialiserede formater i stedet for generelle formater som PNG, som altid skal dekomprimeres til RGBA32 (ubearbejdet, pixel-perfekt) i RAM'en, før de kan bruges af GPU'en. Hvis Unity (eller en anden motor) registrerer, at en enhed ikke understøtter et bestemt komprimeringsformat, vil teksturen automatisk blive dekomprimeret til RGBA32 i RAM'en, hvilket eliminerer den hukommelsesbesparelse, du ellers ville opnå fra komprimeringen. Selvom dette stadig reducerer den oprindelige app-størrelse, går fordelen ved den lave RAM-brug tabt, og i nogle tilfælde kan selve dekomprimeringsprocessen ved indlæsning forårsage forsinkelser.

Indholdsfortegnelse

Hvorfor Teksturkomprimering er Afgørende for Mobiludvikling

I mobiludvikling er ressourceoptimering ikke bare en god idé; det er en absolut nødvendighed. Mobiltelefoner og tablets har begrænset RAM, begrænset lagerplads og begrænset båndbredde mellem CPU/RAM og GPU. Store, ukomprimerede teksturer kan hurtigt dræne disse ressourcer, hvilket fører til længere indlæsningstider, lavere billedhastigheder, øget batteriforbrug og i værste fald app-nedbrud på grund af utilstrækkelig hukommelse. Teksturkomprimering reducerer filstørrelsen på dine billedaktiver, hvilket minimerer den plads, din app optager på brugerens enhed. Endnu vigtigere er det, at den reducerer den mængde RAM, der kræves for at holde teksturerne klar til GPU'en. Dette frigør værdifuld hukommelse til andre app-processer og data, hvilket bidrager til en mere flydende og stabil brugeroplevelse.

PVRTC: Den Gamle Standard

PVRTC (PowerVR Texture Compression) har længe været Apples standard for teksturkomprimering på iOS-enheder, da mange af deres tidlige chips brugte PowerVR-arkitekturen. Det er et tabsgivende komprimeringsformat, hvilket betyder, at en vis mængde billedkvalitet går tabt under komprimeringen. PVRTC tilbyder typisk to komprimeringsgrader: 2 bit per pixel (bpp) og 4 bpp. 2 bpp giver den mindste filstørrelse og den laveste kvalitet, mens 4 bpp giver en større filstørrelse, men bedre kvalitet.

Udfordringer og Artefakter med PVRTC

Fra erfaring har PVRTC en bemærkelsesværdig svaghed, især i billeder med høj kontrast, skarpe omrids og et alfakanal, som ofte ses i 2D-sprites eller anime-inspirerede spil. Mens det fungerer rimeligt godt med realistiske teksturer med en vis grad af tilfældighed, kæmper det med rene linjer og farveovergange. Typiske artefakter inkluderer:

  • Smear (Udtværing): Dette sker ofte på skarpe hjørner eller steder, hvor en sort omrids møder et lysere farveområde. I stedet for en ren overgang bliver omridset udvisket og gradueret ind i den lysere farve, hvilket giver et urent og sløret udtryk. Dette er særligt tydeligt i UI-elementer, hvor rene linjer er afgørende.
  • Farvetrapper: På buede områder kan PVRTC producere synlige 'trapper' af lysere farver, som ikke var til stede i det originale billede.
  • Inkonsekvent udtværing af skrifttyper: Tekst på UI-elementer kan lide under, at kanterne bliver uensartet udviskede, hvilket gør teksten sværere at læse og mindre professionel at se på.
  • Dashed (Stiplede linjer): Et andet mærkeligt artefakt, hvor PVRTC kan skabe stiplede linjer, der ikke eksisterede i det originale billede, ofte ved siden af lige linjer. Dette kan give et uønsket 'takket' udseende, især på UI-elementer, som ofte indeholder mange lige linjer.

Det er værd at bemærke, at PVRTC's artefakter kan være uforudsigelige. Nogle gange kan selv små forskydninger af en tekstur i et spritesheet ændre artefaktmønsteret, hvilket kan være frustrerende for udviklere, der stræber efter pixel-perfektion.

ASTC: Den Nye Generation

ASTC (Adaptive Scalable Texture Compression) er et nyere, mere avanceret tabsgivende komprimeringsformat, der tilbyder større fleksibilitet og ofte bedre billedkvalitet end PVRTC, især ved sammenlignelige filstørrelser. En af de store fordele ved ASTC er dens 'blokstørrelse'-optioner, som giver dig finere kontrol over komprimeringsforholdet og dermed kvaliteten. I Unity kan du typisk vælge blokstørrelser som 4x4, 5x5, 6x6, 8x8, 10x10 og 12x12. En 4x4-blokstørrelse giver den højeste kvalitet (og største fil) med den mindste komprimering, mens en 12x12-blokstørrelse giver den mindste filstørrelse (og laveste kvalitet) med den største komprimering.

Fordele og Artefakter med ASTC

Hvor PVRTC's artefakter kan være uforudsigelige og 'smeary', er ASTC's artefakter typisk mere 'blokagtige' og mindre tilfældige. Selvom du ved aggressive komprimeringsforhold (f.eks. 12x12) tydeligt kan se de firkantede blokke, som algoritmen bruger, opfattes dette ofte som visuelt bedre end PVRTC's udsmøring. For eksempel, selv ved ASTC 12x12, som giver en endnu mindre filstørrelse end PVRTC 2 bit, kan den visuelle kvalitet føles bedre, da artefakterne er mere konsistente og mindre forstyrrende, selvom de kan være tydelige på fine detaljer som øjne.

Ved den bedste ASTC-kvalitet, f.eks. 4x4 blokstørrelse, er det ofte utroligt svært at skelne den komprimerede tekstur fra den ukomprimerede RGBA32-version. ASTC 4x4 kan nærmest betragtes som en 'næsten tabsfri' komprimering i visse tilfælde, hvilket er imponerende givet de betydelige hukommelsesbesparelser den tilbyder (f.eks. 64.7 KB for en 256x256 ASTC 4x4 versus 256.7 KB for RGBA32).

Sammenligning af PVRTC og ASTC

Lad os se på en direkte sammenligning af disse to formater baseret på typiske resultater:

EgenskabPVRTC (2 bit / 4 bit)ASTC (4x4 / 8x8 / 12x12)
Understøttede EnhederAlle iOS-enhederiOS-enheder med A8-processor og nyere
Kvalitet (generelt)Lavere, især med skarpe kanter/alfa. Synlige 'smear' og 'dashed' artefakter.Højere, især med 4x4. Artefakter er mere 'blokagtige' og mindre forstyrrende. Næsten tabsfri ved 4x4.
FilstørrelseMeget lille (2 bit). Moderat lille (4 bit).Meget variabel, fra lille (12x12) til moderat (4x4). Ofte mindre end PVRTC ved sammenlignelig eller bedre kvalitet.
RAM-forbrugKomprimeret på alle understøttede enheder.Komprimeret på A8+ enheder. Dekomprimeret til RGBA32 på ældre enheder (A7 og ældre).
Egnet tilFotorealistiske teksturer med tilfældighed.Alle typer teksturer, især 2D-sprites, UI-elementer og tekst.
FleksibilitetLav (kun 2 eller 4 bit).Høj (flere blokstørrelser giver fin kontrol over kvalitet/størrelse).

Enheds Kompatibilitet og RAM-forbrug

Den afgørende faktor for, om du kan udnytte ASTC fuldt ud, er enhedens processor. Som nævnt kræver ASTC en A8-processor eller nyere for at understøttes nativt af hardwaren. Hvad sker der, hvis du bruger ASTC på en ældre enhed?

  • På enheder med A8-processor eller nyere (f.eks. iPhone SE (A9)): ASTC-teksturer forbliver komprimerede i RAM'en. Dette betyder, at en 2048x2048 ASTC-tekstur, der måske fylder 4MB på disken, også kun vil optage 4MB i RAM'en. Dette er den ønskede adfærd, da det optimerer både lagerplads og hukommelsesforbrug.
  • På enheder med ældre processorer (f.eks. iPod Touch Gen 5 (A5), iPad mini 2 (A7)): Selvom din applikation kan inkludere ASTC-teksturer, vil enheden ikke understøtte formatet nativt. Dette betyder, at Unity (eller iOS selv) vil dekomprimere teksturen til RGBA32 i RAM'en. Resultatet er, at en 2048x2048 ASTC-tekstur, der måske fylder 4MB på disken, pludselig vil optage 16MB i RAM'en – den samme størrelse som den ukomprimerede version. Selvom du stadig nyder godt af den mindre app-størrelse, går den vigtigste RAM-besparelse tabt. Desuden skal du være opmærksom på, at selvom RAM-størrelsen er den samme som RGBA32, er den visuelle kvalitet stadig den af den komprimerede ASTC-tekstur – du får altså den forringede kvalitet, men uden hukommelsesbesparelsen.

Denne dekomprimeringsproces kan også tage tid. Hvis en scene, der er kritisk for spilleroplevelsen, indlæser mange store, ikke-understøttede ASTC-teksturer, kan det føre til mærkbare forsinkelser eller endda et midlertidigt 'frys' af appen, mens dekomprimeringen finder sted. Dette er især kritisk for spil, hvor hurtig sceneindlæsning er afgørende.

Praktiske Implikationer for Udviklere

Valget mellem PVRTC og ASTC har vidtrækkende konsekvenser for din applikations ydeevne og kompatibilitet.

Manuel Indstilling af Komprimering i Unity

Da PVRTC længe var standarden for Unity iOS-udvikling, skal du ofte manuelt indstille komprimeringsformatet til ASTC for de teksturer, hvor du ønsker at udnytte det. Dette gøres typisk i importindstillingerne for hver tekstur i Unity-editoren under iOS-platformspecifikke indstillinger.

Strategier for Håndtering af Ældre Enheder

Apple understøtter ikke flere app-binarier på samme måde som Google Play Butik, hvilket gør det svært at levere en ASTC-optimeret version til nye enheder og en PVRTC-optimeret version til ældre enheder gennem App Store. Du har et par strategier:

  1. Ignorer ældre enheder: Hvis din målgruppe primært bruger nyere enheder, kan du vælge at bruge ASTC konsekvent. Ældre enheder vil dekomprimere teksturerne i RAM, hvilket kan øge hukommelsesforbruget og potentielt føre til problemer. Dette kan være acceptabelt, hvis kun få, men vigtige teksturer (f.eks. UI-elementer) bruger ASTC, og du har tilstrækkelig RAM-margin.
  2. Blandede Formater: For kritiske UI-elementer eller store spritesheets, hvor PVRTC's artefakter er uacceptable, kan du vælge ASTC 4x4 for den bedste kvalitet. For mindre kritiske teksturer, eller dem der fungerer fint med PVRTC, kan du holde dig til PVRTC for at spare RAM på ældre enheder.
  3. Målretning via iOS-version/Hardware: Selvom det er svært at garantere A8+ processorer, kan du i Info.plist filen i dit Xcode-projekt specificere krav til hardware. For eksempel kan du kræve 64-bit CPU'er, hvilket eliminerer nogle af de ældre enheder, men ikke nødvendigvis alle før A8. Dette er dog en usikker metode, da ældre iPads som iPad mini 2 stadig kan køre nyere iOS-versioner.

RAM-grænser og App-Genstart

Det er afgørende at forstå, at selvom din app ikke direkte crasher på grund af for højt RAM-forbrug, kan iOS genstarte din app, hvis den overskrider visse RAM-grænser, når brugeren skifter til en anden app og derefter vender tilbage. Dette er en frustrerende oplevelse for brugeren, da de mister deres fremskridt. Hvis du vælger at 'kamikaze' RAM'en ved at bruge ikke-understøttede ASTC-teksturer på ældre enheder, bør du implementere et robust system til at gemme spillets eller appens tilstand, så brugeren kan fortsætte, hvor de slap, selv efter en genstart.

Ydeevne ved Dekomprimering

Advarslen 'format is not supported, decompressing texture' er ikke kun en note om hukommelsesforbrug, men også en indikation af en potentiel ydeevneflaskehals. Dekomprimeringen kan tage betydelig tid, især for store teksturer. Hvis dette sker ved en sceneindlæsning, der skal være øjeblikkelig, kan det forringe brugeroplevelsen. Overvej at indlæse sådanne teksturer manuelt og asynkront efter scenens start, hvis det er muligt, for at sprede belastningen.

Ofte Stillede Spørgsmål om Teksturkomprimering

Hvad er den bedste komprimeringsmetode for mine teksturer?

For iOS-enheder med A8-processor og nyere er ASTC 4x4 ofte den bedste balance mellem kvalitet og filstørrelse. For ældre enheder er PVRTC 4 bit den sikreste løsning, hvis du vil undgå den høje RAM-brug fra dekomprimering af ASTC.

Vil brug af ASTC gøre min app langsommere på ældre enheder?

Nej, ikke nødvendigvis langsommere i selve spillet, men det vil øge RAM-forbruget markant, da ASTC-teksturer dekomprimeres til RGBA32. Dette kan føre til tidligere app-genstarter fra iOS. Dekomprimeringen ved indlæsning kan også forsinke scenens start.

Kan jeg bruge både PVRTC og ASTC i samme app?

Ja, absolut. Du kan vælge komprimeringsformat per tekstur i Unity. Dette giver dig fleksibilitet til at optimere specifikke aktiver baseret på deres vigtighed for kvalitet og ydeevne, samt deres sandsynlighed for at blive set på ældre enheder.

Hvordan tjekker jeg, om min enhed understøtter ASTC?

I Xcode kan du bruge GPU-debuggeren til at se, hvilke teksturformater der bruges. Hvis en ASTC-tekstur vises som et RGBA-format i hukommelsen, understøtter enheden den ikke nativt. Alternativt kan du i Unity's build log se hukommelsesforbruget for dine teksturer. Hvis en stor ASTC-tekstur (f.eks. 2048x2048 ASTC 4x4, der fylder ~4MB på disk) pludselig optager 16MB i RAM, ved du, at den er blevet dekomprimeret.

Skal jeg altid bruge den højeste kvalitet (f.eks. ASTC 4x4)?

Ikke nødvendigvis. Selvom ASTC 4x4 giver den bedste kvalitet, fylder den også mest. For mindre vigtige teksturer, baggrunde eller elementer, der ikke ses i høj opløsning, kan en mere aggressiv komprimering som ASTC 8x8 eller endda 12x12 være tilstrækkelig og spare værdifuld plads og RAM.

Konklusion

ASTC repræsenterer et betydeligt fremskridt inden for teksturkomprimering på iOS, og for enheder med A8-processor eller nyere tilbyder det generelt en markant bedre visuel kvalitet end PVRTC, ofte med en tilsvarende eller endda mindre filstørrelse. Hvis din applikation primært målretter mod nyere iOS-enheder, er det en 'no-brainer' at skifte til ASTC for at opnå den bedst mulige klarhed og ydeevne. Husk, at målet er at opnå den mindst mulige spilstørrelse, den bedst mulige kvalitet og at holde sig inden for RAM-grænsen.

For applikationer, der stadig skal understøtte ældre enheder (før A8-processoren), kræver brugen af ASTC en mere nuanceret tilgang. Selvom ASTC-teksturer stadig vil reducere din apps samlede størrelse, vil de blive dekomprimeret i RAM'en på ældre enheder, hvilket eliminerer RAM-besparelserne og potentielt kan føre til forsinkelser ved indlæsning eller app-genstarter. I disse tilfælde skal du omhyggeligt afveje fordelene ved ASTC's visuelle kvalitet mod den øgede RAM-brug og de potentielle ydeevneproblemer. En hybridstrategi, hvor kun de mest visuelt kritiske elementer bruger ASTC, mens resten forbliver i PVRTC, kan være den mest hensigtsmæssige løsning. Ved at forstå disse nuancer kan du træffe informerede beslutninger, der optimerer din applikations ydeevne og brugeroplevelse på tværs af et bredt spektrum af iOS-enheder.

Hvis du vil læse andre artikler, der ligner Revolutionér Dine iOS-Teksturer: PVRTC vs. ASTC, kan du besøge kategorien Mobil.

Go up