» »

Unreal engine 3 igre.

25.09.2019


Pozdrav, Habr! Želio bih da vas upoznam sa relativno malim projektom koji sam napravio od nule za oko 150 sati (50 prolaza ~ 3 sata svaki) na Unreal Engineu 4. Projekat sam uradio u live samo na streamovima jednom sedmično (ukupno je trajalo godinu dana), usput odgovarajući na pitanja korisnika.

Sam projekat nije imao za cilj da bude komercijalan. Moj cilj je bio da u praksi pokažem složenost razvoja igara, odnosno probleme kao što su:

  • Planiranje projekta i izrada prototipa
  • Razmišljanje i implementacija arhitekture projekta i njegovih pojedinačnih komponenti
  • Implementacija korisničkog sučelja
  • Otklanjanje grešaka i ispravljanje grešaka
  • Rad sa aktivom i grafikom

Na kraju čitave serije streamova, završili smo s prototipom pucačina koji se može igrati. Oni s čašom do pola mogli bi je čak nazvati pre-alfa bez zapleta.

Ako vas zanimaju detalji projekta, stream snimci, izvori itd., čitajte dalje.

Cijeli projekat je implementiran na vizualnom programskom sistemu pod nazivom Blueprints. I naravno, mnogi stručnjaci to mogu nazvati djetinjastim; čak se i relativno veliki projekt može lako razviti na njemu. Štaviše, to se može uraditi relativno brzo, kao što smo već bili u mogućnosti da dokažemo.

Želim odmah da odgovorim na pitanje: " Zašto nacrti, a ne C++?". Pa, prvo, kada sam krenuo u seriju, skoro da nisam znao pluseve. Mada bih ipak napravio takav singl na napajanju. Drugo, napajanje je skoro jednako dobro kao i plusevi u našem slučaju, ali istovremeno pružaju brojne mogućnosti: Ne dozvoljavaju vam da napravite mnogo grešaka moguće je sa prednostima, ne morate se ometati između BP i C++, lakše je razumjeti početnicima, au našem slučaju nisu mnogo sporiji, s obzirom na činjenicu da je skoro sva logika izgrađena na događajima.

Uspjeli smo malo poraditi i na grafiki. Nažalost, nismo imali vremena da napravimo sredstva, pa smo neke od njih ostavili kao lutke, neke su napravljene direktno u editoru od primitivnih, a dio sadržaja je posuđen iz besplatnih Epic Games demoa. Ipak, neke stvari smo uspjeli napraviti sami, na primjer, dan i noć sistem, naknadnu obradu vode i neke materijale za objekte scene.

Planovi za moje streamove takođe su uključivali probleme koji se mogu pojaviti tokom razvoja. Konkretno sam ih riješio uživo kako bih pokazao ne samo sa čime se mladi programeri mogu susresti, već i kako da otklone greške u svom kodu, traže greške i napišu svoj kod kako bi se cijela stvar mogla obaviti duplo brže. Naravno, nemam decenije iskustva u programiranju, i to je uticalo na ponekad glupe greške koje sam pravio. I siguran sam da mnogi programeri mogu osporiti mnoge točke u procesu pisanja igre.

Naravno, ovo se teško može nazvati punopravnom igrom, jer u igri nema zapleta ili cilja - samo čista mehanika. Ipak, vjerujem da je rezultat nešto čime se treba ponositi i da u potpunosti odražava ono čemu je cijeli projekat namijenjen.

Spisak svega što smo uspjeli implementirati u našu igru

karakter

  • Kontrola karaktera
  • Sistem vitalnih statistika (kukovi, oklop, izdržljivost, glad, žeđ)
  • Promjena pogleda (prvo lice i treće lice)
  • Model (napravljen u Fuse, animacije preuzete iz Mixamo)
  • Prilagođene animacije kretanja i upotrebe oružja
  • Univerzalna interakcija sa objektima

Sistem inventara objekata

  • Komponenta inventara (ugradite u bilo koji objekat koji želite)
  • Sistem kaveza sa podrškom za predmete različitih veličina
  • Veličina inventara po ćelijama po stranici i po težini.
  • Klasa predmeta koji se mogu staviti u inventar. Stavke se pohranjuju kao objekti.
    • Težina, veličina, informacije, stanje artikla
    • Funkcionalnost slaganja (kada ima puno jedne stavke u jednoj ćeliji)
    • Mogućnost dodavanja logike za korištenje stavke
    • Ispadanje iz inventara
  • Interfejs za interakciju sa zalihama
  • Interfejs za razmjenu između druge komponente i svoje.
  • Drag&Drop manipulacija objektima između inventara i unutar jednog.
  • Kontekstni meni za stavke
  • Savjeti pri pokazivanju na predmete u inventaru i svijetu.
  • Lista generiranih stavki prilikom kreiranja objekta sa komponentom / pokretanja igre.
  • Lista početnih stavki prilikom kreiranja objekta sa komponentom / pokretanja igre.
  • Sistem trgovanja između ostalih zaliha
    • Trading Interface
    • Komponenta upravljanja novcem (potrebna da bi trgovanje funkcioniralo)

Sistem opreme

  • Opremite nekoliko vrsta predmeta: kape, top, pantalone, čizme, oružje
  • Skeletna sinhronizacija gornjeg dela, pantalona i čizama. (Šeširi i oružje po utičnicama)
  • Pogodan prozor za opremu sa podrškom za Drag&Drop
  • Podrška za logiku modifikatora prilikom oblačenja
Oružje
  • Daljinsko oružje
    • Ponovo učitaj
    • Korištenje predmeta municije iz inventara
    • Podrška za klase projektila/metka
    • Automatska vatra/pojedinačna vatra
    • Trzaj sa širenjem (vlastiti + ovisno o faktorima, npr. trčanje ili čučanj)
  • Melee oružje (sa nekoliko vrsta provjera oštećenja koje možete izabrati)
  • Stanje oružja se pogoršava upotrebom
Crafting system
  • Izrada po receptu (ja sam izabrala recept, on je napravljen, ala Fallout)
  • Izrada po predmetima (ubacio potrebne predmete, on ih je napravio, ala Minecraft)
  • Korisničko sučelje samo za drugu vrstu izrade.
Agresivne mafije
  • Melee mafije (ako ih vide, potrčat će i početi udarati)
  • Mobs mješoviti tip(pucaju, ali ako su dovoljno blizu, trčat će da pogode)
  • Strelci iz daljine trče oko prepreka ako ne mogu pucati.
  • Postoji ugrađeni inventar za plijen nakon ubijanja.
  • Spawn zona
  • Lista klasa
  • Spawn šansu
NPC
  • Gradski NPC-i patroliraju svojom zonom mrijesta
  • Jedinstveni NPC
  • Osnovni kontroler rasporeda za jedinstvene NPC
  • Reakcija na štetu (bježanje ili korištenje postojećeg oružja)
  • Ugrađeni inventar za plijen nakon ubijanja.
  • Sistem dijaloga objekata
    • Stablo dijaloga
    • Svaki odgovor je objekt
    • Za svaki odgovor možete dodati bilo koju logiku ili uvjet pristupačnosti.
    • Dijaloški interfejs
    • Nekoliko gotovih klasa odgovora (počinje trgovanje, uzima resurse, ako ih ima, izlazi iz dijaloga)
Izgradnja
  • Klasa struktura koje podržavaju postavljanje
  • Korištenje resursnih stavki iz inventara prilikom postavljanja.
  • Škakanje na nekim vrstama konstrukcija (npr. zidovi, temelji, prozori)
  • Jelovnik sa dizajnom
  • Isticanje struktura koje imaju dovoljno resursa
Dodatno
  • Mala mapa sa gradom, šumom, vodenim površinama (možete plivati).
  • Dan/noć sistem
  • Automobili
    • Pogled sa prve ili treće. Zajedničko sa Perzijancem
    • Uključivanje/isključivanje farova.
    • Ugrađena komponenta inventara (potrebna je interakcija u prtljažniku)
  • Pomalo funkcionalne vertikalne stepenice.
  • Glavni meni
  • Meni za pauzu
  • Meni za podešavanja grafike

