Unity: Update Versus Fixeupdate

nog een artikel over wanneer de Update en Fixeupdated methoden gebruikt moeten worden.

TD;LR: het Hebben, vrij gemakkelijk, opnieuw het probleem van het mengen en bijpassende timesteps, heb ik mezelf ervan overtuigd dat ik dit spel staat in FixedUpdate methoden.

alvorens in te gaan op de inhoud van dit artikel, wilde ik verduidelijken waarom Ik ben geïnteresseerd in eenheid in de eerste plaats:

  • Ik heb niet veel interesse in het spelen of maken van Videospellen
  • ik heb wel interesse in het bouwen van nuttige tools (al vele jaren een webontwikkelaar)
  • Ik ben geen early adopter
  • Unity is een gevestigde oplossing voor het creëren van multi-platform 3D-ervaringen

met dit alles in gedachten, is het bouwen van praktische Web-powered Augmented Reality (AR) – oplossingen met Unity iets dat ik moet leren.

wat het leren van eenheid betreft, vond ik de officiële Unity tutorials niet bijzonder nuttig. Ik vond de Udemy cursus Unity 3D leren voor Absolute Beginners uitstekend.

Ik was door het materiaal aan het cruisen en merkte dat ik bezig was met het lesverschil tussen Update en FixedUpdate. Het onderzoeken van een beetje meer, de kern van het probleem was dat ik de volgende redenering niet begreep.

Update (); … gebruikt voor regelmatige updates zoals: bewegende niet-fysica objecten

FixedUpdate (); … gebruikt voor regelmatige updates zoals: Physics (Rigidbody) objecten aanpassen

Unity-Update and FixedUpdate-Unity officiële Tutorials

Er is nog iets meer onderzoek opgedoken:

tot slot zet al uw spellogica in Update of FixedUpdate. Niet mengen en match timesteps tenzij je bereid bent om de kogel te bijten en accepteren wat stotteren. Daarnaast is het sterk de moeite waard om alle spelstatus in FixedUpdate te zetten, waarbij Update uitsluitend wordt gebruikt voor gebruikersinvoer, visuele effecten en interpolatie tussen spelstatussen. Hoewel dit een verandering vereist hoe u uw games structureert, is het een bewezen ontwerpstructuur met vele voordelen.

— KinematicSoup — Timesteps and Acheiving Smooth Motion in Unity

een videoclip in het artikel illustreert het probleem van het mengen en matchen van timesteps.

alvorens dit advies te volgen I ik wilde het probleem van het mixen en matchen van timesteps op mijn eigen na te bootsen.

De definitieve versie van het project dat ik gebruikte bij het schrijven van dit artikel is beschikbaar om te downloaden.

Update Versus Fixeupdate

We moeten beginnen met een basiskennis van het verschil tussen de Update en Fixeupdate methoden. Ter illustratie maken we een leeg GameObject genaamd Setup en voegen we de volgende scriptcomponent toe:

Assets/Setup.cs (incompleet)

onze console-uitvoer na 3 seconden leek erop:

waarnemingen:

  • update wordt aangeroepen voor elke render; de frequentie (frame rate) hiervan varieert afhankelijk van de complexiteit van de rendering en het hostapparaat. Krachtige computers kunnen frame rates van meer dan 150fps te bereiken; mijn ontwikkeling computer werd uitgevoerd over 50fps. Minder dan 30 fps, wordt beschouwd als een slechte ervaring.
  • FixedUpdate wordt aangeroepen voor elke interne fysica-update (bewegende dingen als gevolg van de fysica, bijvoorbeeld zwaartekracht). Unity ‘ s vaste tijdstap staat standaard op 0,02; leidt tot FixedUpdate wordt 50 keer per seconde aangeroepen.

simulate Slow Frame Rate

om een slow frame rate (10fps) te simuleren, werken we de Setup bij.cs-script als volgt:

Assets / Setup.cs (incompleet)

onze console-uitvoer na 3 seconden leek erop:

Opmerkingen:

  • Instellen vSyncCount op 0 zet, wordt de Eenheid van het synchroniseren van maakt en het scherm refresh rates.
  • de werkelijke framesnelheid kan lager zijn dan de TARGET_FRAME_RATE vanwege de beperkingen van het hostapparaat en de complexiteit van de rendering.

handmatige animatie

om het effect van verschillende animaties te observeren, beginnen we met het plaatsen van een vaste kubus als referentie.

We add our first animated GameObject (Sphere) in front of it with the following script component.

Assets/Sphere.cs (incomplete)

Running it with the normal frame rate:

