Een Texture Atlas gebruiken om je spel te optimaliseren

Tijd. Maanden. Misschien jaren. Je hebt je tijd (veel tijd) besteed om je spel te maken. Klein of groot, het maakt niet uit. Het is jouw spel en nu wil je het delen met de hele wereld - en misschien beroemd en rijk worden *. Het is perfect: de kunst is goed en je bent erg trots op je idee in het spel. Jouw spel.

Maar er is een laatste probleem dat u moet op te lossen vóór de release. Nee, geen eenvoudig probleem. Het probleem: de framesnelheid van je spel is laag. Heel laag. En dat betekent maar één ding: je moet een manier vinden om het te repareren. Jij moet. En je hebt geen idee hoe.

Geen paniek: er is een eenvoudige truc die je kan helpen. Het wordt een "textuuratlas" genoemd.

* Als je rijk wordt dankzij dit artikel, onthoud dan alsjeblieft. Heel erg bedankt!

Wat is een textuuratlas?

Als je voor de eerste keer de ontwikkeling van een 3D-videogame nadert, zul je beginnen te ontdekken dat 3D-afbeeldingen uit verschillende delen bestaan: 3D-netten, texturen, deeltjessystemen en vele andere elementen die meestal op het scherm worden getekend 30 keer per seconde (in jargon: 30 fps) tijdens het renderingproces, waardoor de wereld van het spel gevarieerd en levendig wordt.

Geloof het of niet, de eerste 3D-videogames die ik in mijn leven zag, hadden geen van deze elementen. Ze waren alleen samengesteld uit lijnen die objecten of elementen vormden in 3D draadframe.

Als ik dit schrijf, voel ik me zeker oud.

Terug naar ons (inderdaad, naar u) en naar de belangrijke dingen, vandaag zullen we het hebben over de texturen van de gebruikersinterface (UI hierna) en, bij uitbreiding, over alle texturen in het spel.

In een 3D-game is de gebruikersinterface meestal gemaakt van 3D-elementen (zoals vlakken of kaders) met texturen.

We noemden het vóór het weergaveproces: het is de bewerking waarmee de elementen in het geheugen fysiek op het scherm worden getekend. Het is een van de meest complexe en dure processen die zich voordoen in een real-time 3D-game. Dan is elk hulpmiddel om de tijd die dit proces kostte te verkorten welkom; minder tijd doorgebracht in de renderfase betekent een hogere framesnelheid (maw als je de 60 fps bereikt, kun je de afbeelding twee keer renderen en dan denken aan het ontwikkelen van je game ook voor VR), of meer schermelementen (en dan een rijker spel, meer geanimeerd, mooier).

Een van de manieren om de duur van het renderingproces te verkorten is een Texture Atlas: het is niets meer dan een afbeelding die veel texturen bevat.

Hoe een textuuratlas werkt

Opmerking: zoals vermeld in de vorige paragraaf bespreekt dit artikel de Texture Atlas toegepast op de gebruikersinterface. Veel van de hier toegelichte concepten kunnen echter ook worden toegepast op 3D-modellen en hun texturen.

Een Texture Atlas, zeiden we, is een verzameling texturen binnen een enkele afbeelding.

Een atlas wordt meestal geassocieerd met een bestandsdescriptor, die aan het spel aangeeft waar een textuur is (in bepaalde x- en y-coördinaten), om het op te halen.

Afhankelijk van het systeem dat u gaat gebruiken voor het genereren en beheren van de Atlas, heeft u min of meer opties, zoals de afstand tussen de afbeeldingen waaruit het bestaat (verkleining van het risico van artefacten aan de randen van de textuur, veroorzaakt door een overlapping van twee elementen), of de mogelijkheid om de elementen te roteren om de ruimte binnen de Atlas te optimaliseren (meer geoptimaliseerde ruimte betekent meer afbeeldingen binnen dezelfde Atlas).

Verschillende manieren om een ​​textuuratlas te maken

Er zijn verschillende manieren om een ​​Atlas te maken. Een complete ontwikkelomgeving maakt meestal het interne beheer van de Atlas mogelijk; er zijn ook veel externe tools die veel extra opties bieden.