Međutim, o projektu možemo pričati beskonačno. A kako članak ne biste pretvorili u knjigu, predlažem da se upoznate s igrom i njenim mogućnostima putem videa. A za one koji su stvarno zainteresirani, odmah ispod možete pronaći snimke svih streamova, linkove na izvore i build igre.

Sadržaj u dijelovima

  1. Počinjemo i planiramo projekat. Mi kreiramo kontrole i ponašanje lika.
  2. Počnimo da pravimo sistem inventara.
  3. Nastavljamo sa izgradnjom baze sistema zaliha.
  4. Pripremamo bazu za opremu i oružje.
  5. Rad na oružju i korištenje patrona.
  6. Radimo auto-gađanje i nišanjenje.
  7. Kreiranje osnovnog sistema izrade.
  8. Trčanje, recikliranje predmeta i njihovo trošenje.
  9. Implementiramo prepunu oružja.
  10. Pravljenje ruskog oružja.
  11. Završavamo blisku borbu i pravimo merdevine na koje se možete penjati.
  12. Izrađujemo interaktivne objekte: drvo, kamen, grmlje.
  13. Napravimo HUD i počinjemo da pravimo interfejs za inventar.
  14. Nastavljamo sa radom na interfejsu zaliha. Mi generišemo ćelije sa objektima.
  15. Nastavljamo generirati ćelije i tražiti mjesto za stavku. Dodavanje stranica inventara.
  16. Radimo malu interakciju sa stavkama u inventaru i prozorom sa detaljnim informacijama.
  17. Napravili smo Drag&Drop za prevlačenje predmeta preko inventara u drugi inventar.
  18. Ovaj dio se odnosi na vizualizaciju izrade.
  19. Kreiramo prozor sa izborom broja artikala iz hrpe za prijenos u drugi inventar.
  20. Pružamo podršku različiti recepti crafting, a također popravi razne greške u inventaru.
  21. Stvaramo sistem za promjenu dana i noći, ali i novu scenu za naš projekat.
  22. Počinjemo stvarati AI za agresivne botove.
  23. Vršimo napad na mafije, kao i reakciju na napad. Plus implementiramo prikupljanje plijena od mrtvih mafijaša.
  24. Pravimo zonu mriješenja za NPC. Također dodajemo generiranje slučajnih predmeta u inventar.
  25. Ažuriramo na 4.13, a također pravimo agresivne NPC-ove dugog dometa.
  26. Dodavanje različitih elemenata u HUD. Dodavanje ručnog punjenja oružja.
  27. Završavamo podršku za skelet odjeću i šešire. Dodavanje animacije za oružje u prvom licu.
  28. Izrađujemo interfejs za rad sa našim sistemom opreme.
  29. Počnimo da radimo sistem trgovanja i komponentu upravljanja novcem.
  30. Nastavljamo sa trgovanjem kreiranjem i prilagođavanjem komponente trgovanja.
  31. Otkazujemo trgovinu, a također postavljamo animaciju ponovnog učitavanja.
  32. Izrađujemo vozilo sa sopstvenom opremom, farovima i preklopom pogleda. Hajde da napravimo baterijsku lampu.
  33. Mi kreiramo konstrukciju (tačnije, sistem za postavljanje objekata ispred nas).
  34. Izrađujemo interfejs za konstrukciju, izrađujemo vezivanje za zidove.
  35. Izrađujemo još nekoliko vrsta konstrukcija: šator, krevet, stolica, stol, lampa, vrata. sanduk, vatra.
  36. Dodajte krov i prozore. Završavamo poravnanje u odnosu na druge strukture.
  37. Napravimo malo naselje i takođe ga naselimo NPC-ovima, koje takođe kreiramo u ovoj lekciji.
  38. Počinjemo da stvaramo sistem dijaloga za naše stanovnike.
  39. Postavljanje magle i naknadna obrada. Uvozimo model zombija i prilagođavamo njegove animacije.
  40. Završavamo sistem dijaloga.
  41. Interakciju sa objektima radimo od treće osobe, kao i modifikatore za oklop.
  42. Kreiramo glavni meni, meni za pauzu i grafička podešavanja. Također sastavljamo prvu verziju igre.
  43. Implementiramo raspored za jedinstvene stanovnike, kao i da gradski NPC pobjegnu od napada.
  44. Dodajemo kontekstni meni u inventar, a takođe popravljamo neke greške u našem inventaru.
  45. Dodajemo trzaj, širenje, animaciju pucanja i mogućnost udaranja za vatreno oružje.
  46. Dovršit ćemo agresivne i urbane NPC-ove i popraviti razne greške povezane s njima.
  47. Postavljanje animacija za glavnog lika. Dodavanje razne odjeće.
  48. Popravljamo razne greške u našoj igrici.
  49. Ispravljamo razne greške u izradi, NPC-u i opremi u našoj igrici.
  50. Malo dovršavamo mapu i sastavljamo najnoviju verziju.

Ovaj vodič je dizajniran da pomogne programerima da poboljšaju performanse u igricama napravljenim uz Unreal Engine 4 (UE4). Ovdje ćemo govoriti o alatima koji se mogu koristiti kako u samom motoru tako i izvan njega, o najboljim pristupima korištenju uređivača, kao i o skriptiranju koje pomaže u povećanju brzine kadrova i stabilnosti projekta.

Opći cilj ovog vodiča je identificirati šta uzrokuje probleme u radu i pružiti nekoliko metoda za njihovo rješavanje.

Ovaj vodič je napisan koristeći UE4 verziju 4.14.

Jedinice

Poboljšanja optimizacije se mjere korištenjem okvira u sekundi (koji se također nazivaju brzina kadrova ili fps) i milisekundi po kadru (ms).

Grafikon ispod prikazuje odnos između prosječne brzine kadrova i milisekundi.

Da bismo saznali ms pri bilo kojem fps-u, jednostavno saznamo inverznu vrijednost fps-a (tj. uzmemo 1 i podijelimo sa fps-om), a zatim ga pomnožimo sa 1000.

1/FPS x 1000 = MS

Korištenje milisekundi za opisivanje poboljšanja performansi omogućava vam da bolje izmjerite nivo optimizacije koji je potreban za postizanje ciljane brzine kadrova.

Evo nekoliko primjera povećanja FPS-a za 20 sličica u sekundi:

  • Da biste povećali FPS sa 100 na 120, morate poboljšati rezultat za 1,66 ms
  • Da biste povećali FPS sa 10 na 30, morate poboljšati rezultat za 66,67 ms

Alati

Prije nego što počnemo, pogledajmo tri alata kako bismo razumjeli šta se dešava ispod haube motora. To su UE4 CPU Profiler, UE4 GPU Visualizer i Intel Graphics Performance Analyzers (Intel GPA).

Profiler

UE4 CPU Profiler je alatka koja je ugrađena u UE4 koja vam omogućava da pratite svoje performanse u igri, bilo da se radi o igri uživo ili samo o sačuvanom isječku.

Da biste pronašli Profiler, u UE4 kliknite na Window > Developer Tools > Session Frontend.

Kako doći do prozora Session Frontend

U Frontendu sesije izaberite karticu Profiler.

Profiler u Unreal Engineu

Sada kada ste u prozoru Profiler, odaberite Play-In-Editor (PIE), a zatim odaberite Pregled podataka i Live Preview da vidite podatke koji se čitaju iz igre. Da započnete snimanje podataka, pritisnite Data Capture, a da sačuvate podatke za kasniji pregled, pritisnite Data Capture.

Pregled procesa preko Profilera

U Profileru se svaka radnja i naredba odražavaju u milisekundama. Svako područje se može ispitati kako utječe na brzinu kadrova u projektu.