Running it with 10fps frame rate:

Observations:

  • uiteraard hebben we een probleem. We willen niet dat de animatiesnelheid afhankelijk is van de framesnelheid.
  • het probleem is omdat we de snelheid instellen op 0.1 eenheden / frame; we willen dat de snelheid wordt gemeten in eenheden / seconde.

de fix is om de snelheid in de eenheden van eenheden / seconde; 0,1 eenheden / frame * 50 frames / seconde = 5 eenheden / seconde. Dan gebruiken we tijd.deltaTime om de tijd sinds de laatste oproep om te updaten weten. Dan is de afgelegde afstand snelheid * deltaTime.

activa / sfeer.cs (incompleet)

Met deze oplossing krijgen we dezelfde animatie ongeacht de framesnelheid (maar met 10fps is het schokkerig zoals verwacht).

na gebruik van de verminderde frame rate om de noodzaak te illustreren om snelheid in eenheden/seconde te bieden, kunnen we commentaar geven op de regels in setup.cs die een trage frame rate simuleerde.

animatie in natuurkunde

in plaats van een GameObject handmatig te animeren, kunnen we het animeren door er fysica op toe te passen. We kunnen een cilinder animeren (die met 5 eenheden / seconde naar rechts beweegt) door:

  • creëren van een vlak (genaamd vlak)
  • creëren van een cilinder (genaamd cilinder)
  • voeg een Rigidbody component toe aan de cilinder (en de rotatie in alle richtingen bevriest)
  • Maak een fysisch materiaal, glad, zonder wrijving en breng het aan op zowel cilinder als vlak
  • Startcilinder met een beginsnelheid met behulp van een script component

activa/cilinder.cs

met dit op zijn plaats, kunnen we zien dat de bol en de cilinder naar rechts bewegen met dezelfde snelheid.

Opmerkingen:

  • De Bol positie is bijgewerkt onmiddellijk voorafgaand aan de render (handmatig in de Update-methode)
  • De Cilinder stand is bijgewerkt in de interne fysica update.

animatie met animatie

een derde manier om een GameObject te animeren is met een animatie (uiteraard). We kunnen een capsule animeren (een poging om 5 eenheden / seconde naar rechts te bewegen) door:

  • een capsule maken (Capsule genoemd)
  • een animatiecontroller maken (ook Capsule) en als component toevoegen aan het Capsule-GameObject.
  • een animatie aanmaken (ook Capsule).
  • maak In de animatiecontroller een status (Start) met de beweging ervan als de Capsule-animatie.
  • ten slotte animeren we de positie zodat de horizontale positie van de capsule 5 eenheden in 1 seconde is.

met dit op zijn plaats, kunnen we zien dat de bol, cilinder, capsule (bijna) met dezelfde snelheid naar rechts bewegen.

waarnemingen:

  • niet zeker waarom, maar de capsule bewoog iets sneller dan verwacht; problemen Schoten voor een tijdje en kwamen er niet achter waarom.
  • de positie van de Capsule kan worden geconfigureerd om te updaten voorafgaand aan het renderen (standaard) of tijdens de physics update.

implicatie ‘ s van een snelle framerate

Op krachtige computers, kan men framerates tot 150 FPS bereiken. Op deze computers met de standaard physics updates 50 keer per seconde (0,02 seconden tussen de updates), worden de elementen die vóór elke render worden bijgewerkt vaker bijgewerkt dan die in de physics updates. Deze discrepantie is de bron van problemen bij het mengen en matchen van tijdstappen.

hoewel ik de framesnelheid van mijn ontwikkelmachine niet kan verhogen (beperkt tot ongeveer 50 fps), kan ik de fysica-updates kunstmatig vertragen tot 10 updates per seconde (0.1 seconden tussen de updates) met behulp van de instellingen van het project.

zoals u kunt zien, door het mixen en matchen van timesteps hebben we het probleem opnieuw gemaakt (inconsistente beweging tussen spelelementen).

om te corrigeren, kunnen we de animatie van de Capsule wijzigen om bij te werken op physics updates, en ook het Script component van de Sphere als volgt bijwerken:

Assets / Sphere.cs

hiermee worden alle animaties consistent bijgewerkt voor elke physics-update.

ten slotte geven we onze physics update te zijn 50fps (of elke 0,02 seconden); het bereiken van zowel consistente en tijdige updates.

Conclusies

het Hebben, vrij gemakkelijk, opnieuw het probleem van het mengen en bijpassende timesteps, heb ik mezelf ervan overtuigd dat ik dit spel staat in FixedUpdate methoden.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.