De keuze van welk systeem te gebruiken hangt natuurlijk af van uw persoonlijke voorkeuren. Hier leggen we twee van hen uit: Sprite Packer, intern voor Unity, en TexturePacker (een stand-alone tool, tegen betaling).

Sprite Packer

Om Sprite Packer te openen, kiest u uit het menu Venster> Sprite Packer.

Het beheer is heel eenvoudig: het knoppakket wordt gebruikt om een ​​of meer atlassen te maken (dit hangt af van het aantal afbeeldingen en van de Atlas-dimensie die u wilt gebruiken).

Nu kunt u een afbeelding selecteren om te zien waar deze zich in de Atlas bevindt. Als u afbeeldingen uit uw project toevoegt of verwijdert, moet u de knop Opnieuw pakken gebruiken om de Atlas bij te werken.

Om de Sprite Packer te configureren, kunt u kiezen uit het menu Bewerken> Projectinstellingen> Editor; hier kun je de Atlas uitschakelen, deze alleen activeren voor de ingebouwde game of deze altijd inschakelen.

Voor meer informatie over Sprite Packer, kunt u de officiële gids raadplegen.

Texture Packer

Texture Packer is een op zichzelf staande tool die wordt gebruikt om Atlas te beheren.

U kunt een of meer mappen uit uw project toevoegen en Texture Packer maakt de Atlas.

Hierna kunt u het gegevensformaat kiezen voor de export. Zoals u kunt zien, is er ook de optie "JSON voor eenheid". Dit betekent dat u uw Atlas voor uw Unity-project kunt exporteren. Maar om ze samen te kunnen gebruiken, moet u een gratis editoruitbreiding installeren vanuit de activawinkel.

Voor meer informatie over Texture Packer, kunt u de officiële gids raadplegen.

Waarom is het belangrijk om een ​​textuuratlas te gebruiken?

Maar waarom is het zo belangrijk om meerdere afbeeldingen te verzamelen in een grotere??

Laten we even teruggaan naar het renderingproces: als elk element van de gebruikersinterface een afzonderlijke structuur heeft, wordt het getekend met een afzonderlijke 'tekenaanroep'. Dit betekent dat als we in onze interface het pictogram van harten hebben (die de energie van de speler vertegenwoordigt) en het pictogram van de verzamelde munten, we twee draw-calls zullen hebben.

Elke tekenbeurt duurt enige tijd om te voltooien, waardoor het renderingproces steeds langer wordt. Als er vijf UI-elementen zijn, in plaats van twee zoals in het bovenstaande voorbeeld, zijn er vijf tekenoproepen.

Begin je het punt te zien??

Meer draw-calls -> meer tijd tijdens de renderingfase -> minder fps -> game met een lage framesnelheid (met enkele frame-drops) of minder elementen op het scherm (dan visueel slecht).

Het verspillen van draw-calls op deze manier, tenzij er speciale redenen zijn, is niet echt logisch, vooral voor de gebruikersinterface.

In feite zullen alle texturen in een Atlas samen worden weergegeven, in een enkele doorgang.

Conclusie

Tot slot, vooral als u een game ontwikkelt op een platform waar prestaties echt belangrijk zijn (zoals een mobiel platform):

  • U moet letten op het aantal draw calls: meer draw calls betekent een hogere rendering tijd (en een hogere rendering tijd betekent het risico van een lage framesnelheid).
  • Over het algemeen kan elk object met een andere textuur een enkele tekenaanroep genereren (het is een algemene verklaring: er zijn enkele uitzonderingen, met name in het geval van 3D-objecten).
  • Een manier om het aantal tekenoproepen te verlagen, is door een Texture Atlas te gebruiken.
  • Een Texture Atlas is in feite een grote textuur met een groep verschillende texturen.
  • Alle objecten die dezelfde Texture Atlas gebruiken, genereren één tekenoproep.
  • Vooral voor de UI-texturen is het gebruik van een Texture Atlas een must-have om de prestaties van uw project te verbeteren.

En ... moge de kracht bij je zijn. En je code. Altijd.