GPU Visualizer

UE4 GPU Visualizer određuje koliko je računarskih resursa potrebno za renderovanje prolaza, a takođe vam omogućava da detaljno vidite šta se dešava unutar određenog okvira.

Možete otvoriti GPU Visualizer preko konzole za programere tako što ćete tamo uneti “ProfileGPU”.

ProfileGPU konzolna komanda

Nakon što unesete naredbu, pojavit će se prozor GPU Visualizer. Pokazuje koliko dugo prolaze prolaze, kao i približnu lokaciju tih prolaza u sceni.

Pregledajte procese koristeći GPU Visualizer

Baš kao i u Profileru, identifikacijom oblasti za koje je potrebno najduže za obradu, znaćete gde da optimizujete.

Intel GPA

Intel Graphics Performance Analyzers (Intel GPA) su skup alata za analizu i optimizaciju dizajniranih da pomognu programerima da poboljšaju rad svojih grafičkih projekata.

U ovom vodiču ćemo se fokusirati na dva aspekta ovog paketa: Analiza aplikacije i Frame Analyzer. Da biste započeli, preuzmite GPA sa Intel Developer Zone. Jednom instaliran, kompajlirajte svoj projekat sa postavkom za razvoj (da biste je odabrali, kliknite na File > Package Project > Build Configuration > Development).

Kada je projekat kompajliran, pokrenite Graphics Monitor, kliknite na Analyze Application, izaberite željenu *.exe datoteku u polju komandne linije i kliknite na dugme Run da biste je pokrenuli.

Dalje, igra će početi - na isti način na koji obično počinje, međutim, u gornjem lijevom uglu sada će biti meni sa statistikom. Da biste ga proširili, kliknite Ctrl+F1. Ako jednom pritisnete Ctrl+F1, pojavit će se nekoliko prozora s indikatorima mjerenim u realnom vremenu. Ako ponovo pritisnete Ctrl+F1, pojavit će se lista komandi (plus prečice koje trebate pritisnuti da biste ih izvršili) s kojima možete eksperimentirati s igrom dok je pokrenuta.

Intel GPA meni u igri

Da biste napravili okvir za naknadnu analizu u Frame Analyzeru, morate ući u igru ​​i napraviti dvije dodatne akcije.

Prvo omogućite Toggle Draw Events. Da biste to učinili, unesite “ToggleDrawEvents” u konzolu.

Naredba konzole ToggleDrawEvents

Kada omogućite ovu funkciju, naredbe za renderiranje koje dolaze iz motora će dobiti imena. Ovo će vam omogućiti da shvatite šta je šta kada pogledate snimljeni kadar u Frame Analyzeru.

Na kraju, sačuvajte okvir pritiskom na prečice Ctrl+Shift+C.

Nakon što spremite okvir, pokrenite Graphics Monitor, kliknite na Graphics Frame Analyzer i odaberite okvir koji želite učitati. Nakon što je spremanje završeno, program će prikazati sve informacije o grafici koja je dostupna u okviru.

Primjer korištenja Intel GPA

Obilje podataka u Intel GPA na prvi pogled izgleda neodoljivo, pa počnimo s najvećim informacijama. U gornjem desnom uglu prozora, postavite obe ose (X i Y) na GPU Duration - rezultat će biti grafikon čije su komande za renderovanje u ovom okviru najzahtevnije.

U našem primjeru, tj. u kadru sa pustinjskim pejzažom, jasno je da je najzahtjevniji bio osnovni prolaz. Nakon odabira najvećeg vrha na grafikonu (to jest, u suštini naredbe za renderiranje sa najzahtjevnijim resursima), kao i označene stavke u donjem lijevom prozoru za pregled (koja se zove Render Target Preview), vidimo da je uzrok vrhunca bio pejzaž (istaknut je ružičastom bojom).

Zatim, odlaskom na prozor sa listom stabla procesa (nalazi se iznad prozora za pregled i prikazuje listu procesa) da pronađemo izabranu komandu za renderovanje, vidimo da se ovaj pejzaž sastoji od 520.200 primitiva, a GPU ga mora obraditi (ovo je GPU indikator Trajanje) traje 1,3185 milisekundi (ms).

Pronalaženje naredbe za renderiranje koja najviše zahtijeva resurse u okviru

Sada kada znamo šta je uzrokovalo skok, možemo početi s optimizacijom.

Prvo, teren se može ponovo izgraditi pomoću načina upravljanja UE4 alata za kreiranje terena, koji vam omogućava da smanjite broj primitiva na 129032, a trajanje GPU-a na 0,8605 ms. Tako je scena optimizirana za 5%.

Vidimo smanjenje trajanja GPU-a

Da ponovo smanjimo "trošak" resursa krajolika, pogledajmo materijale. Naš teren koristi materijal od 13 tekstura 4096 x 4096 (4K), što rezultira ukupno 212,5 MB striminga tekstura.

Pogledajte renderirane teksture u Intel GPA

Kompresijom svih pejzažnih tekstura na 2048 x 2048 (2K), smanjili smo trajanje GPU-a na 0,801 ms i poboljšali performanse za dodatnih 6%.

Kao rezultat toga, smanjenje strujanja tekstura za pejzaž na 53,1 MB i smanjenje broja primitiva učinili su projekt bržim. I sve to po cijenu vrlo malog smanjenja vizualnog kvaliteta krajolika.

Vidimo smanjenje trajanja GPU-a postignuto smanjenjem veličine teksture

Sve u svemu, jednostavnom ponovnom izgradnjom scene i promjenom tekstura, uspjeli smo postići sljedeće:

  • Smanjeno trajanje GPU-a prilikom obrade terena za 40% (sa 1,3185 na 0,801 ms)
  • Poboljšan FPS za 18 sličica (sa 143 na 161)
  • Smanjena ms za 0,7 milisekundi

Optimizacija u uređivaču

Proslijeđeno renderiranje naspram odgođenog renderiranja

Odloženo prikazivanje je standardna metoda renderer koji se koristi u UE4. Korištenje odloženog renderiranja obično poboljšava sliku, ali također može uzrokovati probleme s performansama, posebno u VR igrama i na slabijim mašinama. U ovim slučajevima ima smisla prebaciti se na naprijed renderiranje.

Na primjer, u sceni Reflection iz trgovine Epic, možete vidjeti da postoje neke razlike između metoda odgođenog i naprijed renderiranja.

Scena refleksije prikazana korištenjem Odgođene metode

Scena refleksije prikazana korištenjem Forward metode

Kod naprednog renderiranja pate refleksije, osvjetljenje i sjene, ali se ostali vizualni elementi ne mijenjaju. Kao rezultat, produktivnost se poboljšava, ali jesu li takva odricanja neophodna, naravno, na vama je da odlučite.

Ako pogledamo Intel GPA okvir ove odložene renderirane scene, vidimo da scena radi pri 103,6 ms (9 fps), a značajan dio ovog vremena se troši na obradu osvjetljenja i refleksije.

Kadrirajte podatke iz scene Reflection rendered koristeći Deferred na Intel HD Graphics 530

A ako pogledamo okvir renderovan metodom Forward, vidimo da je indikator “ms” poboljšan sa 103,6 na 44,0 (tj. za 259%), a većina vremena se troši na bazni prolaz i naknadnu obradu. koji se takođe može optimizovati.

Kadrirajte podatke iz scene Reflection rendered koristeći Forward na Intel HD Graphics 530

Nivo detalja

Statičke mreže u UE4 mogu biti sastavljene od hiljada ili čak stotina hiljada trouglova kako bi se pokazali finiji detalji koje je 3D umjetnik unio u svoj rad. Međutim, kada je igrač daleko od modela, on ne vidi ove detalje, a motor još uvijek obrađuje ove trokute. Kako bismo riješili ovaj problem i time optimizirali igru, možemo koristiti takozvane “nivoe detalja” (ili jednostavno LOD – od engleskog “nivo detalja”), tako da se ti detalji prikazuju na bliskoj udaljenosti, ali ne na dalekoj udaljenosti.

