Descrie metode pentru a realiza planuri de animație mai performante prin tehnici de optimizare.

Pe măsură ce vă construiți planurile de animație, există câteva practici pe care ar trebui să le aveți în vedere pentru a vă asigura că animația din proiectul dvs. rulează cât mai bine posibil. Unele dintre acestea sunt activate în mod implicit, în timp ce altele vor necesita să luați în considerare abordarea pe care o luați în configurarea planurilor de animație. Alte eforturi pot fi efectuate prin C ++, care vă va oferi, de asemenea, un anumit control asupra modului și momentului în care animațiile sunt actualizate, ceea ce poate duce la îmbunătățirea performanțelor.

Actualizare animație multi-fire

Acest lucru permite mai multă animație să ruleze în fire de lucru și este activat în mod implicit, pe care îl puteți găsi în Setările proiectului:

În interiorul Setări proiect sub Setări generale> Planuri Anim, a te asigura Permiteți actualizarea animației cu mai multe fire este activat.

optimizare

Acest lucru controlează dacă, în mod implicit, permitem actualizări ale graficului de plan de animație să fie efectuate pe fire care nu sunt de joc. Acest lucru permite, de asemenea, câteva verificări suplimentare în compilatorul de animație Blueprint, care vor avertiza atunci când se încearcă operațiuni nesigure. În interiorul tău Planuri de animație, veți dori, de asemenea, să vă asigurați că este setat la Utilizați actualizarea animației cu mai multe fire.

În interiorul planului de animație de sub Setările clasei, asigura-te ca Utilizați actualizarea animației cu mai multe fire este activat.

Principalul motor din spatele acestui lucru a fost să controleze accesul la date mai strâns între fire. În acest scop, multe date cu acces la grafic animat au fost mutate de la UAnimInstance într-o nouă structură numită FAnimInstanceProxy. Această structură proxy este locul în care se găsește cea mai mare parte a datelor de pe UAnimInstance.

În general, UAnimInstance nu trebuie accesat sau mutat din nodurile AnimGraph (Actualizare/Evaluare apeluri) deoarece acestea pot fi rulate pe alte fire. Există împachetări de blocare (GetProxyOnAnyThread și GetProxyOnGameThread) care împiedică accesul la FAnimInstanceProxy în timp ce activitățile sunt în zbor. Ideea este că, în cel mai rău caz, sarcinile așteaptă finalizarea înainte ca datele să poată fi citite sau scrise în proxy.

Din punct de vedere Anim Graph, numai FAnimInstanceProxy poate fi accesat din nodurile de animație, nu din UAnimInstance. Datele trebuie schimbate cu proxy-ul pentru fiecare bifă (fie prin tamponare, copiere sau altă strategie) în FAnimInstanceProxy: PreUpdate sau FAnimInstaceProxy: PreEvaluateAnimation. Orice date care apoi trebuie accesate de obiecte externe ar trebui apoi schimbate/copiate de la proxy în FAnimInstanceProxy: PostUpdate .

Acest lucru este în conflict cu cazul general de utilizare al UAnimInstance în care variabilele membre pot fi accesate din alte clase în timp ce sarcinile sunt în zbor. Ca recomandare, încercați să nu accesați deloc direct Instanța Anim de la alte clase. În schimb, Instanța Anim ar trebui să extragă date din altă parte.

Exemplu AnimInstance nativ personalizat

În blocul de cod de mai jos este un exemplu despre cum s-ar construi o clasă nativă personalizată AnimInstance utilizând noul FAnimInstanceProxy, acordând acces la funcționarea internă și evitând copiile datelor partajate între proxy și instanță:

Animație Calea rapidă

Animație Calea rapidă oferă o modalitate de optimizare a accesului variabil în interiorul AnimGraph Actualizați. Acest lucru permite motorului să copieze parametrii intern, mai degrabă decât să execute codul Blueprint (care implică efectuarea de apeluri în Blueprint Virtual Machine). Compilatorul poate optimiza în prezent următoarele construcții: variabilele membre au negat variabilele membre booleene și membrii unei structuri imbricate.

Opțiunea Animație cale rapidă este activată în mod implicit în Setări proiect:

În interiorul Setări proiect sub setari generale și Anim Blueprints, a te asigura Optimizați accesul variabil al membrilor Blueprint Anim este activat.

Pentru a utiliza calea animației Fath, în interiorul graficului animat al planurilor de animație, asigurați-vă că nu se execută nicio logică plan. În imaginea de mai jos, citim mai multe valori flotante care sunt utilizate pentru a conduce mai multe active Blend Space și o combinație care rezultă în poziția noastră de animație finală. Fiecare nod notat cu pictograma fulger în colțul din dreapta sus utilizează Calea rapidă deoarece nu se execută nicio logică.

Dacă ar fi să schimbăm această rețea pentru a include orice formă de calcul, cum ar fi exemplul prezentat mai jos, nodul asociat nu ar mai folosi o cale rapidă.

Mai sus, deoarece acum executăm logica Blueprint pentru a genera valorile care alimentează TEST_Blend2D nod, nu mai folosește Calea rapidă (iar pictograma de iluminare va fi eliminată).

Metode de cale rapidă

Pentru ca Planurile dvs. de animație să utilizeze Calea rapidă, asigurați-vă că:

Accesați direct variabilele de membru

Mai jos utilizăm Calea rapidă accesând direct și citind valoarea variabilei noastre booleene pentru a ne determina poziția.

În exemplul următor, nu folosim Calea rapidă, deoarece realizăm logică pentru a determina dacă variabila booleană este egală cu adevărată.

Accesați variabile de membru boolean negate

Mai jos folosim Calea rapidă citind valoarea booleanului negat pentru a ne determina poziția.

