Gamedev Gamedev Generatoare de secvențe și numere

Generarea procedurală ajută la creșterea repetabilității prin utilizarea regulilor interne pentru a crea părți ale jocului în mișcare: de la proiectarea planului unei temnițe la construirea unui sistem solar. Aceste reguli se bazează adesea pe o serie de numere care sunt apoi interpretate de către program pentru a crea conținutul necesar.

Există numeroase moduri de generare a acestor numere; în acest articol ne vom uita la Generatoare de secvențe și Generatoare de numere generatoare de pseudorandom, și diferențele lor.


Generator de secvențe

Prima opțiune - un generator de secvențe - este cea mai gravă din cele două proceduri menționate. Dar ce este?

Un generator de secvențe este un algoritm care utilizează o formulă matematică pentru a produce o secvență de numere. De exemplu, vom examina o secvență foarte simplă - cea pe care o voi explica este o derivare a binecunoscutei secvențe Fibonacci.

În esență, secvența standard Fibonacci începe întotdeauna cu 0 și 1. Aceste numere sunt apoi adăugate împreună pentru a da 1 - deci numărul doi și al treilea în această secvență sunt 1 și 1. Când se adună împreună rezultatul este 2 și acesta este al patrulea număr în secvență. Secvența continuă astfel, adăugând întotdeauna cele două numere anterioare în secvență pentru a genera următoarea secvență.


Secvența standard Fibonacci

Implementarea unui generator simplu de secvențe

Programarea unui generator de secvențe ar putea părea simplă, mai ales dacă se bazează fundațiile sale pe secvența Fibonacci, dar primele impresii sunt înșelătoare. De exemplu, să ne imaginăm că încercăm să creăm un câmp de stele bidimensional astfel:


Un câmp simplu

Privind acest starfield putem vedea că fiecare stea poate fi definită prin coordonatele și mărimea sa. Luând în considerare intervalul fiecărei valori între 0 și 99, putem împărți apoi o secvență de numere în grupuri de câte trei - interpretând fiecare număr ca o coordonată x a stelei, o coordonată y sau o mărime.


Manipularea unei secvențe de eșantion

Dacă este făcut pas cu pas, programarea unui generator de secvențe pe baza secvenței Fibonacci pentru a crea o secvență similară nu este o sarcină dificilă.

Începem cu un număr (numit semințe) format din patru cifre - de exemplu, 1234. Semințele sunt împărțite apoi într-o pereche de numere din două cifre care iau locul secvențelor 0 și 1 din secvența Fibonacci. Aceste numere sunt apoi procesate folosind o formulă pentru a produce un al treilea număr în flux.

Când construiți un generator de secvențe, probabil că doriți ca numerele generate să scadă într-un anumit interval (de exemplu 0-99). Prin urmare, este important să trunchia acest număr dacă acesta nu se încadrează în raza de acțiune. (Pentru exemplul nostru, putem tăia coloana "sute").) Deși acest lucru poate părea nesemnificativ, acesta facilitează fluxul de lucru atunci când manipulează mai târziu această secvență.

Pe măsură ce se repetă acest proces, este creat un șir de numere care este gata să fie manipulat și astfel poate fi implementat:

Crearea unei secvențe

Din păcate, numai după ce implementați secvența ca un desen 2D, începeți să observați modele recurente. De cele mai multe ori, rezolvarea acestor tipuri de probleme va duce la petrecerea multor ore de încercare și de testare a erorilor în diferite algoritmi.


Generator de numere generatoare de pseudoane

A doua abordare menționată mai sus utilizează un generator de numere de pseudorandom (PRNG). Înainte de a vă explica ce este un PRNG, rețineți că calculatorul este o mașină logică - trebuie să respecte un anumit set de reguli. Prin urmare, nimic în computer nu este cu adevărat aleatoriu.

Un generator de numere pseudorandom este doar un algoritm care produce un flux de numere aleatoare (aparent) aleatoare. Spun "aparent" pentru că un PRNG folosește în continuare formule predefinite pentru a genera numerele. Aceasta înseamnă că un PRNG este încă un generator de secvențe.

Proprietatea cheie a unui PRNG în comparație cu alte generatoare de secvențe este că acesta echilibrează numărul de apariții de numere diferite. Acest proces se realizează prin formule complexe și algoritmi și înseamnă că numerele pe care le produce vor apărea la fel de variate ca și numerele de la aruncări repetate de zaruri sau numerele de loterie câștigătoare.


Un exemplu de secvență PRNG

În timp ce un generator de secvențe este de obicei făcut special pentru o problemă, se utilizează un PRNG atunci când secvența generată este de obicei aruncată sau nu trebuie reținută.


PRNG vs generatorul de secvențe

Un PRNG este mai ușor de folosit și implementat decât un generator de secvențe și are diverse utilizări. În ciuda acestui lucru, uneori este mai sensibil să mergem la o distanță suplimentară și să folosim un generator de secvențe. De ce?

În sistemele complexe, este important să faceți cea mai bună utilizare a spațiului. Folosirea unui PRNG înseamnă că, pentru a salva detaliile unui sistem solar, va trebui să salvați întreaga secvență lungă. Pe de altă parte, dacă utilizați un generator de secvențe, puteți salva simplu semințele inițiale și lungimea secvenței. (În acest caz, este esențial ca generatorul de secvențe să producă aceeași secvență dintr-o anumită sămânță). Același lucru nu se poate spune despre PRNG-uri: în general, un PRNG nu-și expune semințele, nici nu acceptă una. Aceasta face ca replicarea unei secvențe PRNG să fie extrem de dificilă.

Uneori, deși rareori, un PRNG ar putea să vă ofere o secvență aparent subiectivă (în același mod în care o monedă echitabilă poate ateriza ocazional cinci capete la rând). Este posibil ca acest lucru să nu fie ușor de detectat la prima vedere sau când vă uitați la secvență ca întreg. Cu toate acestea, când vă uitați la imaginea produsă, puteți observa clustere de stele sau planete. Prin utilizarea unui generator de secvențe, această problemă poate fi minimizată, deoarece un astfel de algoritm este adaptat pentru problema la îndemână.

Un alt avantaj, similar cu cel precedent, este controlul conținutului. Când doriți să generați procedural un câmp de vederi îndepărtat, este firesc să doriți ca stelele mici să apară mai frecvent decât stelele mai mari. Folosind un PRNG nealterat, această părtinire nu este posibilă. Cu toate acestea, prin utilizarea unui generator de secvențe, puteți furniza singură părtinirea necesară. Încă o dată, totul se reduce la formula sau formulele pe care decideți să le utilizați și modul în care interpretați șirul rezultat.

În timp ce un PRNG ar putea fi util, atunci când se creează un motor de generare procedural, probabil că ar fi mai bine să alegi un generator de secvențe mai specific. Avantajele pe care le aduce cu ea sunt benefice și se asigură că implementarea are o posibilitate sporită de a ieși din restul.