LOD generacija

U standardnom cevovodu, LOD-ove kreira 3D modeler tokom kreiranja samog modela. Iako vam ova metoda omogućava kontrolu krajnjeg rezultata, UE4 ima odličan alat ugrađen u njega za automatsko generiranje LOD-ova.

Automatsko generiranje LOD-ova

Da biste to učinili, odaberite željeni model, idite na karticu Detalji, a zatim na stavku LOD Settings. Tamo pronađite stavku Broj LOD-ova (tj. broj nivoa detalja) i tamo unesite željenu vrijednost.

Automatsko generiranje nivoa detalja

Kliknite na Primijeni promjene. Ovo će biti signal za motor da generiše nekoliko LOD-ova, a originalni model među njima će biti LOD0. Primjer ispod pokazuje da kada kreirate pet LOD-ova, broj trokuta u našoj statičkoj mreži se smanjuje sa 568 na 28 - ovo je značajno smanjenje opterećenja GPU-a.

Broj trouglova i vrhova, kao i veličina ekrana za svaki LOD

Ako ovaj model postavimo na scenu, videćemo kako će se menjati kako se udaljava od kamere.

Vizuelna demonstracija LOD-ova prikazanih prema veličini ekrana

Materijali za LOD

Još jedna karakteristika LOD-ova je da svaki od njih može koristiti svoj vlastiti materijal. Ovo nam omogućava da dodatno smanjimo “trošak” statičke mreže.

Materijali dodijeljeni svakom nivou detalja

Na primjer, normalne karte se široko koriste u industriji igara. Međutim, problem koji se javlja u VR igrama je taj što normalne mape nisu savršene jer pri pažljivijem pregledu igrač vidi da je to samo ravna površina.

Ovaj problem se može riješiti korištenjem LOD-ova. Budući da je LOD0 detaljan do tačke u kojoj su vidljivi mali detalji poput vijaka i šrafova, kada igrač pogleda predmet izbliza, igrač doživljava više jak efekat roni. Pošto su svi ovi detalji modelirani, normalna mapa se može napustiti na prvom LOD-u. Kada se igrač udalji od ovog objekta, motor se prebacuje na drugi LOD, koji ima normalnu mapu koja smanjuje detalje modela. Kada se igrač udalji, normalna mapa se može ukloniti, jer će postati premala i jednostavno neće biti vidljiva.

Statične mreže instance

Svaki put kada se novi objekat pojavi na sceni, to zahtijeva pozivanje dodatne naredbe za renderiranje na grafičkom uređaju. Ako je to statična mreža, onda će svaka kopija te mreže zahtijevati poseban poziv komande za crtanje. Jedan od načina da se ovo optimizira (tj. situacija u kojoj se ista statička mreža ponavlja više puta u sceni) je instanciranje statičkih mreža i time smanjenje broja pozvanih naredbi za renderiranje.

Na primjer, imamo dvije sfere koje se sastoje od 200 osmougaonih mreža - jednu zelenu, a drugu plavu.

Sfera statičkih mreža i instancnih mreža

Zeleni oktaedri su pravilne statične mreže. To znači da se za generiranje svakog od ovih modela koristi poseban skup naredbi za renderiranje.

Crtajte komande za 200 statičkih mreža (maksimalno 569)

Plavi oktaedri su mreže instance. To znači da je samo jedan skup naredbi za renderiranje korišten za generiranje svih ovih modela.

Naredbe za crtanje za 200 instanci mreže (maksimalno 143)

Gledajući oba primjera kroz GPU Visualizer, osnovni prolaz za zelenu (sa statičnim mrežama) sferu traje 4,30 ms, a za plavu (sa mrežama instance) 3,11 ms. Tako optimizujemo scenu za 27%.

Jedna stvar koju trebate znati o mrežama instance je da ako takva mreža renderira neki dio, ona će se također prikazati za sve druge "klonove" ove mreže. To jest, ako jedan od “klonova” završi izvan kamere, naš potencijal optimizacije je izgubljen. Stoga preporučujemo izradu uzoraka mreže u malim hrpama - poput gomile kamenja, gomile vreća za smeće, planine kutija ili modularnih zgrada koje se nalaze na udaljenosti.

Ako je većina instanci mreže izvan ekrana, one se i dalje prikazuju

Hijerarhijske statičke mreže instance

Ako koristite statičke mreže sa LOD-ovima, razmotrite hijerarhijske mreže instance.

Sfera hijerarhijske instance se povezuje sa LOD-ovima

Kao i standardne mreže instance, hijerarhijske mreže instance smanjuju broj naredbi za crtanje, ali također koriste LOD informacije.

Sfera hijerarhijske instance se spaja sa LOD-ovima; close view

Odbijanje okluzije

U UE4 engine-u, Occlusion Culling je sistem koji vam omogućava da osigurate da objekti koje igrač ne može vidjeti nisu prikazani. To vam omogućava da smanjite Zahtjevi sustava igri, budući da motor više ne mora crtati apsolutno sve objekte u apsolutno svim scenama i apsolutno svim kadrovima.

Oktogoni razbacani po pozornici

Da biste vidjeli zatvorene objekte (oni će biti prikazani kao prozirne kocke sa zelenim rubovima), unesite "r.VisualizeOccludedPrimitives 1" u konzolu za uređivanje. Da biste onemogućili ovu postavku, unesite “0” umjesto “1”.

Rubovi ograđenih mreža; ove ivice su postale vidljive nakon upotrebe naredbe r.VisualizeOccludedPrimitives 1

Da li će mreža biti renderovana ili ne zavisi od takozvanog “graničnog okvira”. Zahvaljujući njemu, neki objekti mogu biti nevidljivi igraču, ali vidljivi kameri - u ovom slučaju, motor odlučuje da renderuje te objekte.

Pregled granica objekta u prozoru za rad sa objektom

Ako se mreža mora renderirati prije nego što je igrač vidi - na primjer, za renderiranje animacije u stanju mirovanja, što je animacija lika koji se aktivira kada miruje i ne radi ništa; to može biti grebanje po glavi, branje po zemlji nogom itd.) – tada se veličina granične kocke može povećati. Ovo se može uraditi u prozoru za rad sa objektom, u meniju Postavke statičke mreže. Potražite tamo stavke Proširenje pozitivnih granica i Produžetak negativnih granica.

Postavite skalu za granice objekta

Granična kocka složenih mreža i oblika uvijek se proteže izvan tih mreža, tako da što je više praznog prostora u graničnoj kocki, to će se ove mreže češće prikazivati. Stoga, kada radite na sceni, važno je znati kako dimenzije graničnih kocki utiču na njenu izvedbu.

Zamislimo misaoni eksperiment u kojem kreiramo 3D model, a zatim ga izvozimo u UE4. Kako bismo trebali pristupiti stvaranju arene u stilu Koloseuma?

Recimo da igrač stoji u centru arene i gleda oko ogromnog Koloseuma, pokušavajući da zastraši svoje protivnike. Kada igrač rotira kameru, njen smjer i ugao će diktirati šta motor treba da prikaže. Pošto je Koloseum veoma važan element naše igre, napravili smo ga veoma detaljnim, ali da bismo uštedeli na komandama za crtanje, potrebno ga je napraviti od nekoliko objekata.

Ali prvo, moramo napustiti ideju da cijela arena bude jedan veliki čvrsti objekat. U ovom slučaju, broj trouglova koji će biti potrebno renderirati će odgovarati veličini cijele arene - bez obzira gledamo li njene pojedinačne dijelove ili ne. Kako možemo optimizirati ovaj model?

Zavisi od nekoliko faktora. Prvo, na koje dijelove će arena biti izrezana, i drugo, na to kako će oblik ovih dijelova utjecati na veličinu graničnih kocki (što je važno za uklanjanje okluzije). Da bismo to olakšali, zamislimo da igrač koristi kameru sa vidnim poljem od 90 stepeni.