În exemplul următor, nu folosim Calea rapidă, deoarece realizăm logică pentru a determina dacă variabila booleană nu este egală cu adevărata.

Accesați membrii unei structuri imbricate

Mai jos ne rupem variabila rotatorului pentru a accesa direct variabilele Pitch și Yaw pentru a ne oferi obiectivul Offset.

Accesați membrii folosind nodurile „Break Struct”

Mai jos folosim un nod Break Struct pentru a diviza variabila rotatorului în valori XYZ pentru a ne alimenta Aim Offset.

niste Break Struct noduri precum Break Transform în prezent, nu va folosi Calea rapidă, deoarece efectuează conversii intern, mai degrabă decât să copieze date.

Avertizați despre utilizarea planului

Pentru a vă asigura că modelele dvs. de animație utilizează Calea rapidă, puteți activa Avertizați despre utilizarea planului opțiune care va determina compilatorul să emită avertismente în jurnalul rezultatelor compilatorului ori de câte ori se efectuează un apel către Blueprint Virtual Machine din AnimGraph.

Pentru a permite Avertizați despre utilizarea planului, activați opțiunea din Setările clasei de dumneavoastră Plan de animație sub Optimizare.

Când compilatorul identifică noduri care nu utilizează Calea rapidă, acestea vor fi afișate în Rezultatele compilatorului Buturuga.

Mai sus, din moment ce executăm logica Blueprint în AnimGraph și avem opțiunea de avertizare activată, primim un mesaj de avertizare în rezultatele compilatorului și putem face clic pe acesta pentru a ne duce la nodul ofensator. Acest lucru vă poate ajuta să urmăriți optimizările care trebuie făcute și vă va permite să identificați nodurile care pot fi sursa problemei.

Sfaturi generale

Pe măsură ce începeți să luați în considerare performanța utilizării animației dvs., iată câteva linii directoare pe care poate doriți să le urmați atunci când efectuați optimizări.

În funcție de dimensiunea și scopul proiectului dvs., pot fi necesare schimbări mai invazive, totuși acesta este, în general, un loc bun pentru a începe.

Asigurați-vă că sunt îndeplinite condițiile pentru actualizările paralele

În UAnimInstance: NeedsImmediateUpdate puteți vedea toate condițiile care trebuie îndeplinite pentru a evita faza de actualizare a animației care rulează pe firul de joc. Dacă mișcarea rădăcinii este necesară pentru mișcarea caracterului, actualizarea paralelă nu poate fi efectuată, deoarece mișcarea caracterului nu este cu mai multe fire.

Evitați apelurile către mașina virtuală Blueprint

Tine-ti Graficul evenimentului în Planurile de animație goale. Utilizați o clasă personalizată derivată de UAnimInstance și FAnimInstanceProxy și efectuați toată munca dvs. în proxy în timpul FAnimInstanceProxy: Update sau FAnimInstanceProxy: Evaluați pe măsură ce acestea sunt executate pe fire de lucru.

Asigurați-vă că nodurile din interiorul dvs. Grafic anim din Planul dvs. de animație sunt structurate într-un mod în care utilizează Calea rapidă .

Asigura-te ca Optimizați accesul variabil al membrilor Blueprint Anim este activat în Setări proiect deoarece acest lucru controlează dacă nodurile de animație Blueprint care accesează direct variabilele membre ale clasei lor ar trebui să utilizeze calea optimizată care evită un thunk la Blueprint VM.

În general, cea mai costisitoare parte a execuției unui AnimGraph, evitarea apelurilor către mașina virtuală este cheia pentru a obține performanțe maxime din Planurile de animație.

Utilizați optimizările ratei de actualizare (URO)

Acest lucru va împiedica animațiile să bifeze prea des. Controlul asupra modului în care se aplică acest lucru depinde de jocul dvs., dar vă recomandăm să mergeți spre

15Hz și sub Rate de actualizare la distanțe adecvate pentru multe caractere, precum și dezactivarea interpolării.

Pentru a activa, setați Componenta ochiului scheletic la Activați optimizările ratei de actualizare și consultați AnimUpdateRateTick () .

Opțional, puteți activa și Afișați optimizările ratei de actualizare a depanării pentru a permite aplicarea pe ecran a depanării URO.

Activați Utilizarea componentelor Limite fixe ale schelelor

În componenta dvs. Skeletal Mesh, activați Utilizarea componentelor Skel Bounds opțiune.

Acest lucru va sări peste utilizarea unui activ de fizică și va folosi întotdeauna limitele fixe definite în rețeaua scheletică.

Aceasta va ignora, de asemenea, recalcularea volumelor de delimitare pentru reducere pentru fiecare cadru, sporind performanța.

Alte considerente

Când profilați proiectul, este posibil să vedeți că FParallelAnimationCompletionTask se execută pentru rețelele scheletice pe firul principal după finalizarea firelor de lucru. Aceasta va fi cea mai mare parte a lucrării principale pe care o veți vedea în profilul dvs. odată ce condițiile pentru actualizări paralele sunt îndeplinite și constau de obicei din câteva lucruri, în funcție de configurare:

Deplasarea componentelor dvs., actualizarea obiectelor fizice pentru oase, de exemplu.

Încercați să evitați actualizarea fizicii pentru lucruri care nu au nevoie de ea, deoarece aceasta va fi cheia pentru a reduce acest lucru.

Anularea notificărilor de animație.

Acestea ar trebui să nu fie Blueprint, din nou pentru a evita apelurile către Blueprint VM pentru eficiență.

Acestea trebuie, de asemenea, să fie efectuate pe firul jocului, deoarece pot afecta durata de viață a obiectului animat.

Interpolarea animației dacă URO este activat.

Amestecarea curbelor dacă sunt utilizate curbe Material sau Morph Target.