Prva opcija je "narezana pizza". Odnosno, stvaramo 8 identičnih oštrih komada, čiji su "nosovi" usmjereni prema centru arene. Ova metoda je jednostavna, ali nije baš prikladna za uklanjanje okluzije, jer će u ovom slučaju biti dosta preklapanja između graničnih kocki. Ako igrač stane u centar i gleda oko sebe, njegova kamera će uhvatiti 3-4 kocke, tj. većinu vremena motor će morati da prikaže polovinu arene. U najgorem slučaju, igrač može stajati leđima okrenut zidu, gledati u arenu oko sebe i tako snimiti svih 8 komada "pice" u kadru. Nema optimizacije.

Druga opcija je "tik-tak-toe". Ovdje kreiramo 9 komada. Ovo nije najviše tradicionalna metoda, ali njegova prednost je u tome što nema preklapanja između graničnih kocki. Kao iu slučaju "pizze", ako igrač stoji u centru arene, on će uhvatiti 3-4 komada u kadru. Međutim, leđima okrenut zidu, on će uhvatiti 6 od 9 komada u kadru, što, u poređenju sa "picom", daje određenu optimizaciju.

Posljednja opcija je "narezana jabuka" (1 središnji komad i 8 bočnih komada). Ovo je najčešća metoda za ovaj misaoni eksperiment, i vrlo dobra - postoji preklapanje graničnih kocki, ali je malo. Ako igrač stoji u centru arene, on će uhvatiti 5-6 komada u kadru, ali za razliku od prve dvije opcije, u najgorem slučaju (s leđima okrenutim zidu) će biti prikazano istih 5-6 komada .

Misaoni eksperiment koji pokazuje kako se veliki model može izrezati i kako će to utjecati na granične kocke i preklapanja između njih

Kaskadne karte sjena

Iako kaskade dinamičke senke(od engleskog „dynamic shadow cascade“) dodaju visok nivo detalja vašoj igri, mogu biti vrlo „skupi“ u smislu performansi - da biste igrali takvu igru ​​bez gubitka broja kadrova, trebat će vam moćan PC.

Srećom, kao što naziv funkcije sugerira, ove senke se kreiraju dinamički na bazi okvir po kadar. Odnosno, možemo kreirati nekoliko opcija zahvaljujući kojima igrač može optimizirati svoje grafičke postavke.

„Cena“ dinamičkih kaskada senki na Intel Graphics 350

Vrijednost u dinamičkim kaskadama sjenki može se kontrolisati dinamički. To se može učiniti na nekoliko načina:

  • Promjenom kvalitete sjene u Settings > Engine Scalability Settings > Shadows
  • Uređivanjem parametara u datoteci “BaseScalability.ini”: u postavkama Shadow.CSM.MaxCascades (između “0” i “4”) i sg.ShadowQuality (između “0” i “3” - za “low”, “srednji”, “visoki” i “epski”)
  • Dodavanjem čvora Execute Console Command na nacrt igre, gdje ste ručno promijenili parametar Shadow.CSM.MaxCascades

Optimizacija putem skriptiranja

Onemogućite potpuno prozirne objekte

Komande za crtanje mogu se pozvati čak i na potpuno transparentnim objektima igre. Da biste to izbjegli, morate konfigurirati motor tako da prestane da ih renderira.

Da biste to učinili sa nacrtima, morate koristiti nekoliko različitih sistema u UE4.

Skup parametara za materijale

Prvo, kreiramo skup parametara za materijale (ili jednostavno MPC - iz engleske "zbirke parametara materijala"). Ovdje će biti pohranjeni linearni i vektorski parametri, koji se mogu povezati sa bilo kojim materijalom u igri. Mogu se koristiti za modifikaciju ovih materijala tokom igre - za stvaranje dinamičkih efekata.

Kreiramo MPC klikom na karticu Pretraživač sadržaja na Add New > Materials & Textures > Material Parameter Collection.

Kreiranje MPC-a

Budući da smo u MPC-u, možemo kreirati, imenovati i postaviti zadane vrijednosti za linearne i vektorske parametre. U našem slučaju trebat će nam linearni parametar - nazvat ćemo ga Opacity (tj. "transparentnost") i uz njegovu pomoć ćemo kontrolirati transparentnost našeg materijala.

Postavite linearni parametar koji se zove Opacity

Materijal

Traženje čvora parametara kolekcije u materijalu

Nakon što smo kreirali čvor, povezujemo ga s parametrom Opacity na osnovnom materijalu.

Postavljanje parametra kolekcije u materijalu

Skripta u nacrtu

Nakon kreiranja MPC-a i materijala, idemo na nacrt i konfiguriramo ga tako da možemo postaviti i čitati vrijednosti iz MPC-a. Ovo se radi pomoću čvorova Get/Set Scalar Parameter Value i Get/Set Vector Parameter Value. Zatim idemo na ove čvorove, u stavci Zbirka biramo skup koji želimo koristiti (MPC), au stavci Naziv parametra – naziv parametra iz ovog skupa.

Za ovaj primjer, postavili smo linearnu vrijednost neprozirnosti da bude sinus u vrijeme igre - tako da možemo vidjeti vrijednosti u rasponu od "1" do "-1".

Postavljamo i čitamo linearni parametar, a također koristimo njegovu vrijednost u funkciji

Da bismo utvrdili da li je objekat prikazan ili ne, kreiramo novu funkciju pod nazivom Set Visible Opacity. Njegove ulazne vrijednosti bit će parametar Opacity iz MPC-a i statičke mreže, a izlaz će biti Boolean vrijednost koja pokazuje da li je objekt vidljiv ili ne.

Zatim pokrećemo provjeru kako bismo bili sigurni da je vrijednost nešto veća od “0” (in u ovom slučaju, više od “0,05”). Provjera za "0" može raditi, ali kada se približi "0" igrač više neće moći vidjeti objekt, tako da ga možemo jednostavno isključiti prije nego vrijednost postane "0". Osim toga, ovo vam omogućava da kreirate bafer - u slučaju grešaka s pomičnim zarezom, zbog kojih linearni parametar neće moći dobiti tačnu "0". Na primjer, ako je vrijednost “0,0001”, ovaj sistem će ga jednostavno isključiti.

Zatim kreiramo čvor grane - ako je njegov izlaz Tačan, tada će vidljivost objekta (gornji čvor Vidljivost skupa) dobiti vrijednost "true", a ako je False, tada će vidljivost objekta (donji skup Čvor vidljivosti) će biti dodijeljen “false”.

Postavite funkciju vidljive neprozirnosti

Event Tick čvor, vrijeme i provjera renderiranja

Ako nacrt scene koristi čvor Event Tick, ove skripte će raditi čak i ako nijedan objekt nije vidljiv na ekranu. Obično ovo nije velika stvar, ali što je manje nacrta koji otkucaju tokom svakog kadra, scena će se odvijati brže.

Evo nekoliko situacija u kojima možete koristiti ovu vrstu optimizacije:

  • Stvari koje ne moraju raditi kada ih igrač ne gleda
  • Procesi koji se pokreću ovisno o vremenu igre
  • Likovi koji nisu igrači (NPC) koji ne moraju ništa da rade kada igrač nije u blizini

Kao najjednostavnije rješenje, možete staviti čvor Nedavno renderirano ispred oznake događaja. Dakle, da bi se naš Event Tick uključio/isključio, ne moramo na njega povezati posebne događaje i detektore. Osim toga, ovaj sistem i dalje može biti nezavisan od drugih procesa koji se dešavaju na sceni.

Upravljanje čvorom za označavanje događaja pomoću provjere renderiranja

Ova metoda se može koristiti i za složenije probleme. Na primjer, ako imamo proces koji se pokreće ovisno o vremenu igre (na primjer, neko svijetleće dugme koje se pali i gasi svake sekunde), možemo koristiti donji grafikon:

Emisiona vrijednost u kolekciji materijala postavljena je na takav način da će tokom renderiranja djelovati kao apsolutni sinusni val vremena igre

Gornji grafikon prati koliko je vremena igre prošlo, a zatim tu vrijednost prenosi kroz apsolutni sinus plus jedan, što rezultira sinusnim valom koji varira između vrijednosti "1" i "2".

Prednost ove metode je što će dugme treptati u skladu sa linijom na grafikonu iznad, bez obzira da li igrač gleda dugme ili ne (može da se vrti u krug ili da bulji u njega). I sve zahvaljujući vrijednosti izračunatoj na osnovu sinusa vremena igre.

Ovo također radi sa ostatcima dijeljenja cijelih brojeva, ali u ovom slučaju graf izgleda drugačije.

Možete provjeriti da li se prikazuje pomoću čvora Nedavno je renderirano malo kasnije. Odnosno, ako objekat koji kontroliše čvor Event Tick ima neke zadatke koje treba izvršiti u svakom kadru, ali možete se uveriti da se ti zadaci izvode pre render provere (pogledajte grafikon ispod). Što je manje čvorova pozvanih sa svakim “tikom” čvora Event Tick, to bolje.

Korištenje Render Checker-a za upravljanje vizualnim fragmentima nacrta

Drugi način da se smanji "trošak" nacrta je da se uspori i dozvoli čvoru Event Tick da "otkuca" samo jednom tokom određenog intervala. Ovaj interval se postavlja pomoću čvora Set Actor Tick Interval.

Prebacivanje između intervala

Osim toga, interval u kojem čvor Event Tick "otkucava" može se podesiti u stavci Tick Interval - nalazi se na kartici Detalji nacrta na kojem radite. Ovdje je interval specificiran u sekundama.

Označite stavku Interval na kartici Detalji

Ovo je zgodno, na primjer, kada trebate napraviti brojač koji se pali svake sekunde.

Napravite paralelni brojač koji se pali svake sekunde

Kao primjer kako ova vrsta optimizacije može smanjiti vaš prosječni ms, pogledajmo donji grafikon:

Nevjerovatno koristan primjer šta ne treba raditi

Ovdje imamo ForLoop čvor koji broji od “0” do “10000”, a cijeli broj Count je specificiran za njega kroz SET čvor. Ovaj graf je veoma intenzivan i neefikasan - toliko da je indikator ms za našu scenu nevjerovatnih 53,49 ms.

Pregled "troška" Stat Unit-a je nevjerovatno koristan primjer.

Prelaskom na Profiler, razumijemo zašto. Ovaj jednostavan, ali izuzetno neefikasan nacrt troši 43 ms za svaki tik.

Gledanje u Profileru fragmenta odgovornog za pokretanje Ticka događaja u svakom kadru

Ali ako napravite da ovaj nacrt “štikne” svake sekunde, onda će većinu vremena “pojesti” 0 ms. Ako pogledamo prosječno vrijeme (odaberimo neki fragment vremenske linije u prozoru Graph View) kroz tri tiketa, vidjet ćemo da je prosjek 0,716 ms.

Gledanje u Profileru fragmenta odgovornog za pokretanje Event Tick svake sekunde

Ili uzmimo češći slučaj: recimo da naš nacrt ima 1,4 ms, a ako scena radi pri 60 fps, tada će trebati 84 ms za obradu ovog nacrta. Ali ako smanjite vrijeme tokom kojeg čvor Event Tick "otkucava" na nacrtu, to će također smanjiti ukupno vrijeme utrošeno na obradu ovog nacrta.

Bulk pokret, ForLoop čvor i višenitno

Kada se više modela kreće u isto vrijeme, to izgleda vrlo cool i može stvoriti vrlo atraktivan vizualni stil. Istina, u ovom slučaju veliko opterećenje pada na CPU, zbog čega FPS na kraju pati. Međutim, ovo se također može optimizirati podjelom masovnog kretanja na nekoliko nacrta - zahvaljujući multithreading-u i UE4-ovoj sposobnosti da upravlja radnim nitima.

U ovom odeljku koristićemo skriptu koja će dinamički pomerati 1600 instanciranih sfera gore/dole duž modifikovane sinusne krive.

Ispod je jednostavna skripta koja kreira mrežu. Jednostavno dodamo komponentu Instanced Static Mesh, na kartici Detalji, izaberemo mrežu koju ćemo koristiti, a zatim dodamo sljedeće čvorove:

Skripta za kreiranje jednostavne mreže

Nakon kreiranja mreže, ovu skriptu dodajemo na karticu Grafikon događaja.

Nekoliko riječi o čvoru za transformaciju instance ažuriranja. Ako se bilo koja od instanci transformira, ova promjena neće biti prikazana sve dok stavka Mark Render State Dirty ne bude označena kao "tačno". Ali ovo je operacija koja zahtijeva resurse, jer... provjera prolazi kroz svaku mrežu. Da biste uštedjeli računarske resurse, posebno ako se ovaj čvor pokreće nekoliko puta po tiku, možete ažurirati mreže na kraju nacrta. U skripti ispod, stavka Mark Render State Dirty je označena kao “tačno” samo ako su ispunjena dva uslova - ako čvor ForLoop ima posljednji indeks i ako vrijednost u indeksu odgovara veličini mreže minus 1.

Dynamic Motion Blueprint za statične mreže instance

Osim toga, koristeći nacrt tipa glumca, mrežnu skriptu i događaj dinamičkog pokreta, možemo kreirati različite varijante mreže, gdje će istovremeno biti prikazano 1600 mreža.

Više opcija rešetke sa 1600 oka

Provodeći scenu, vidjet ćemo rešetkaste elemente kako lebde gore-dolje.

Rešetka od 1600 statičkih instanci mreže koji se dinamički kreću gore-dolje

Međutim, tip komadanja utječe na brzinu kojom se scena odvija.

Prvo, ako se rešetka sastoji od 1600 pojedinačnih fragmenata, tada će svih 1600 nacrta biti obrađeno za 16,86 ms (tj. u prosjeku 0,0105 ms po nacrtu). To jest, iako je “cijena” jednog plana mala, njihov ukupan broj usporava sistem. Jedina stvar koja se ovdje može učiniti je smanjiti broj nacrta koji se aktiviraju sa svakim tiketom. Drugi razlog za veliko opterećenje je veliki broj pojedinačnih mreža, što povećava broj naredbi za renderiranje i transformaciju mreže.

Drugo, ako se mreža sastoji od jednog fragmenta, koji uključuje 1600 mreža, onda će ova opcija biti vrlo dobro optimizirana u smislu naredbi za crtanje (jer je potrebna samo jedna naredba za crtanje za cijelu mrežu), ali "cijena" nacrta , što je jedan “tik” koji će trebati za obradu 1600 mreža, iznosit će 19,63 ms.

Ali ako podijelite mrežu drugačije (na 4 fragmenta od 400 mreža, 64 od 25 ili 16 od 100), rezultat je optimiziraniji - zahvaljujući smanjenom vremenu obrade skripte i sposobnosti UE4 da radi s višestrukim nitima. Zahvaljujući potonjem, UE4 može distribuirati opterećenje obrade nacrta na više radnih niti, na taj način efikasno koristeći sve CPU jezgre.

Ako pogledamo vrijeme obrade nacrta i kako su raspoređeni među radničkim nitima, vidimo sljedeće:

Strukture podataka

Korištenje pravih struktura podataka je neophodan element svakog programa, a to se odnosi na razvoj igara koliko i na razvoj drugog softvera. Prilikom programiranja u UE4 koriste se nacrti, a u nizu šablona, ​​koji služi kao glavni kontejner, nema struktura podataka. Kreiraju se ručno u kasnijoj fazi razvoja - uz dodatak funkcija i čvorova koji se nalaze u UE4.

Primjer upotrebe

Kao primjer zašto i kako se struktura podataka može koristiti u razvoju igara, zamislimo igru ​​s planom snimanja. Jedna od glavnih mehanika pucačkih mapa je pucanje na neprijatelje, što generiše hiljade metaka koji jure ekranom. Budući da meci na kraju stignu do svojih ciljeva (ili ne pogode objekte) i budu uništeni, motor igre mora očistiti ove ostatke, što može utjecati na performanse igre, pa čak i smanjiti broj kadrova. Da bi se pozabavili ovim problemom, programeri bi trebalo da u svom dizajnu obezbede takozvani „pune objekata” – skup objekata (u ovom slučaju, bullets) smeštenih u niz/listu i obrađenih kada igra počne – zahvaljujući čemu programeri mogu omogući/onemogući metke u bilo kom trenutku. Kao rezultat toga, motoru je dat samo posao stvaranja metaka.

Najčešći način korištenja skupa objekata je da uzmete prvi još neomogućen metak u nizu/listi, premjestite ga na početnu poziciju, uključite, a zatim ga isključite kada odleti sa ekrana ili pogodi neprijatelja . Problem sa ovom metodom je vrijeme potrebno da se skripta pokrene, tj. u velikom "O". Budući da radite puno petlji provjeravajući objekte i tražite koji da isključite, kada koristite 5000 objekata može potrajati puno petlji da se pronađe jedan objekt. Za ovu metodu, vrijeme će biti predstavljeno kao O(n), gdje je “n” broj objekata u skupu.

Iako je O(n) daleko od najgoreg algoritma. Što se više približavamo O(1) – tj. na fiksni „trošak“, nezavisno od veličine - što će skripta biti efikasnija i igra će biti brža. Da bismo to izveli sa skupom objekata, koristimo strukturu podataka koja se zove "red". Baš kao pravi red, ova struktura podataka uzima prvi objekt u skupu, koristi ga, a zatim ga briše dok ne iskoristi sve objekte u redu.

Koristeći ovaj "red" za naš skup objekata, možemo uzeti prednji dio seta, uključiti ga, zatim ga ukloniti i odmah staviti u zadnji dio seta. Ovo će stvoriti efikasnu petlju u skripti i smanjiti vrijeme rada skripte na O(1). Također možemo dodati provjeru u ovu petlju - ako je izbrisani objekt uključen, onda ga skripta uzima i, bez kreiranja novog objekta, stavlja ga na kraj reda, povećavajući veličinu skupa, ali bez povećanja vrijeme obrade skripte.

Redovi

Ispod su neke slike koje pokazuju kako se koriste redovi. Oni dodaju različite karakteristike nacrtima koje čine kod čišćim i višekratnim.

  • Odstranjivanje

Implementacija queue::pop konstrukcije u UE4 nacrtu; uklanja element sa prednje strane reda

  • Dodatak

Implementacija konstrukcije queue::push u Blueprint UE4; umeće novi element na kraj reda

  • Određivanje da li je red prazan
  • Određivanje veličine reda

Implementacija konstrukcije queue::size u Blueprint UE4; prijavljuje veličinu reda čekanja

  • Vraćanje pokazivača na prvi element u redu čekanja

Implementacija konstrukcije queue::front u UE4 Blueprint; vraća pokazivač na prvi element u redu čekanja

  • Vraćanje pokazivača na posljednji element u redu čekanja

Implementacija konstrukcije queue::back u UE4 Blueprint; vraća pokazivač na posljednji element u redu čekanja

  • Umetanje elementa na određenu lokaciju u redu čekanja

Umeće navedeni element u navedenu lokaciju reda (sa provjerom pozicije)

  • Razmjena podataka

Implementacija konstrukcije queue::swap u UE4 nacrtu; prisiljava dva kontejnera na razmjenu podataka (sa provjerom pozicije)

Stacks

Ispod su neke slike koje pokazuju kako se koriste hrpe. Oni dodaju različite karakteristike nacrtima koje čine kod čišćim i višekratnim.

  • Odstranjivanje

Implementacija stack::pop konstrukcije u UE4 nacrtu; uklanja element sa prednjeg kraja steka

  • Dodatak

Implementacija stack::push konstrukcije u UE4 nacrtu; umeće novi element na kraj steka

  • Određivanje da li je stog prazan

Implementacija stack::empty konstrukcije u UE4 nacrtu; govori da li je stek prazan

  • Određivanje veličine steka

Implementacija konstrukcije stack::size u Blueprint UE4; prijavljuje veličinu steka

  • Vraćanje pokazivača na posljednji element na steku

Vraća pokazivač na posljednji element na steku

  • Umetanje elementa na određenu lokaciju u stogu

Umeće navedeni element na određenu lokaciju steka (sa provjerom položaja)

Unreal Engine vuče korijene iz 1998. godine. Od tada su stvorene mnoge nevjerovatne igre. U ovom članku ćemo govoriti o 7 najboljih od njih. U vrijeme kada je motor stvoren, korišten je za stvaranje jednostavne igre sa 2D prikazom. Postepeno su se počele pojavljivati ​​modernije 3D akcione igre. Popularnost motora je osiguran jedinstvenim operativnim sistemom, koji istovremeno ima: grafičko i fizičko jezgro, ugrađenu umjetnu inteligenciju, kao i alate za upravljanje sistemima datoteka i mrežama. Glavna atrakcija je bila dostupnost gotovog okruženja za kreiranje igara - UnrealEd.

#7 - Batman: Arkham Knight

Ova igra ima žanr akcionog trilera. Radnja je zasnovana na događajima koji su se dogodili 9 mjeseci nakon poznatog rata u Arkham Cityju. Pošto je Džoker mrtav, Gotam počinje da se vraća u uobičajenu kolotečinu života, počinje sigurnije vreme za njegove stanovnike, ali se ravnoteža snaga gubi kada se jednog dana stanovnici Gotama bacaju jedni na druge u kafiću za bez vidljivog razloga.

Nakon ovakvog nastupa, Strašilo se pojavljuje na pozornici sa izjavom da je iskoristio samo 100 g svog novog toksina i ona namjerava nastaviti, povećavajući dozu svakim danom. S tim u vezi, stanovnici su hitno evakuisani iz grada.


Glavni lik– Batman, koji se neumorno bori za sigurnost rodnom gradu i iskorenjuje kriminal. Tokom igre pojavit će se brojni neprijatelji, prekrasne lokacije i jedinstveni likovi. Igru se odlikuje pažljivim pristupom igranju i stoga zaslužuje da zauzme 7. poziciju među najboljima.

#6 - Street Fighter V

Postoje igre koje su, bez pretjerivanja, poznate u cijelom svijetu, Street Fighter je jedna od takvih igara. Moderni peti dio popunit će prazninu nastalu nelogičnim oslobađanjem trećeg i šestog dijela. Za one malobrojne koji još nisu upoznati s igrom, to je borbena igra u kojoj se korisnik bori sa neprijateljima. Osnova njegove popularnosti leži u mogućnosti multiplayera, a igranje sa prijateljem uvijek donosi “žive” emocije.


Igra je poznata od pamtivijeka, zbog brojnih likova sa jedinstvenim karakteristikama i borbenim sposobnostima. Ranije su postojali likovi i korisnici visoke klase protiv kojih je bilo nemoguće pobijediti, ali postepeno su se strategija i tehnike borbe mijenjale i dobivale više ravnoteže.

#5 - We Happy Few

Igra se fokusira na 1964. godinu, kada je u gradu zv Wellington Wells(ime je izmišljeno) lijekovi su razvijeni za povećanje radosti, zove se serum "Joy". Zasnovan je na čišćenju sjećanja. Stvar je u tome da su tokom Drugog svetskog rata stanovnici posezali za izuzetno lošim stvarima, što je izazvalo snažno potiskivanje duha nacije. Serum je dizajniran da otkloni ova sjećanja i učini ljude sretnijima, i to na silu. Oni stanovnici koji odbijaju da koriste “Joy” zovu se “Dosadnici” i oni se iskorenjuju.


Glavni lik je Arthur Hastings, običan činovnik koji se bavi cenzurom novina o "nesretnim" vijestima iz prošlosti. Pregledavajući novinske arhive, na naslovnoj strani otkriva fotografiju sebe i svog mlađeg brata. Sećanja mu se uvlače u glavu i donose bol. Kako bi upoznao sebe, odbija da pije „Joy“. Nakon završetka efekta, kolege ga prepoznaju kao "Dosadnika" i počinju da ga progone. Ovo prisiljava Artura da pobjegne u tamnice.

#4 - Gears of War 4

Kultna serija igrica ponovo inspiriše korisnika da uroni u svet "nereda". Što se tiče igranja, nema bitnih razlika u odnosu na prethodne dijelove. Igra ostaje odličan šuter, gdje postoje brojni neprijatelji i skloništa. Oružja ima zaista puno, sve do mitraljeza sa motornom testerom kao bajonetom ispod cijevi. Borbe se odvijaju i sa Hordom, iako su jezive, ali žive, i sa COG robotima. Sva čudovišta pokušavaju da progutaju heroja.


Zanimljiva karakteristika igre je da se iznenada može pojaviti vrtlog nevjerovatne snage, koji izaziva snažno podrhtavanje cijele površine Sumpora; niko i ništa ne može odoljeti sili prirode. Igrač će moći da vidi kuće koje se dižu u nebo, a opstanak u takvim uslovima neće biti lak.

#3 - Mortal Kombat X

Mortal Kombat je u prva tri najbolje igre na Unreal Engineu. Ima žanr borbenih igara, o čemu smo ranije govorili na primjeru Street Fighter V. Ovdje ima mnogo likova, bezbroj udaraca, ali njihovo stvaranje može biti prilično teško, jer su kombinacije duge i moraju se precizno izvesti. Popularnost igre zasniva se na njenom odličnom igranju, spektakularnim bitkama i prekrasnim modelima likova i terenu za borbe.


Igra čak ima i zaplet, iako je to više formalnost, jer vrijednost igre ne leži u ovoj komponenti. Tuče sa prijateljima koje dovode do takmičarskog duha su najvažnija karakteristika igrice. Da biste bili pobjednik, morate zapamtiti i vježbati kombinacije za udarce, a tada ni vaš prijatelj ni kompjuter neće moći odoljeti.

#2 - BioShock Infinite

BioShock je zanimljiv pucač koji fascinira svojom atmosferom i ima neke RPG elemente, odnosno možete nadograditi sposobnosti svog lika. Igra vraća korisnika u 1912. godinu, radnja se odvija u plutajućem gradu Kolumbiji.


Korisnik će igrati kao detektiv privatne prakse Booker DeWitt, koji ulazi u grad u potrazi za Elizabeth. Nakon otkrića djevojčice, oba heroja postaju zarobljenici rata između vlasti i pobunjenika, jednostavne, radničke klase.

Elizabetina jedinstvenost je u tome što može stvarati praznine između paralelni svetovi, koji otkrivaju mnogo detalja grada i prošlosti likova.

#1 - Dishonored

Stealth akcija ovih dana postaje prilično popularan žanr, ali teško je konkurirati Dishonored-u. Dodatno, igra sadrži elemente RPG žanra.

Igra vas vodi u grad koji je potpuno zarobljen u epidemiji kuge - ovo je Dunwall. Primjetno je da grad po mnogo čemu podsjeća na London iz antičkog doba, otprilike iz viktorijanskog doba. Glavni lik, Corvo Attano, želi da vrati pravdu, jer je okrivljen za ubistvo carice. Gospodar bježi iz zatvora i pokušava uspostaviti ravnotežu između dobrih i zlih sila.

Corvo ne zanemaruje ni jedan način da riješi situaciju, pa "luni" kao najamni ubica. Glavni zadatak je pronaći i eliminirati određeni lik. Igra ima veliki broj različitih oružja, ali to nije sve, jer lik ima jedinstvene sposobnosti.


Prisutan u igri zanimljiva priča, karakteriše ga nelinearnost. Gotovo svaka misija se može završiti na više načina, a posebno - možete dizati buku i ubijati brojne protivnike ili ubijati neprijatelja tajno tako da niko ne primijeti.

Novi mobilni Linija 2 on Unreal Engine 4 odlučili smo sastaviti mali izbor zanimljivih remakea igara na ovom motoru koji zaslužuju vašu pažnju.

Dakle, 5 najboljih rimejkova igara na Unreal Engine 4. Idemo!

1.

Najava remakea legendarnog Final Fantasy 7 na E3 2015 bio je vrhunac te godine za mnoge ljude.

Nakon toga, na PlayStation Experience 2015, prikazan je trejler koji sadrži nekoliko sekundi igranja prikazanog po prvi put uz učešće Clouda i Bareta na samom početku igre.

Da shvati koje mjesto zauzima Final Fantasy 7 u industriji igara, a koliko su ljudi čekali ovaj trenutak, pogledajte samo reakcije na najavu ovog remakea.

2.

3.

22-godišnji 3D umjetnik okoliša Kimmo Kaunela iz Finske prethodne godine radio na projektu Poslednja stanica, inspirisan kreacijom studija - igrom. Kimmo je uspio napraviti nevjerovatnu mapu koja pokazuje kako bi igra izgledala da je objavljena na Unreal Engineu 4.

Tip ima račun Deviant Art I vlastitu web stranicu, gdje možete pogledati njegov najnoviji rad. Ovaj projekat ga je, prema rečima autora, naučio kako da radi sa Unreal Engineom 4.

4.

Entuzijasta Airam Hernandez ranije ove godine podijelio je video amaterskog rimejka prvog dijela, na kojem radi sam.

Hernandezov rad koristi modificiranu verziju grafike Nestvarni motor Motor 4. Prema njegovim riječima, u početku je samo želio da na njemu ponovo stvori ostrvo Shadow Moses nova tehnologija, tako da igrači upoznati s originalom i pridošlice mogu istražiti njegove atrakcije. Međutim, nakon što su strani mediji skrenuli pažnju na tehnički demo, Hernandez je odlučio da se bavi punopravnim rimejkom stealth akcione igre.

U njegovom Facebook objave autor prerađenog Metal Gear Solida nije precizirao kada očekivati ​​konačnu verziju. Video, kao što sugeriše uvodna poruka, zasnovan je na ranom prototipu remakea.

5.

Modder sa nadimkom Logithx krenuo da napravi rimejk kultnog pucača. Entuzijasta radi na oličenju distopijskog City-17 iz HL2 koristeći Unreal Engine 4. Autor još ne može dati približan datum završetka rada - sve je još u ranoj fazi.

Logithx je proveo dosta vremena radeći na remakeu Half-Life 2 koristeći prethodnu verziju Epicovog motora - Unreal Engine 3. Međutim, kada je kompanija počela distribuirati moćni UE4, odlučio je započeti rad od nule - i već na novom tehnologije.

6.

"Kako to, rekli ste Top 5 - odakle dolazi 6. bod?" - pitate.

Dođavola sa pravilima! Ovo je na Unreal Engine 4! Pogledajte samo ove grafike! Autor projekta prenošenja ove divne igre na novi motor je Alexander Young.

Pong- prva utakmica koja je pokazala da su igre ozbiljne. Smiješno je, ali dva reketa i piksel lopta bili su dovoljni da stvore prvi bum arkadnih mašina: slot mašine sa Pongom bile su toliko popularne da su njegovi klonovi ubrzo preplavili tržište. Atari je naknadno objavio verziju Pong-a za Atari 2600 konzolu, dokazujući da i sistemi za kućne igre imaju pravo na život. Uspjeh Ponga također je postao signal za druge igračke kompanije - na primjer, Konami je brzo ušao na tržište arkada sa igrom Maze.