Acasă Ciuperci Implementarea unei arhitecturi de motor de joc multi-thread. Gâtul sticlei al arhitecturii lui von Neumann

Implementarea unei arhitecturi de motor de joc multi-thread. Gâtul sticlei al arhitecturii lui von Neumann

Introducere. Tehnologia calculatoarelor se dezvoltă rapid. Dispozitivele de calcul devin din ce în ce mai puternice, mai compacte și mai convenabile, dar, recent, îmbunătățirea performanței dispozitivelor a devenit o mare problemă. În 1965, Gordon Moore (unul dintre fondatorii Intel) a concluzionat că „numărul de tranzistori plasați pe un cip de circuit integrat se dublează la fiecare 24 de luni”.

Primele dezvoltări în domeniul creării de sisteme multiprocesoare au început în anii 70. Multă vreme, performanța procesoarelor convenționale single-core a crescut prin creșterea frecvenței de ceas (până la 80% din performanță a fost determinată doar de frecvența de ceas) cu o creștere simultană a numărului de tranzistori de pe cip. Legile fundamentale ale fizicii au oprit acest proces: cipurile au început să se supraîncălzească, cel tehnologic a început să se apropie de dimensiunea atomilor de siliciu. Toți acești factori au condus la faptul că:

  • curenții de scurgere au crescut, drept urmare generarea de căldură și consumul de energie au crescut.
  • procesorul a devenit mult „mai rapid” decât memoria. Performanța a scăzut din cauza latenței în accesarea memoriei RAM și încărcarea datelor în cache.
  • există un astfel de lucru ca „gâtul de sticlă von Neumann”. Înseamnă ineficiența arhitecturii procesorului la executarea unui program.

Sistemele multiprocesor (ca una dintre modalitățile de rezolvare a problemei) nu au fost utilizate pe scară largă, deoarece necesitau plăci de bază multiprocesoare costisitoare și dificil de fabricat. Pe baza acestui fapt, productivitatea a crescut în alte moduri. Conceptul de multithreading sa dovedit a fi eficient - procesarea simultană a mai multor fluxuri de comenzi.

Tehnologia Hyper-Threading (HTT) sau Tehnologia Hyper-Threading, care permite unui procesor să execute mai multe fire de execuție pe un singur nucleu. Potrivit mulți experți, HTT a devenit o condiție prealabilă pentru crearea procesoarelor multi-core. Un procesor care execută mai multe fire în același timp se numește paralelism la nivel de fir (TLP — paralelism la nivel de fir).

Pentru a elibera potențialul unui procesor multicore, un program executabil trebuie să folosească toate nucleele de calcul, ceea ce nu este întotdeauna realizabil. Programele secvențiale vechi care pot folosi un singur nucleu nu vor mai rula mai repede pe noua generație de procesoare, astfel încât programatorii sunt din ce în ce mai implicați în dezvoltarea de noi microprocesoare.

1. Concepte generale

Arhitectura în sensul cel mai larg este o descriere a unui sistem complex format din multe elemente.

În procesul de dezvoltare, structurile semiconductoare (microcircuite) evoluează, prin urmare, principiile construcției procesoarelor, numărul de elemente incluse în compoziția lor, modul în care este organizată interacțiunea lor, sunt în continuă schimbare. Astfel, procesoarele cu aceleași principii de design de bază sunt de obicei numite procesoare cu aceeași arhitectură. Și astfel de principii în sine sunt numite arhitectură procesor (sau microarhitectură).

Un microprocesor (sau procesor) este componenta principală a unui computer. Procesează informații, execută programe și controlează alte dispozitive din sistem. Cât de repede vor rula programele depinde de puterea procesorului.

Miezul este coloana vertebrală a oricărui microprocesor. Este format din milioane de tranzistori situati pe un cip de siliciu. Microprocesorul este împărțit în celule speciale numite registre de uz general (RON). Munca procesorului în total constă în preluarea comenzilor și a datelor din memorie într-o anumită secvență și executarea acestora. În plus, de dragul creșterii vitezei PC-ului, microprocesorul este echipat cu o memorie cache internă. Memoria cache este memoria internă a procesorului folosită ca buffer (pentru a proteja împotriva întreruperilor comunicării cu RAM).

Procesoarele Intel utilizate în PC-urile compatibile cu IBM au mai mult de o mie de instrucțiuni și sunt denumite procesoare cu un set de instrucțiuni extins - CISC-processors (CISC - Complex Instruction Set Computing).

1.1 Calcul de înaltă performanță. Paralelism

Ritmul de dezvoltare a tehnologiei de calcul este ușor de urmărit: de la ENIAC (primul computer digital electronic de uz general) cu o performanță de câteva mii de operații pe secundă până la supercomputerul Tianhe-2 (1000 de trilioane de operațiuni în virgulă mobilă pe secundă). Aceasta înseamnă că viteza de calcul a crescut de un trilion de ori în 60 de ani. Crearea de sisteme de calcul de înaltă performanță este una dintre cele mai dificile probleme științifice și tehnice. În timp ce viteza hardware-ului de calcul a crescut de doar câteva milioane de ori, viteza totală a computerului a crescut de trilioane de ori. Acest efect este obținut datorită utilizării paralelismului în toate etapele de calcul. Calculul paralel necesită o căutare a alocării raționale a memoriei, metode fiabile de transfer de informații și coordonarea proceselor de calcul.

1.2 Multiprocesare simetrică

Symmetric Multiprocessing (abreviat SMP) sau simetric multiprocessing este o arhitectură specială a sistemelor multiprocesoare în care mai multe procesoare au acces la memoria partajată. Aceasta este o arhitectură foarte comună, destul de folosită recent.

Când utilizați SMP, mai multe procesoare funcționează într-un computer simultan, fiecare pe propria sa sarcină. Un sistem SMP cu un sistem de operare de înaltă calitate distribuie rațional sarcinile între procesoare, oferind o sarcină uniformă pentru fiecare dintre ele. Cu toate acestea, există o problemă cu accesul la memorie, deoarece chiar și sistemele uniprocesor durează relativ mult timp pentru a face acest lucru. Astfel, accesul la RAM în SMP are loc secvenţial: mai întâi un procesor, apoi al doilea.

Datorită caracteristicilor enumerate mai sus, sistemele SMP sunt utilizate exclusiv în domeniul științific, industrie, afaceri și extrem de rar în birourile de lucru. Pe lângă costul ridicat al implementării hardware, astfel de sisteme necesită un software foarte scump și de înaltă calitate, care asigură executarea sarcinilor cu mai multe fire. Programele obișnuite (jocuri, editori de text) nu vor funcționa eficient în sistemele SMP, deoarece nu asigură acest grad de paralelizare. Dacă adaptați orice program pentru un sistem SMP, atunci va deveni extrem de ineficient să lucrați pe sisteme uniprocesor, ceea ce duce la necesitatea de a crea mai multe versiuni ale aceluiași program pentru sisteme diferite. O excepție este, de exemplu, programul ABLETON LIVE (conceput pentru a crea muzică și a pregăti Dj-seturi), care are suport pentru sisteme multiprocesor. Dacă rulați un program obișnuit pe un sistem multiprocesor, acesta va rula totuși puțin mai rapid decât pe un sistem monoprocesor. Acest lucru se datorează așa-numitei întreruperi hardware (oprirea programului pentru procesarea de către nucleu), care este executată pe un alt procesor liber.

Un sistem SMP (ca orice alt sistem bazat pe calcul paralel) impune cerințe crescute pentru un astfel de parametru de memorie precum lățimea de bandă a magistralei de memorie. Acest lucru limitează adesea numărul de procesoare din sistem (sistemele SMP moderne funcționează eficient până la 16 procesoare).

Deoarece procesoarele au memorie partajată, este nevoie de utilizarea sa rațională și de coordonarea datelor. Într-un sistem multiprocesor, se dovedește că mai multe cache-uri funcționează pentru o resursă de memorie partajată. Coerența cache este o proprietate cache care asigură integritatea datelor stocate în cache-urile individuale pentru o resursă partajată. Acest concept este un caz special al conceptului de coerență a memoriei, în care mai multe nuclee au acces la memorie partajată (este omniprezent în sistemele moderne multicore). Dacă descriem aceste concepte în termeni generali, imaginea va fi următoarea: același bloc de date poate fi încărcat în cache-uri diferite, unde datele sunt procesate în moduri diferite.

Neutilizarea oricăror notificări de modificare a datelor va duce la o eroare. Coerența cache este concepută pentru a rezolva astfel de conflicte și pentru a menține consistența datelor în cache.

Sistemele SMP sunt un subgrup de MIMD (multi-instruction multi data) al clasificării Flynn a sistemelor de calcul (profesor de la Universitatea Stanford, co-fondator al Palyn Associates). Conform acestei clasificări, aproape toate tipurile de sisteme paralele pot fi clasificate ca MIMD.

Împărțirea sistemelor multiprocesor în tipuri are loc pe baza divizării conform principiului utilizării memoriei. Această abordare a făcut posibilă distingerea între următoarele tipuri importante

sisteme multiprocesoare - multiprocesoare (sisteme multiprocesoare cu memorie partajată) și multicalculatoare (sisteme cu memorie separată). Datele partajate utilizate în calcule paralele necesită sincronizare. Sarcina de sincronizare a datelor este una dintre cele mai importante probleme, iar soluția sa în dezvoltarea de multiprocesor și multicore și, în consecință, software-ul necesar este o sarcină prioritară pentru ingineri și programatori. Partajarea datelor se poate face prin alocarea fizică a memoriei. Această abordare se numește acces neuniform la memorie (NUMA).

Aceste sisteme includ:

  • Sisteme în care pentru prezentarea datelor sunt folosite doar memoria cache a procesorului individual (arhitectură de memorie cache-only).
  • Sisteme cu furnizarea de coerență a cache-urilor locale pentru diferite procesoare (cache-coherent NUMA).
  • Sisteme cu acces partajat la memoria procesorului individual fără coerență cache bazată pe hardware (NUMA non-cache coerent).

Simplificarea problemei creării sistemelor multiprocesor se realizează prin utilizarea memoriei partajate distribuite, dar această metodă duce la o creștere vizibilă a complexității programării paralele.

1.3 Multithreading simultan

Pe baza tuturor dezavantajelor de mai sus ale multiprocesării simetrice, este logic să dezvoltați și să dezvoltați alte modalități de îmbunătățire a performanței. Dacă analizați funcționarea fiecărui tranzistor individual din procesor, puteți atrage atenția asupra unui fapt foarte interesant - atunci când efectuați majoritatea operațiilor de calcul, sunt implicate departe de toate componentele procesorului (conform studiilor recente, aproximativ 30% din totalul tranzistorilor). Astfel, dacă procesorul efectuează, să zicem, o operație aritmetică simplă, atunci cea mai mare parte a procesorului este inactiv, prin urmare, poate fi folosit pentru alte calcule. Deci, dacă procesorul efectuează în prezent operații reale, atunci o operație aritmetică cu numere întregi poate fi încărcată în partea liberă. Pentru a crește sarcina procesorului, puteți crea execuția speculativă (sau anticipativă) a operațiunilor, ceea ce necesită multă complexitate în logica hardware a procesorului. Dacă definiți în avans firele (secvențele de comenzi) din program care pot fi executate independent unele de altele, atunci acest lucru va simplifica semnificativ sarcina (această metodă este ușor de implementat la nivel hardware). Această idee, care îi aparține lui Dean Tulsen (dezvoltată de el în 1955 la Universitatea din Washington), se numește simul-taneous multithreading. Ulterior a fost dezvoltat de Intel sub numele de hyper threading. De exemplu, un singur procesor care execută mai multe fire de execuție este perceput de sistemul de operare Windows ca procesoare multiple. Utilizarea acestei tehnologii necesită din nou un nivel adecvat de software. Efectul maxim al utilizării tehnologiei multithreading este de aproximativ 30%.

1.4 Multicore

Tehnologia multithreading este o implementare software a multicore. O creștere suplimentară a performanței, ca întotdeauna, necesită modificări în hardware-ul procesorului. Complicația sistemelor și arhitecturilor nu este întotdeauna eficientă. Există o părere inversă: „totul ingenios este simplu!”. Într-adevăr, pentru a crește performanța unui procesor, nu este deloc necesar să-i creștem frecvența de ceas, să complici componentele logice și hardware, deoarece este suficient doar să raționalizezi și să rafinăm tehnologia existentă. Această metodă este foarte benefică - nu este nevoie să se rezolve problema creșterii disipării căldurii a procesorului, dezvoltarea de noi echipamente scumpe pentru producția de microcircuite. Această abordare a fost implementată în cadrul tehnologiei multicore - implementarea mai multor nuclee de calcul pe un singur cristal. Dacă luăm procesorul original și comparăm câștigurile de performanță la implementarea mai multor metode de creștere a performanței, atunci este evident că utilizarea tehnologiei multicore este cea mai bună opțiune.

Dacă comparăm arhitecturile unui multiprocesor simetric și ale unui multicore, acestea se vor dovedi a fi aproape identice. Cache-ul de bază poate fi pe mai multe niveluri (local și partajat, iar datele din RAM pot fi încărcate direct în memoria cache L2). Pe baza avantajelor considerate ale arhitecturii procesorului multi-core, producătorii se concentrează asupra acesteia. Această tehnologie s-a dovedit a fi destul de ieftină de implementat și versatilă, ceea ce a făcut posibilă aducerea ei pe o piață largă. În plus, această arhitectură a făcut propriile ajustări la Legea lui Moore: „numărul de nuclee de calcul dintr-un procesor se va dubla la fiecare 18 luni”.

Dacă te uiți la piața modernă a hardware-ului computerelor, poți vedea că domină dispozitivele cu procesoare cu patru și opt nuclee. În plus, producătorii de procesoare susțin că în curând vor fi pe piață procesoare cu sute de nuclee de procesare. După cum s-a spus de multe ori înainte, întregul potențial al unei arhitecturi multicore este dezvăluit numai cu software de înaltă calitate. Astfel, sfera producției de hardware și software de calculator este foarte strâns legată.

Dar odată cu cucerirea noilor vârfuri ale indicatorilor de frecvență, a devenit mai dificilă creșterea acestuia, deoarece aceasta a afectat creșterea TDP-ului procesoarelor. Prin urmare, dezvoltatorii au început să crească procesoare în lățime, și anume să adauge nuclee, și așa a apărut conceptul de multi-core.

Cu doar 6-7 ani în urmă, practic nu se menționa despre procesoarele multi-core. Nu, procesoare multi-core de la aceeași companie IBM existau înainte, dar apariția primului procesor dual-core pentru computere desktop, a avut loc abia în 2005, iar acest procesor se numea Pentium D. De asemenea, în 2005 a fost lansat un Opteron dual-core de la AMD, dar pentru sisteme server.

În acest articol, nu vom aprofunda în fapte istorice în detaliu, dar vom discuta despre procesoarele moderne multi-core ca una dintre caracteristicile unui procesor. Și cel mai important, trebuie să ne dăm seama ce oferă acest multicore în ceea ce privește performanța pentru procesor și pentru tine și pentru mine.

Performanță crescută datorită multi-core

Principiul creșterii performanței procesorului în detrimentul mai multor nuclee este împărțirea execuției thread-urilor (diverse sarcini) în mai multe nuclee. Pentru a rezuma, putem spune că aproape fiecare proces care rulează pe sistemul dumneavoastră are mai multe fire.

Permiteți-mi să fac o rezervare imediat că sistemul de operare poate să creeze practic o multitudine de fire de execuție pentru el însuși și să le execute pe toate ca simultan, chiar dacă procesorul este fizic cu un singur nucleu. Acest principiu implementează însuși multitasking-ul Windows (de exemplu, ascultarea muzicii și tastarea în același timp).


Luați, de exemplu, software-ul antivirus. Un flux va scana computerul, celălalt va actualiza baza de date antivirus (am simplificat totul foarte mult pentru a înțelege conceptul general).

Și luați în considerare ce se va întâmpla în două cazuri diferite:

a) Procesorul este single-core. Deoarece două fire sunt executate în același timp, trebuie să creăm pentru utilizator (vizual) această simultaneitate de execuție. Sistemul de operare face în mod inteligent:există o comutare între execuția acestor două fire (aceste comutatoare sunt instantanee și timpul trece în milisecunde). Adică, sistemul a „efectuat” puțin actualizarea, apoi a trecut brusc la scanare, apoi a revenit la actualizare. Astfel, pentru tine și pentru mine, impresia este că aceste două sarcini sunt îndeplinite simultan. Dar ce se pierde? Performanță, desigur. Deci, să ne uităm la a doua opțiune.

b) Procesor multi-core.În acest caz, această comutare nu va avea loc. Sistemul va trimite în mod clar fiecare fir într-un nucleu separat, ceea ce, ca rezultat, ne va permite să scăpăm de performanța distructivă trecând de la fir la fir (idealizam situația). Două fire rulează în același timp, acesta este principiul multicore și multithreading. În cele din urmă, vom efectua scanări și actualizări mult mai rapid pe un procesor multi-core decât pe unul cu un singur nucleu. Dar există o captură - nu toate programele acceptă multicore. Nu orice program poate fi optimizat astfel. Și totul este departe de a fi la fel de perfect așa cum am descris. Dar în fiecare zi, dezvoltatorii creează tot mai multe programe care au cod perfect optimizat pentru execuție pe procesoare multi-core.

Ai nevoie de procesoare multi-core? Motivul de zi cu zi

La selectarea procesorului pentru un computer (și anume, atunci când vă gândiți la numărul de nuclee), ar trebui să determinați principalele tipuri de sarcini pe care le va îndeplini.

Pentru a vă îmbunătăți cunoștințele în domeniul hardware-ului computerului, puteți citi materialul despre socluri de procesor .

Punctul de plecare poate fi numit procesoare dual-core, deoarece nu are rost să ne întoarcem la soluții single-core. Dar procesoarele dual-core sunt și ele diferite. Poate că nu este cel mai „proaspăt” Celeron, dar poate fi Core i3 pe Ivy Bridge, la fel ca AMD - Sempron sau Phenom II. Desigur, datorită altor indicatori, performanța lor va fi foarte diferită, așa că trebuie să priviți totul în mod cuprinzător și să comparați multicore cu alții. caracteristicile procesoarelor.

De exemplu, Core i3 de pe Ivy Bridge are tehnologia Hyper-Treading, care permite procesarea a 4 fire simultan (sistemul de operare vede 4 nuclee logice în loc de 2 fizice). Și același Celeron nu se laudă cu așa ceva.

Dar să revenim direct la reflecțiile asupra sarcinilor solicitate. Dacă un computer este necesar pentru munca de birou și pentru a naviga pe internet, atunci este suficient un procesor dual-core.

Când vine vorba de performanța în jocuri, sunt necesare 4 sau mai multe nuclee pentru a te simți confortabil în majoritatea jocurilor. Dar aici apare aceeași problemă: nu toate jocurile au cod optimizat pentru procesoare cu 4 nuclee și, dacă sunt optimizate, atunci nu atât de eficient pe cât ne-am dori. Dar, în principiu, pentru jocurile de acum soluția optimă este tocmai procesorul al 4-lea nucleu.


Astăzi, aceleași procesoare AMD cu 8 nuclee sunt redundante pentru jocuri, numărul de nuclee este redundant, dar performanța nu rezistă, dar au alte avantaje. Aceste 8 nuclee vor ajuta foarte mult în sarcinile în care este necesară o muncă puternică cu lucru multi-thread de înaltă calitate. Acestea includ, de exemplu, redarea (redarea) videoclipurilor sau calcularea pe server. Prin urmare, astfel de sarcini necesită 6, 8 sau mai multe nuclee. Și în viitorul apropiat, jocurile vor putea încărca 8 sau mai multe nuclee de înaltă calitate, așa că în viitor totul este foarte roz.

Nu uitați că există o mulțime de sarcini care creează o încărcare cu un singur thread. Și merită să vă puneți o întrebare: am nevoie sau nu de acest procesor cu 8 nuclee?

Rezumând rezultate mici, aș dori să remarc încă o dată că avantajele multicore apar în munca de calcul multithreaded „greu”. Și dacă nu jucați jocuri cu cerințe exorbitante și nu faceți anumite tipuri de muncă care necesită o putere de calcul bună, atunci pur și simplu nu are rost să cheltuiți bani pe procesoare multi-core scumpe (

După ce ne-am ocupat de teoria multithreading-ului, să luăm în considerare un exemplu practic - Pentium 4. Deja în stadiul de dezvoltare a acestui procesor, inginerii Intel au continuat să lucreze la creșterea performanței acestuia fără a introduce modificări în interfața de programare. Au fost luate în considerare cinci moduri simple:

Creșterea frecvenței ceasului;

Plasarea a două procesoare pe un microcircuit;

Introducerea de noi blocuri funcționale;

Extinderea transportorului;

Folosind multithreading.

Cea mai evidentă modalitate de a îmbunătăți performanța este de a crește viteza ceasului fără a modifica alți parametri. De regulă, fiecare model de procesor ulterior are o viteză de ceas puțin mai mare decât precedentul. Din păcate, cu o creștere în linie dreaptă a vitezei ceasului, dezvoltatorii se confruntă cu două probleme: o creștere a consumului de energie (care este importantă pentru calculatoarele portabile și alte dispozitive de calcul care funcționează pe baterii) și supraîncălzirea (care necesită crearea unei călduri mai eficiente. chiuvete).

A doua metodă - plasarea a două procesoare pe un microcircuit - este relativ simplă, dar presupune dublarea suprafeței ocupate de microcircuit. Dacă fiecare procesor este furnizat cu propria sa memorie cache, numărul de cipuri de pe un platou se reduce la jumătate, dar asta înseamnă și o dublare a costurilor de producție. Prin furnizarea unui cache partajat pentru ambele procesoare, se poate evita o creștere semnificativă a amprentei, dar apare o altă problemă - cantitatea de memorie cache per procesor se reduce la jumătate, iar acest lucru afectează inevitabil performanța. În plus, în timp ce aplicațiile de server profesionale sunt capabile să utilizeze pe deplin resursele mai multor procesoare, în programele desktop obișnuite, paralelismul intern este mult mai puțin dezvoltat.

Introducerea de noi blocuri funcționale nu este, de asemenea, dificilă, dar este important să găsim un echilibru aici. Ce rost are o duzină de blocuri ALU dacă microcircuitul nu poate emite comenzi către transportor cu o viteză atât de mare încât să poată încărca toate aceste blocuri?

Un transportor cu un număr crescut de trepte, capabil să împartă sarcinile în segmente mai mici și să le proceseze în perioade scurte de timp, pe de o parte, crește productivitatea, pe de altă parte, crește consecințele negative ale tranzițiilor neprevăzute, ratelor de cache, întreruperilor și alte evenimente care perturbă comenzile normale de procesare a fluxului din procesor. În plus, pentru a realiza pe deplin capacitățile conductei extinse, este necesară creșterea frecvenței de ceas, iar acest lucru, după cum știm, duce la un consum crescut de energie și la disiparea căldurii.

În cele din urmă, puteți implementa multithreading. Avantajul acestei tehnologii este că introduce un flux suplimentar de programe pentru a aduce resurse hardware care altfel ar fi inactive. Pe baza rezultatelor studiilor experimentale, dezvoltatorii Intel au descoperit că o creștere cu 5% a suprafeței cipului atunci când se implementează multithreading pentru multe aplicații oferă un câștig de performanță de 25%. Primul procesor Intel care a suportat multithreading a fost Heon din 2002. Ulterior, începând cu 3,06 GHz, multithreading-ul a fost introdus în linia Pentium 4. Intel numește implementarea multithreading-ului în hyperthreading-ul Pentium 4.

* întrebări mereu de actualitate, la ce ar trebui să acordați atenție atunci când alegeți un procesor, pentru a nu vă înșela.

Scopul nostru în acest articol este să descriem toți factorii care afectează performanța procesorului și alte caracteristici operaționale.

Cu siguranță nu este un secret pentru nimeni că procesorul este principala unitate de calcul a unui computer. Puteți chiar spune - cea mai importantă parte a computerului.

El este cel care se ocupă de procesarea aproape a tuturor proceselor și sarcinilor care apar în computer.

Fie că este vorba de vizionarea video, muzică, navigarea pe internet, scrierea și citirea în memorie, procesarea 3D și video, jocuri. Și mult mai mult.

Prin urmare, la alegere C central NS procesorul trebuie luat cu mare atenție. Se poate dovedi că ați decis să instalați o placă video puternică și un procesor care nu se potrivește cu nivelul său. În acest caz, procesorul nu va dezvălui potențialul plăcii video, ceea ce va încetini funcționarea acesteia. Procesorul va fi complet încărcat și va fierbe literalmente, iar placa video își va aștepta rândul, lucrând la 60-70% din capabilitățile sale.

De aceea, atunci când alegeți un computer echilibrat, nu cheltuieli neglijează procesorulîn favoarea unei plăci video puternice. Puterea procesorului trebuie să fie suficientă pentru a dezlănțui potențialul plăcii video, altfel sunt doar bani irositi.

Intel vs. AMD

* prinde din urmă pentru totdeauna

corporație Intel, are resurse umane uriașe și finanțe aproape inepuizabile. Multe inovații în industria semiconductoarelor și noile tehnologii vin de la această companie. Procesoare și evoluții Intel, in medie 1-1,5 cu ani înaintea dezvoltării inginerilor AMD... Dar, după cum știți, trebuie să plătiți pentru oportunitatea de a avea cele mai moderne tehnologii.

Politica de prețuri pentru procesoare Intel, se bazează pe ambele numărul de nuclee, cantitatea de cache dar și pe „Prospețimea” arhitecturii, performanță pe cicluwatt,tehnologie cu cip... Semnificația memoriei cache, „subtilitățile procesului tehnic” și alte caracteristici importante ale procesorului vor fi discutate mai jos. Pentru deținerea unor astfel de tehnologii precum un multiplicator de frecvență gratuit, va trebui să plătiți și o sumă suplimentară.

Companie AMD, spre deosebire de companie Intel, depune eforturi pentru disponibilitatea procesoarelor săi pentru utilizatorul final și pentru o politică de prețuri competentă.

Ai putea spune chiar asta AMD– « Brandul oamenilor". În etichetele sale de preț veți găsi ceea ce aveți nevoie la un preț foarte atractiv. De obicei, la un an după ce o nouă tehnologie este disponibilă pentru companie Intel, există un analog al tehnologiei din AMD... Dacă nu urmăriți cea mai înaltă performanță și acordați mai multă atenție prețului decât disponibilității tehnologiilor avansate, atunci produsele companiei AMD- doar pentru tine.

Politica de pret AMD, se bazează mai mult pe numărul de nuclee și destul de mult - pe cantitatea de memorie cache, prezența îmbunătățirilor arhitecturale. În unele cazuri, pentru a putea avea o memorie cache de nivel al treilea, va trebui să plătiți puțin în plus ( Fenomul are o memorie cache de 3 nivele, Athlon conținut doar limitat, 2 niveluri). Dar cateodata AMDÎși răsfață fanii capacitatea de a debloca procesoare mai ieftine la altele mai scumpe. Puteți debloca nucleele sau memoria cache. Îmbunătăţi Athlon inainte de Fenomul... Acest lucru este posibil datorită arhitecturii modulare și a lipsei unor modele mai ieftine, AMD doar dezactivează unele blocuri pe cip ale celor mai scumpe (programatic).

Sâmburi- rămân practic neschimbate, doar numărul lor diferă (valabil pentru procesoare 2006-2011 ani). Datorită modularității procesoarelor sale, compania face o treabă excelentă de a vinde cipuri respinse, care, atunci când unele blocuri sunt oprite, devin un procesor dintr-o linie mai puțin productivă.

Compania lucrează la o arhitectură complet nouă de mulți ani sub numele de cod Buldozer, dar la momentul intrarii 2011 anul, noile procesoare nu au prezentat cele mai bune performanțe. AMD au păcătuit pe sistemele de operare că nu au înțeles caracteristicile arhitecturale ale dual-core-urilor și ale „altelor multithreading”.

Potrivit reprezentanților companiei, este de așteptat ca corecțiile și patch-urile speciale să experimenteze performanța deplină a acestor procesoare. Cu toate acestea, la început 2012 ani, reprezentanții companiei au amânat lansarea actualizării pentru a susține arhitectura Buldozer pentru a doua jumătate a anului.

Frecvența procesorului, numărul de nuclee, multithreading.

În vremuri Pentium 4și înaintea lui - frecvența procesorului a fost principalul factor de performanță a procesorului la alegerea unui procesor.

Acest lucru nu este surprinzător, deoarece arhitecturile procesoarelor au fost special concepute pentru a atinge o frecvență înaltă, acest lucru s-a reflectat în mod deosebit în procesor. Pentium 4 asupra arhitecturii NetBurst... Frecvența înaltă nu a fost eficientă cu conducta lungă folosită în arhitectură. Chiar Athlon XP frecvență 2GHz, din punct de vedere al performanței, a fost mai mare decât Pentium 4 c 2,4 GHz... Deci a fost marketing pur. După această eroare, compania Intelși-a dat seama de greșelile mele și revenit la partea bună Am început să lucrez nu la componenta de frecvență, ci la performanța pe ciclu de ceas. Din arhitectura NetBurst trebuia abandonat.

Ce noi oferă multicore?

Procesor quad-core cu frecvență 2,4 GHz, în aplicațiile multi-threaded, va fi teoretic echivalentul aproximativ al unui procesor single-core cu o frecvență 9,6 GHz sau un procesor cu 2 nuclee cu o frecvență 4,8 GHz... Dar doar asta teoretic. Practic cu toate acestea, două procesoare dual-core dintr-o placă de bază cu două socluri vor fi mai rapide decât un procesor cu 4 nuclee la aceeași frecvență de operare. Viteza magistralei și limitările latenței memoriei sunt evidente.

* supus aceleași arhitecturi și cantitatea de memorie cache

Multi-core, face posibilă executarea instrucțiunilor și calculelor în părți. De exemplu, trebuie să efectuați trei operații aritmetice. Primele două sunt executate pe fiecare dintre nucleele procesorului și rezultatele sunt adăugate în memoria cache, unde următoarea acțiune poate fi efectuată asupra lor de către oricare dintre nucleele libere. Sistemul este foarte flexibil, dar fără o optimizare adecvată este posibil să nu funcționeze. Prin urmare, este foarte important să se optimizeze pentru multicore pentru arhitectura procesoarelor din mediul OS.

Aplicații care „iubesc” și utilizare multithreading: arhivatorii, playere și codificatoare video, antivirusuri, programe de defragmentare, editor grafic, browsere, Flash.

De asemenea, „iubitorilor” de multithreading, le puteți referi la astfel de sisteme de operare ca Windows 7și Windows Vista, precum și multe OS bazat pe nucleu Linux care rulează considerabil mai repede cu un procesor multi-core.

Cel mai jocuri, un procesor cu 2 nuclee la o frecvență înaltă este suficient. Acum, însă, sunt lansate tot mai multe jocuri, „sharpened” pentru multithreading. Luați cel puțin așa SandBox jocuri ca Gta 4 sau Prototip, în care pe un procesor cu 2 nuclee cu o frecvență mai jos 2,6 GHz- nu te simti confortabil, frame rate scade sub 30 de cadre pe secunda. Deși în acest caz, cel mai probabil motivul pentru astfel de incidente este optimizarea „slabă” a jocurilor, lipsa de timp sau mâinile „indirecte” a celor care au transferat jocuri de pe console în PC.

Când cumpărați un procesor nou pentru jocuri, acum ar trebui să acordați atenție procesoarelor cu 4 sau mai multe nuclee. Dar totuși, nu trebuie să neglijați procesoarele cu 2 nuclee din „categoria superioară”. În unele jocuri, aceste procesoare se simt uneori mai bine decât unele cu mai multe nuclee.

Memoria cache a procesorului.

- Aceasta este o zonă dedicată a cristalului procesorului, în care sunt procesate și stocate datele intermediare dintre nucleele procesorului, RAM și alte magistrale.

Funcționează la o viteză de ceas foarte mare (de obicei la frecvența procesorului în sine), are o lățime de bandă foarte mare și nucleele procesorului lucrează direct cu acesta ( L1).

Din cauza ei lipsuri, procesorul poate fi inactiv în sarcini consumatoare de timp, așteptând ca date noi să ajungă în cache pentru procesare. De asemenea, memoria cache serveste pentruÎnregistrări ale datelor repetate frecvent, care, dacă este necesar, pot fi restaurate rapid fără calcule inutile, fără a forța procesorul să piardă din nou timpul cu ele.

Performanța este adăugată și de faptul că memoria cache este unificată și toate nucleele pot folosi în mod egal datele din aceasta. Acest lucru oferă oportunități suplimentare pentru optimizarea multi-threaded.

Această tehnică este folosită acum pentru Nivelul 3 cache... Procesoare Intel au existat procesoare cu cache L2 partajat ( C2D E 7 ***,E 8 ***), datorită căruia această metodă pare să mărească performanța multi-threaded.

La overclockarea procesorului, memoria cache poate deveni un punct slab, împiedicând procesorul să overclockeze mai mult decât frecvența maximă de operare fără erori. Cu toate acestea, avantajul este că va rula la aceeași frecvență cu procesorul overclockat.

În general, cu cât mai multă memorie cache, cu atât Mai repede CPU. În ce aplicații?

Toate aplicațiile în care sunt utilizate o mulțime de date, instrucțiuni și fluxuri în virgulă mobilă, memoria cache este utilizată în mod activ. Le place foarte mult memoria cache arhivatorii, codificatoare video, antivirusuriși editor grafic etc.

Favorabil pentru o cantitate mare de memorie cache include jocuri... În special strategii, simulări automate, RPG-uri, SandBox și toate jocurile în care există multe detalii mici, particule, elemente de geometrie, fluxuri de informații și efecte fizice.

Memoria cache joacă un rol foarte important în deblocarea potențialului sistemelor cu 2 sau mai multe plăci video. La urma urmei, o parte din sarcină cade pe interacțiunea nucleelor ​​procesorului atât între ele, cât și pentru lucrul cu fluxuri de mai multe cipuri video. În acest caz este importantă organizarea memoriei cache, iar cache-ul L3 de volum mare este foarte util.

Memoria cache, întotdeauna echipată cu protecție împotriva posibilelor erori ( ECC), la detectarea cărora, acestea sunt corectate. Acest lucru este foarte important, deoarece o mică eroare în memoria cache, în timpul procesării, se poate transforma într-o eroare gigantică, continuă, din care va cădea întregul sistem.

Tehnologii proprietare.

(hiper-threading, Ht)–

pentru prima dată tehnologia a fost aplicată în procesoare Pentium 4, dar nu a funcționat întotdeauna corect și adesea a încetinit procesorul mai mult decât l-a accelerat. Motivul a fost o conductă prea lungă și un sistem incomplet de predicție a ramurilor. Aplicat de companie Intel, nu există încă analogi ai tehnologiei, cu excepția unui analog atunci? ceea ce inginerii companiei au implementat AMDîn arhitectură Buldozer.

Principiul sistemului este astfel încât pentru fiecare nucleu fizic, a două fire de calculîn loc de unul. Adică dacă ai un procesor cu 4 nuclee Ht (Core i 7), atunci aveți fire virtuale 8 .

Câștigul de performanță este atins datorită faptului că datele pot intra în conductă deja în mijlocul acesteia și nu neapărat mai întâi. Dacă orice unități de procesor capabile să efectueze această acțiune sunt inactive, primesc o sarcină pentru execuție. Câștigul de performanță nu este același ca în nucleele fizice reale, dar comparabil (~ 50-75%, în funcție de tipul de aplicație). Rareori se întâmplă ca în unele aplicații, HT afectează negativ asupra performanței. Acest lucru se datorează optimizării slabe a aplicațiilor pentru această tehnologie, incapacității de a înțelege că există fluxuri „virtuale” și absenței limitatoarelor pentru încărcarea fluxurilor uniform.

TurboBoost Este o tehnologie foarte utilă care mărește frecvența de funcționare a celor mai utilizate nuclee de procesor, în funcție de nivelul volumului de lucru al acestora. Este foarte util atunci când aplicația nu știe să folosească toate cele 4 nuclee și încarcă doar unul sau două, în timp ce frecvența lor de operare crește, ceea ce compensează parțial performanța. Un analog al acestei tehnologii pentru companie AMD este tehnologia Turbo Core.

, 3 stiu! instrucțiuni... Proiectat pentru a accelera procesorul multimedia calcule (video, muzică, grafică 2D / 3D etc.), precum și accelerarea activității unor programe precum arhivare, programe de lucru cu imagini și video (cu sprijinul instrucțiunilor acestor programe).

3stiu! - tehnologie destul de veche AMD, care conține instrucțiuni suplimentare pentru manipularea conținutului multimedia, pe lângă SSE prima versiune.

* Și anume, capacitatea de procesare în flux a numerelor reale de precizie unică.

Prezența celei mai noi versiuni este un mare plus, procesorul începe să efectueze mai eficient anumite sarcini cu o optimizare software adecvată. Procesoare AMD au nume asemănătoare, dar ușor diferite.

* Exemplu - SSE 4.1 (Intel) - SSE 4A (AMD).

În plus, aceste seturi de instrucțiuni nu sunt identice. Aceștia sunt analogi în care există mici diferențe.

Cool'n'Quiet, SpeedStep, CoolCore, Încântat Jumătate Stat (C1E) șiT... d.

Aceste tehnologii, la sarcină mică, reduc frecvența procesorului prin reducerea multiplicatorului și a tensiunii de pe nucleu, dezactivând o parte din cache etc. Acest lucru permite procesorului să se încălzească mult mai puțin și să consume mai puțină energie și să facă mai puțin zgomot. Dacă este nevoie de alimentare, procesorul va reveni la starea sa normală într-o fracțiune de secundă. La setările standard Bios aproape întotdeauna activate, dacă se dorește, pot fi dezactivate pentru a reduce posibilele „înghețuri” la comutarea în jocuri 3D.

Unele dintre aceste tehnologii controlează viteza ventilatoarelor din sistem. De exemplu, dacă procesorul nu are nevoie de o disipare crescută a căldurii și nu este încărcat, viteza ventilatorului procesorului scade ( AMD Cool'n'Quiet, Intel Speed ​​​​Step).

Tehnologia de virtualizare Intelși Virtualizare AMD.

Aceste tehnologii hardware permit utilizarea unor programe speciale pentru a rula mai multe sisteme de operare simultan, fără pierderi semnificative de performanță. De asemenea, este folosit pentru funcționarea corectă a serverelor, deoarece adesea, pe ele sunt instalate mai multe sisteme de operare.

A executa Dezactivați Picși# a executa Pic tehnologie concepută pentru a vă proteja computerul împotriva atacurilor de viruși și a erorilor software care pot cauza o prăbușire a sistemului depășirea tamponului.

Intel 64 , AMD 64 , EM 64 T - aceasta tehnologie permite procesorului sa functioneze atat intr-un OS cu arhitectura pe 32 de biti cat si intr-un OS cu unul pe 64 de biti. Sistem 64 de biți- din punct de vedere al beneficiilor, pentru un utilizator obișnuit se deosebește prin faptul că acest sistem poate folosi mai mult de 3,25 GB de RAM. Pe sistemele pe 32 de biți, utilizați b O Nu este posibilă o cantitate mai mare de RAM din cauza cantității limitate de memorie adresabilă *.

Majoritatea aplicațiilor cu arhitectură pe 32 de biți pot fi rulate pe un sistem cu sistem de operare pe 64 de biți.

* Ce poți face dacă în 1985, nimeni nu s-ar putea gândi la astfel de volume gigantice de RAM, după standardele de atunci.

În plus.

Câteva cuvinte despre.

Acest punct merită să acordați o atenție deosebită. Cu cât procesul tehnic este mai subțire, cu atât procesorul consumă mai puțină energie și, ca urmare, se încălzește mai puțin. Și, printre altele, are o marjă de siguranță mai mare pentru overclockare.

Cu cât procesul tehnic este mai fin, cu atât poți „înfășura” într-un cip (și nu numai) și crește capacitățile procesorului. În același timp, disiparea căldurii și consumul de energie sunt, de asemenea, reduse proporțional, datorită pierderilor de curent mai mici și scăderii zonei miezului. Se poate observa o tendință că cu fiecare nouă generație a aceleiași arhitecturi pe un nou proces tehnic crește și consumul de energie, dar nu este așa. Doar că producătorii se îndreaptă către performanțe și mai mari și trec peste linia de disipare a căldurii a generației anterioare de procesoare din cauza creșterii numărului de tranzistori, care nu este proporțională cu scăderea procesului tehnic.

Încorporat în procesor.

Dacă nu aveți nevoie de un nucleu video integrat, atunci nu ar trebui să cumpărați un procesor cu acesta. Veți obține doar o disipare mai proastă a căldurii, exces de căldură (nu întotdeauna), un potențial de overclocking mai slab (nu întotdeauna) și bani plătiți în exces.

În plus, acele nuclee care sunt încorporate în procesor sunt potrivite doar pentru încărcarea sistemului de operare, navigarea pe Internet și vizionarea videoclipurilor (și chiar și atunci nu de nicio calitate).

Tendințele pieței sunt încă în schimbare și oportunitatea de a cumpăra un procesor productiv de la Intel fără un nucleu video, cade din ce în ce mai puțin. Politica de a forța impunerea unui nucleu video încorporat, a apărut cu procesoare Intel cu nume de cod Pod de nisip, a cărui principală inovație a fost nucleul încorporat bazat pe același proces tehnic. Nucleul video este localizat de comun acord cu procesor pe un cristal, și nu la fel de simplu ca în generațiile anterioare de procesoare Intel... Pentru cei care nu-l folosesc, există dezavantaje sub forma unei plăți excesive pentru procesor, deplasarea sursei de încălzire față de centrul capacului de distribuție a căldurii. Cu toate acestea, există și plusuri. Miez video dezactivat, poate fi folosit pentru codificare video foarte rapidă folosind tehnologie Sincronizare rapidă cuplat cu software special care suportă această tehnologie. In viitor, Intel promite să extindă orizonturile utilizării nucleului video încorporat pentru calculul paralel.

Prize procesor. Durata de viață a platformei.


Intel are o politică aspră pentru platformele lor. Durata de viață a fiecăruia (perioada pentru începutul și sfârșitul vânzărilor de procesoare pentru acesta), de obicei nu depășește 1,5 - 2 ani. În plus, compania are mai multe platforme care se dezvoltă în paralel.

Companie AMD, are politica opusă de compatibilitate. Pe platforma ei AM 3, se va potrivi tuturor generațiilor viitoare de procesoare care acceptă DDR3... Chiar și atunci când platforma iese la AM 3+ iar mai târziu, fie noi procesoare vor fi lansate separat pentru AM 3, sau noile procesoare vor fi compatibile cu plăcile de bază vechi și se va putea face un upgrade nedureros pentru portofel schimbând doar procesorul (fără a schimba placa de bază, RAM, etc.) și flash-ul plăcii de bază. Singurele nuanțe de incompatibilitate pot fi atunci când se schimbă tipul, deoarece va fi necesar un controler de memorie diferit încorporat în procesor. Deci compatibilitatea este limitată și nu este acceptată de toate plăcile de bază. Dar, în general, pentru un utilizator economic sau cei care nu sunt obișnuiți să schimbe complet platforma la fiecare 2 ani - alegerea producătorului procesorului este clară - aceasta este AMD.

Răcirea procesorului.

Ca standard, procesorul vine cu CUTIE- un nou cooler care pur și simplu va face față sarcinii sale. Este o bucată de aluminiu cu o zonă de dispersie nu foarte mare. Răcitoarele eficiente bazate pe conducte termice și aripioare fixe sunt proiectate pentru o disipare foarte eficientă a căldurii. Dacă nu doriți să auziți zgomot inutil de la ventilator, atunci ar trebui să cumpărați un răcitor alternativ, mai eficient, cu conducte de căldură, sau un sistem de răcire cu lichid în buclă închisă sau în buclă deschisă. Astfel de sisteme de răcire vor oferi suplimentar posibilitatea de overclocking pentru procesor.

Concluzie.

Au fost luate în considerare toate aspectele importante care afectează performanța și performanța procesorului. Să repetăm ​​la ce ar trebui să fii atent:

  • Selectați producătorul
  • Arhitectura procesorului
  • Proces tehnic
  • frecvența procesorului
  • Numărul de nuclee de procesor
  • Mărimea și tipul cache al procesorului
  • Tehnologie și suport de instruire
  • Răcire de calitate

Sperăm că acest material vă va ajuta să înțelegeți și să vă decideți asupra alegerii unui procesor care să corespundă așteptărilor dumneavoastră.

saul 9 septembrie 2015 la 13:38

Implementarea unei arhitecturi de motor de joc multi-thread

  • Blog Intel,
  • Dezvoltarea jocurilor,
  • programare paralela,
  • Dezvoltare site
  • Traducere

Odată cu apariția procesoarelor multi-core, a devenit necesară crearea unui motor de joc bazat pe o arhitectură paralelă. Folosirea tuturor procesoarelor din sistem - atât procesorul grafic (GPU) cât și procesorul central (CPU) - deschide mult mai multe posibilități decât un motor cu un singur fir numai GPU. De exemplu, folosind mai multe nuclee CPU, puteți îmbunătăți imaginile prin creșterea numărului de obiecte fizice utilizate în joc, precum și să obțineți un comportament mai realist al personajelor prin implementarea inteligenței artificiale (AI) avansate.
Să luăm în considerare caracteristicile implementării arhitecturii multi-threaded a motorului de joc.

1. Introducere

1.1. Prezentare generală

Arhitectura multi-threaded a motorului de joc vă permite să utilizați la maximum capacitățile tuturor procesoarelor de pe platformă. Acesta presupune execuția paralelă a diferitelor blocuri funcționale pe toate procesoarele disponibile. Cu toate acestea, se dovedește a nu fi atât de ușor să implementați o astfel de schemă. Elementele individuale ale motorului de joc interacționează adesea între ele, ceea ce poate duce la erori atunci când sunt executate simultan. Pentru a gestiona astfel de scenarii, motorul oferă mecanisme speciale pentru sincronizarea datelor, excluzând posibilele blocări. De asemenea, implementează și metode de sincronizare a datelor în același timp, minimizând astfel timpul de execuție.

Pentru a înțelege materialele prezentate, trebuie să înțelegeți bine metodele moderne de creare a jocurilor pe calculator, suportarea multithreading-ului pentru motoarele de jocuri sau îmbunătățirea performanței aplicațiilor în general.

2. Stare de execuție paralelă

Starea concurenței este un concept cheie în multithreading. Numai împărțind motorul de joc în sisteme separate, fiecare funcționând în propriul mod și practic neinteracționând cu restul motorului, se poate obține cea mai mare eficiență a calculului paralel și se poate reduce timpul necesar pentru sincronizare. Nu este posibil să izolați complet părțile individuale ale motorului prin excluderea tuturor resurselor partajate. Cu toate acestea, pentru operațiuni precum preluarea datelor de poziție sau orientare pentru obiecte, sistemele individuale pot folosi copii locale ale datelor, mai degrabă decât resursele partajate. Acest lucru vă permite să minimizați dependența de date în diferite părți ale motorului. Modificările aduse datelor partajate efectuate de un sistem individual sunt notificate managerului de stat, care le pune în coadă. Acesta se numește modul de mesagerie. Acest mod presupune că, după finalizarea sarcinilor, sistemele motoare primesc notificări cu privire la modificări și își actualizează datele interne în consecință. Acest mecanism poate reduce semnificativ timpul de sincronizare și dependența sistemelor unul față de celălalt.

2.1 Stări de execuție

Pentru ca managerul de stat de execuție să funcționeze eficient, se recomandă sincronizarea operațiilor la un anumit ceas. Acest lucru permite tuturor sistemelor să ruleze în același timp. În acest caz, rata de ceas nu trebuie să corespundă cu rata de cadre. Și durata ciclurilor de ceas poate să nu depindă de frecvență. Poate fi selectat astfel încât un ciclu de ceas să corespundă timpului necesar pentru a transmite un cadru (indiferent de dimensiunea acestuia). Cu alte cuvinte, frecvența sau durata căpușelor este determinată de implementarea specifică a managerului de stat. Figura 1 prezintă un mod de operare pas cu pas „gratuit”, care nu necesită ca toate sistemele să finalizeze o operație în același ciclu de ceas. Modul în care toate sistemele completează execuția operațiunilor într-un singur ciclu de ceas se numește modul pas „hard”. Este prezentat schematic în figura 2.


Figura 1. Starea de execuție în modul gratuit pas cu pas

2.1.1. Mod gratuit pas cu pas
Într-un mod gratuit pas cu pas, toate sistemele funcționează continuu pentru o perioadă de timp predeterminată necesară pentru a finaliza următoarea porțiune de calcule. Cu toate acestea, numele „liber” nu trebuie luat la propriu: sistemele nu sunt sincronizate la un moment arbitrar, ci sunt doar „libere” în alegerea numărului de cicluri de ceas necesare pentru a finaliza etapa următoare.
În general, în acest mod, nu este suficient să trimiteți o simplă notificare a unei schimbări de stat către managerul de stat. Trebuie trimise și datele actualizate. Acest lucru se datorează faptului că sistemul care a modificat datele partajate ar putea fi într-o stare de funcționare în timp ce un alt sistem care așteaptă datele respective este pe cale să se actualizeze. În acest caz, este necesară mai multă memorie deoarece trebuie făcute mai multe copii ale datelor. Prin urmare, regimul „liber” nu poate fi considerat o soluție universală pentru toate ocaziile.
2.1.2. Modul pas greu
În acest mod, execuția sarcinilor pe toate sistemele este finalizată într-un singur ciclu. Acest mecanism este mai simplu de implementat și nu necesită transferul de date actualizate împreună cu notificarea. Într-adevăr, dacă este necesar, un sistem poate solicita pur și simplu noi valori de la alt sistem (desigur, la sfârșitul ciclului de rulare).
În modul hard, puteți implementa un mod de operare în pas pseudo-liber prin distribuirea calculelor între diferiți pași. În special, acest lucru poate fi necesar pentru calculele AI, în care un „obiectiv comun” inițial este calculat în primul ciclu de ceas, care este rafinat treptat în etapele următoare.


Figura 2. Starea de execuție în modul hard pas cu pas

2.2. Sincronizarea datelor

Modificările datelor partajate de mai multe sisteme pot duce la un conflict de modificări. În acest caz, sistemul de mesagerie trebuie să furnizeze un algoritm pentru alegerea valorii totale corecte. Există două abordări principale bazate pe următoarele criterii.
  • Timp: valoarea finală este ultima modificare efectuată.
  • Prioritate: totalul este modificarea efectuată de sistemul cu cea mai mare prioritate. Dacă prioritatea sistemelor este aceeași, puteți lua în considerare și momentul schimbării.
Toate datele învechite (pentru oricare dintre criterii) pot fi pur și simplu suprascrise sau excluse din coada de notificări.
Deoarece totalul poate varia în funcție de ordinea în care se fac modificările, poate fi foarte dificil să se utilizeze valorile relative ale datelor totale. În astfel de cazuri, ar trebui utilizate valori absolute. Apoi, la actualizarea datelor locale, sistemele pot pur și simplu înlocui vechile valori cu altele noi. Soluția optimă este alegerea valorilor absolute sau relative în funcție de situația specifică. De exemplu, datele generale precum poziția și orientarea trebuie să fie absolute deoarece ordinea în care se fac modificările este importantă. Valorile relative pot fi utilizate, de exemplu, pentru un sistem de generare a particulelor, deoarece toate informațiile despre particule sunt stocate numai în acesta.

3. Motor

La dezvoltarea motorului, accentul principal se pune pe flexibilitatea necesară pentru a-i extinde și mai mult funcționalitatea. Acest lucru îl va optimiza pentru utilizare sub anumite constrângeri (de exemplu, memorie).
Motorul poate fi împărțit aproximativ în două părți: cadru și manageri. Cadrul (vezi secțiunea 3.1) include părți ale jocului care sunt replicate în timpul execuției, adică există în mai multe cazuri. Include și elementele implicate în execuția buclei principale de joc. Managerii (vezi secțiunea 3.2) sunt obiecte Singleton care sunt responsabile pentru executarea logicii jocului.
Mai jos este o diagramă a motorului de joc.


Figura 3. Arhitectura generală a motorului

Vă rugăm să rețineți că modulele sau sistemele funcționale de joc nu fac parte din motor. Motorul doar le unește împreună, acționând ca un element de legătură. Această organizare modulară face posibilă încărcarea și descărcarea sistemelor după cum este necesar.

Interacțiunea dintre motor și sisteme se realizează folosind interfețe. Ele sunt implementate în așa fel încât să ofere motorului acces la funcțiile sistemului, iar sistemele - managerilor de motor.
O diagramă detaliată a motorului este furnizată în Anexa A, Diagrama motorului.

Practic, toate sistemele sunt independente unele de altele (vezi Secțiunea 2, „Starea de execuție simultană”), adică pot efectua acțiuni în paralel fără a afecta funcționarea altor sisteme. Cu toate acestea, orice modificare a datelor va atrage anumite dificultăți, deoarece sistemele vor trebui să interacționeze între ele. Schimbul de informații între sisteme este necesar în următoarele cazuri:

  • pentru a informa un alt sistem despre o modificare a datelor generale (de exemplu, poziția sau orientarea obiectelor);
  • pentru a efectua funcții care nu sunt disponibile pentru acest sistem (de exemplu, sistemul AI apelează la sistemul de calcul al proprietăților geometrice sau fizice ale unui obiect pentru a efectua un test de intersecție a razei).
În primul caz, managerul de stat descris în secțiunea anterioară poate fi folosit pentru a controla schimbul de informații. (Pentru mai multe informații despre managerul de stat, a se vedea Secțiunea 3.2.2, „Managerul de stat”.)
În al doilea caz, este necesar să se implementeze un mecanism special care să ofere serviciile unui sistem pentru utilizarea altuia. O descriere completă a acestui mecanism este furnizată în Secțiunea 3.2.3, „Manager de servicii”.

3.1. Cadru

Cadrul este folosit pentru a combina toate elementele motorului. Aici este inițializat motorul, cu excepția managerilor, care sunt instanțiați la nivel global. De asemenea, stochează informații despre scenă. Pentru a obține o mai mare flexibilitate, scena este implementată ca o așa-numită scenă generică care conține obiecte generice. Sunt containere care combină diferitele părți funcționale ale scenei. Pentru detalii, vezi secțiunea 3.1.2.
Bucla principală a jocului este, de asemenea, implementată în cadru. Poate fi reprezentat schematic după cum urmează.


Figura 4. Bucla principală a jocului

Motorul rulează într-un mediu cu ferestre, așa că primul pas în bucla de joc trebuie să proceseze orice mesaj în așteptare din ferestrele sistemului de operare. Dacă acest lucru nu se face, motorul nu va răspunde la mesajele sistemului de operare. În al doilea pas, planificatorul atribuie sarcini utilizând managerul de activități. Acest proces este detaliat în secțiunea 3.1.1 de mai jos. După aceea, managerul de stat (a se vedea secțiunea 3.2.2) trimite informații despre modificările aduse sistemelor motoarelor, a căror activitate le poate afecta. La ultimul pas, în funcție de starea de execuție, cadrul determină dacă se încheie sau se continuă motorul, de exemplu, pentru a trece la scena următoare. Informațiile despre starea motorului sunt stocate de managerul de mediu. Pentru mai multe detalii vezi secțiunea 3.2.4.

3.1.1. Programator
Planificatorul generează un ceas de referință de execuție la o rată specificată. Dacă modul benchmark necesită ca următoarea operație să înceapă imediat după finalizarea celei anterioare, fără a aștepta sfârșitul ciclului, frecvența poate fi nelimitată.
La un semnal de ceas, planificatorul folosește managerul de activități pentru a pune sistemele în modul de rulare. În modul pas gratuit (Secțiunea 2.1.1), programatorul interogează sistemele pentru a determina de câte cicluri de ceas vor avea nevoie pentru a finaliza sarcina. Pe baza rezultatelor sondajului, planificatorul determină ce sisteme sunt gata de execuție și care își vor finaliza munca la un anumit pas de timp. Planificatorul poate modifica numărul de bifări dacă executarea unui sistem durează mai mult. În modul hard stepping (Secțiunea 2.1.2), toate sistemele încep și se termină la același ciclu de ceas, astfel încât planificatorul așteaptă ca toate sistemele să termine execuția.
3.1.2. Scenă și obiecte versatile
Scena și obiectele generice sunt containere pentru funcționalitatea implementată în alte sisteme. Acestea sunt destinate exclusiv să interacționeze cu motorul și nu îndeplinesc nicio altă funcție. Cu toate acestea, ele pot fi extinse pentru a profita de funcțiile disponibile altor sisteme. Acest lucru permite o cuplare liberă. Într-adevăr, o scenă și obiectele universale pot folosi proprietățile altor sisteme fără a fi legate de ele. Această proprietate elimină dependența sistemelor unul față de celălalt și le permite să funcționeze simultan.
Diagrama de mai jos prezintă o extensie a unei scene și obiect universal.


Figura 5. Extinderea scenei și obiectului universal

Să vedem cum funcționează extensiile în exemplul următor. Să presupunem că se realizează extinderea scenei universale universale, scena este extinsă pentru a folosi utilizarea proprietăților grafice, fizice și de altă natură. În acest caz, partea „grafică” a extensiei va fi responsabilă de inițializarea afișajului, iar partea sa „fizică” va fi responsabilă de implementarea legilor fizice pentru corpurile rigide, de exemplu, forța gravitației. Scenele conțin obiecte, așa că o scenă generică va include și mai multe obiecte generice. Obiectele generice pot fi, de asemenea, extinse sau pot fi extinse pentru a utiliza proprietăți grafice, fizice și alte proprietăți. De exemplu, desenul unui obiect pe ecran va fi implementat prin funcții de expansiune grafică, iar calculul interacțiunii solidelor - prin cele fizice.

O diagramă detaliată a interacțiunii motorului și sistemelor este dată în Anexa B, „Schema interacțiunii motorului și sistemelor”.
Trebuie remarcat faptul că scena generică și obiectul generic sunt responsabile pentru înregistrarea tuturor „extensiunilor” lor în managerul de stat, astfel încât toate extensiile să poată fi notificate cu privire la modificările efectuate de alte extensii (adică alte sisteme). Un exemplu este o extensie grafică înregistrată pentru a primi notificări privind modificările de poziție și orientare efectuate prin extensia fizică.
Pentru detalii despre componentele sistemului, consultați Secțiunea 5.2, Componentele sistemului.

3.2. Managerii

Managerii controlează activitatea motorului. Sunt obiecte Singleton, adică fiecare tip de manager este disponibil într-o singură instanță. Acest lucru este necesar deoarece duplicarea resurselor managerului va duce inevitabil la redundanță și va avea un impact negativ asupra performanței. În plus, managerii sunt responsabili pentru implementarea funcțiilor comune pentru toate sistemele.
3.2.1. Gestionar de sarcini
Managerul de activități este responsabil pentru gestionarea sarcinilor de sistem din pool-ul de fire. Pentru a asigura o scalare optimă în n ori și pentru a preveni alocarea firelor de execuție inutile, eliminând suprasarcina de comutare a sarcinilor de sistem de operare inutile, pool-ul de fire creează un fir de execuție pentru fiecare procesor.

Programatorul oferă managerului de activități o listă de sarcini de finalizat, precum și informații despre sarcinile care trebuie să aștepte pentru finalizare. El primește aceste date de la diverse sisteme. Fiecare sistem are de finalizat o singură sarcină. Această metodă se numește descompunere funcțională. Cu toate acestea, pentru prelucrarea datelor, fiecare astfel de sarcină poate fi împărțită într-un număr arbitrar de subsarcini (descompunerea datelor).
Mai jos este un exemplu de distribuire a sarcinilor între fire pentru un sistem quad-core.


Figura 6. Exemplu de pool de fire utilizate de un manager de activități

Pe lângă procesarea cererilor de planificare pentru acces la sarcinile principale, managerul de activități poate lucra în modul de inițializare. Interogează secvenţial sistemele din fiecare fir, astfel încât acestea să poată iniţializa depozitele de date locale necesare pentru funcţionare.
Sfaturi pentru implementarea unui manager de sarcini sunt oferite în Anexa D, Sfaturi pentru implementarea sarcinilor.

3.2.2. Manager de stat
Managerul de stat face parte din motorul de mesagerie. Monitorizează modificările și trimite notificări despre acestea către toate sistemele care pot fi afectate de aceste modificări. Pentru a nu trimite notificări inutile, managerul de stat stochează informații despre ce sisteme să notifice într-un anumit caz. Acest mecanism este implementat folosind modelul Observer (vezi Anexa C, Observer (modelul de proiectare)). Pe scurt, acest tipar presupune folosirea unui „observator” care monitorizează orice modificări ale subiectului, în timp ce controlorul schimbării acționează ca intermediar între ele.

Mecanismul funcționează după cum urmează. 1. Observatorul îi spune controlorului schimbărilor (sau managerului de stat) ce entități dorește să urmărească pentru modificări. 2. Subiectul notifică controlorului toate modificările sale. 3. La un semnal de la cadru, controlorul anunță observatorul despre schimbările în subiect. 4. Observatorul trimite subiectului o solicitare pentru a primi date actualizate.

În modul pas liber (vezi Secțiunea 2.1.1), implementarea acestui mecanism devine ceva mai complicată. În primul rând, datele actualizate vor trebui trimise împreună cu notificarea de modificare. În acest mod, trimiterea la cerere nu este aplicabilă. Într-adevăr, dacă în momentul primirii cererii, sistemul responsabil pentru modificări nu este încă finalizat de execuție, acesta nu va putea furniza date actualizate. În al doilea rând, dacă un sistem nu este încă pregătit să primească modificări la sfârșitul unui ciclu de ceas, managerul de stat va trebui să păstreze datele modificate până când toate sistemele înregistrate pentru a le primi sunt gata.

Cadrul oferă doi manageri de stat pentru aceasta: pentru procesarea modificărilor la nivel de scenă și la nivel de obiect. De obicei, mesajele referitoare la scene și obiecte sunt independente unele de altele, astfel încât utilizarea a doi manageri separați elimină necesitatea procesării datelor inutile. Dar dacă scena trebuie să țină cont de starea unui obiect, îl puteți înregistra pentru a primi notificări despre modificările acestuia.

Pentru a evita sincronizarea inutilă, managerul de stat generează separat o coadă de notificare de modificare pentru fiecare fir creat de managerul de activități. Prin urmare, nu este necesară sincronizarea atunci când accesați coada. Secțiunea 2.2 descrie o metodă care poate fi folosită pentru a îmbina cozile după execuție.


Figura 7. Notificarea modificărilor interne la un obiect generic

Notificările de modificare nu trebuie trimise secvenţial. Există o modalitate de a le trimite în paralel. Când execută o sarcină, sistemul lucrează cu toate obiectele sale. De exemplu, pe măsură ce obiectele fizice interacționează între ele, sistemul fizic controlează mișcarea acestora, calculul coliziunilor, noile forțe care acționează etc. La primirea notificărilor, obiectul sistem nu interacționează cu alte obiecte din sistemul său. Interacționează cu extensiile de obiecte generice asociate. Aceasta înseamnă că obiectele generice sunt acum independente unele de altele și pot fi actualizate în același timp. Această abordare nu exclude cazurile marginale care ar trebui luate în considerare în timpul procesului de sincronizare. Cu toate acestea, permite utilizarea modului de execuție paralelă atunci când părea că puteți acționa numai secvenţial.

3.2.3. Manager de servicii
Managerul de servicii oferă sistemelor acces la caracteristici ale altor sisteme care altfel nu le-ar fi disponibile. Este important să înțelegeți că funcțiile sunt accesate prin interfețe, nu direct. Informațiile despre interfețele de sistem sunt stocate și în managerul de servicii.
Pentru a elimina dependența sistemelor unul față de celălalt, fiecare dintre ele are doar un mic set de servicii. În plus, capacitatea de a utiliza un anumit serviciu nu este determinată de sistemul în sine, ci de managerul de servicii.


Figura 8. Exemplu de manager de servicii

Managerul de servicii are și o altă funcție. Oferă sistemelor acces la proprietățile altor sisteme. Proprietățile sunt valori specifice sistemului care nu sunt comunicate în sistemul de mesagerie. Aceasta poate fi o extindere a rezoluției ecranului într-un sistem grafic sau mărimea gravitației într-un sistem fizic. Managerul de servicii pune aceste date la dispoziția sistemelor, dar nu le controlează direct. Pune modificările proprietăților într-o coadă specială și le publică numai după execuția secvențială. Vă rugăm să rețineți că accesul la proprietățile altui sistem este rareori necesar și nu trebuie abuzat. De exemplu, s-ar putea să aveți nevoie de acesta pentru a activa sau dezactiva modul wireframe în sistemul grafic din fereastra consolei sau pentru a modifica rezoluția ecranului, așa cum este solicitat de jucător din interfața cu utilizatorul. Această caracteristică este utilizată în principal pentru a seta parametri care nu se schimbă de la cadru la cadru.

3.2.4. Manager de mediu
  • Managerul de mediu oferă mediul de rulare a motorului. Funcțiile sale pot fi împărțite condiționat în următoarele grupuri.
  • Variabile: numele și valorile variabilelor comune utilizate de toate părțile motorului. De obicei, valorile variabilelor sunt determinate atunci când scena este încărcată sau anumite setări ale utilizatorului. Motorul și diferitele sisteme le pot accesa prin trimiterea unei cereri.
  • Execuție: date de execuție, cum ar fi finalizarea unei scene sau execuția unui program. Acești parametri pot fi setați și solicitați atât de sistemele în sine, cât și de motor.
3.2.5. Manager de platformă
Managerul platformei implementează o abstractizare pentru apelurile sistemului de operare și oferă, de asemenea, funcționalități suplimentare dincolo de simpla abstractizare. Avantajul acestei abordări este că încapsulează mai multe funcții tipice într-un singur apel. Adică nu trebuie să fie implementate separat pentru fiecare apelant, supraîncărcându-l cu detalii despre apelurile OS.
Luați în considerare, ca exemplu, apelarea managerului de platformă pentru a încărca o bibliotecă dinamică de sistem. Nu numai că încarcă sistemul, dar primește și punctele de intrare în funcție și apelează funcția de inițializare a bibliotecii. Managerul stochează, de asemenea, descriptorul bibliotecii și îl descarcă după ce motorul este terminat.

Managerul platformei este, de asemenea, responsabil pentru furnizarea de informații despre procesor, cum ar fi instrucțiunile SIMD acceptate și pentru inițializarea unui mod specific de operare pentru procese. Sistemele nu pot utiliza alte funcții pentru generarea de interogări.

4. Interfețe

Interfețele sunt mijloacele de comunicare între cadru, manageri și sisteme. Cadrul și managerii fac parte din motor, astfel încât ei pot interacționa direct unul cu celălalt. Sistemele nu aparțin motorului. Mai mult, toate îndeplinesc funcții diferite, ceea ce duce la necesitatea creării unei singure metode de interacțiune cu ei. Deoarece sistemele nu pot interacționa direct cu managerii, aceștia trebuie să ofere o modalitate diferită de acces. Cu toate acestea, nu toate funcțiile managerilor ar trebui să fie deschise sistemelor. Unele dintre ele sunt disponibile numai pentru cadru.

Interfețele definesc un set de funcții necesare pentru a utiliza o metodă de acces standard. Acest lucru elimină necesitatea ca cadrul de a cunoaște detaliile de implementare a unor sisteme specifice, deoarece poate interacționa cu acestea doar printr-un anumit set de apeluri.

4.1. Interfețele subiect și observator

Scopul principal al interfețelor subiect și observator este să înregistreze observatorii despre care să trimită notificări și, de asemenea, să trimită astfel de notificări. Înregistrarea și întreruperea conexiunii cu observatorul sunt funcții standard pentru toate subiecții, incluse în implementarea interfeței acestora.

4.2. Interfețe manageriale

Managerii, deși sunt obiecte Singleton, sunt accesibili direct doar cadrului. Alte sisteme pot accesa managerii doar prin interfețe care reprezintă doar o fracțiune din funcționalitatea lor generală. După inițializare, interfața este transmisă sistemului, care o folosește pentru a lucra cu anumite funcții de manager.
Nu există o interfață unică pentru toți managerii. Fiecare dintre ele are propria sa interfață separată.

4.3. Interfețe de sistem

Pentru ca framework-ul să poată accesa componentele sistemului are nevoie de interfețe. Fără ele, suportul pentru fiecare nou sistem de motor ar trebui implementat separat.
Fiecare sistem include patru componente, deci ar trebui să existe patru interfețe. Și anume: sistem, scenă, obiect și sarcină. Consultați Secțiunea 5, Sisteme pentru o descriere detaliată. Interfețele sunt mijloacele de acces la componente. Interfețele de sistem vă permit să creați și să ștergeți scene. Interfețele de scenă, la rândul lor, vă permit să creați și să distrugeți obiecte, precum și să solicitați informații despre sarcina principală a sistemului. Interfața de activități este utilizată în principal de managerul de activități atunci când setați sarcini în pool-ul de fire.
Întrucât scena și obiectul, ca părți ale sistemului, trebuie să interacționeze între ele și cu scena universală și obiectul de care sunt atașate, interfețele lor sunt create și pe baza interfețelor subiectului și observatorului.

4.4. Schimbați interfețele

Aceste interfețe sunt folosite pentru a transfera date între sisteme. Toate sistemele care efectuează modificări de un anumit tip trebuie să implementeze o astfel de interfață. Geometria este un exemplu. Interfața de geometrie include metode pentru determinarea poziției, orientării și scarii unui element. Orice sistem care face modificări la geometrie trebuie să implementeze o astfel de interfață, astfel încât informațiile despre alte sisteme să nu fie necesare pentru a accesa datele modificate.

5. Sisteme

Sistemele sunt partea din motor care este responsabilă pentru implementarea funcționalității jocului. Ei îndeplinesc toate sarcinile de bază fără de care motorul nu ar avea sens. Interacțiunea dintre motor și sisteme se realizează folosind interfețe (a se vedea Secțiunea 4.3, „Interfețe de sistem”). Acest lucru este necesar pentru a nu supraîncărca motorul cu informații despre diferite tipuri de sisteme. Interfețele facilitează adăugarea unui nou sistem, deoarece motorul nu trebuie să ia în considerare toate detaliile de implementare.

5.1. Tipuri

Sistemele de motoare pot fi împărțite aproximativ în mai multe categorii predefinite corespunzătoare componentelor standard ale jocului. De exemplu: geometrie, grafică, fizică (coliziune solidă), sunet, procesare de intrare, AI și animație.
Sistemele cu funcții non-standard se încadrează într-o categorie separată. Este important de înțeles că orice sistem care modifică date pentru o anumită categorie trebuie să fie conștient de interfața acelei categorii, deoarece motorul nu furnizează astfel de informații.

5.2. Componentele sistemului

Pentru fiecare sistem trebuie implementate mai multe componente. Unele dintre ele sunt: ​​sistem, scenă, obiect și sarcină. Toate aceste componente sunt folosite pentru a interacționa cu diferite părți ale motorului.
Diagrama de mai jos prezintă interacțiunile dintre diferitele componente.


Figura 9. Componentele sistemului

O diagramă detaliată a conexiunilor dintre sistemele motoarelor este dată în Anexa B, „Schema interacțiunii dintre motor și sisteme”.

5.2.1. Sistem
Componenta „sistem”, sau pur și simplu sistemul, este responsabilă de inițializarea resurselor sistemului, care practic nu se vor schimba în timpul funcționării motorului. De exemplu, sistemul grafic analizează adresele resurselor pentru a determina unde se află acestea și pentru a accelera încărcarea atunci când se utilizează resursa. De asemenea, stabilește rezoluția ecranului.
Sistemul este principalul punct de intrare pentru cadru. Oferă informații despre sine (de exemplu, tipul de sistem), precum și metode pentru crearea și ștergerea scenelor.
5.2.2. Scenă
Componenta scenei sau scena de sistem este responsabilă de gestionarea resurselor asociate scenei curente. Scena generică utilizează scene de sistem pentru a extinde funcționalitatea prin valorificarea funcționalității acestora. Un exemplu este o scenă fizică care este folosită pentru a crea o nouă lume de joc și, la inițializarea scenei, determină forțele gravitaționale din ea.
Scenele oferă metode pentru crearea și distrugerea obiectelor, precum și o componentă „sarcină” pentru procesarea scenei și o metodă de accesare a acesteia.
5.2.3. Un obiect
Componenta obiect, sau obiectul de sistem, aparține scenei și este de obicei asociată cu ceea ce vede utilizatorul pe ecran. Un obiect generic folosește un obiect de sistem pentru a extinde funcționalitatea prin expunerea proprietăților sale ca fiind proprii.
Un exemplu este extensia geometrică, grafică și fizică a unui obiect generic pentru a afișa o grindă de lemn pe un ecran. Proprietățile geometrice vor include poziția, orientarea și scara obiectului. Sistemul grafic va folosi o grilă specială pentru a-l afișa. Și sistemul fizic îl va înzestra cu proprietățile unui corp rigid pentru calcularea interacțiunilor cu alte corpuri și a forțelor care acționează ale gravitației.

În anumite cazuri, un obiect de sistem trebuie să țină cont de modificările aduse unui obiect generic sau uneia dintre extensiile acestuia. În acest scop, puteți crea o relație specială care va urmări modificările efectuate.

5.2.4. Sarcină
Componenta de activitate sau sarcina de sistem este utilizată pentru a procesa o scenă. Sarcina primește o comandă pentru a actualiza scena de la managerul de activități. Acesta este un semnal pentru a rula funcțiile de sistem pe obiectele scenei.
Execuția unei sarcini poate fi împărțită în subsarcini, distribuându-le și folosind managerul de sarcini la un număr și mai mare de fire. Aceasta este o modalitate convenabilă de a scala motorul pe mai multe procesoare. Această tehnică se numește descompunere a datelor.
Informațiile despre modificările obiectelor în procesul de actualizare a sarcinilor scenei sunt transmise managerului de stat. Pentru detalii despre managerul de stat, vezi secțiunea 3.2.2.

6. Combinarea tuturor componentelor

Toate elementele descrise mai sus sunt legate între ele și fac parte dintr-un întreg. Lucrările motorului pot fi împărțite aproximativ în mai multe etape, descrise în secțiunile următoare.

6.1. Faza de inițializare

Motorul pornește cu inițializarea managerilor și a cadrului.
  • Frame-ul apelează încărcătorul de scenă.
  • După ce a determinat ce sisteme va folosi scena, încărcătorul cheamă managerul platformei pentru a încărca modulele corespunzătoare.
  • Managerul platformei încarcă modulele corespunzătoare și le transmite managerului de interfață, apoi le apelează pentru a crea un nou sistem.
  • Modulul returnează un pointer către instanța de sistem care implementează interfața sistemului la încărcător.
  • Managerul de servicii înregistrează toate serviciile pe care le oferă modulul de sistem.


Figura 10. Inițializarea managerilor și a sistemelor de motoare

6.2. Etapa de încărcare a scenei

Controlul este returnat la încărcător, care încarcă scena.
  • Încărcătorul creează o scenă generică. Pentru a instanția scene de sistem, apelează interfețele de sistem, extinzând funcționalitatea scenei generice.
  • Scena universală definește ce date poate modifica fiecare scenă de sistem și notificări despre ce modificări ar trebui să primească.
  • Prin potrivirea scenelor care fac anumite modificări și care doresc să fie anunțate despre acestea, scena generică transmite aceste informații managerului de stat.
  • Pentru fiecare obiect din scenă, încărcătorul creează un obiect generic, apoi determină ce sisteme vor extinde obiectul generic. Corespondența dintre obiectele sistemului este determinată în același mod în care se utilizează pentru scene. Se trece și managerului de stat.
  • Încărcătorul folosește interfețele de scenă rezultate pentru a instanția obiecte de sistem și le folosește pentru a extinde obiectele generice.
  • Planificatorul interoghează interfețele scenei pentru sarcinile lor principale, astfel încât aceste informații să poată fi transmise managerului de activități în timpul execuției.


Figura 11. Inițializarea scenei și obiectului universal

6.3. Etapa ciclului jocului

  • Managerul de platformă este utilizat pentru a procesa mesajele din fereastră și alte elemente necesare pentru ca platforma curentă să funcționeze.
  • Apoi controlul trece la programator, care așteaptă ca sfârșitul ceasului să continue să funcționeze.
  • La sfârșitul unui ciclu de ceas, într-un mod gratuit pas cu pas, planificatorul verifică ce sarcini au fost finalizate. Toate sarcinile finalizate (adică, gata de a fi efectuate) sunt transferate managerului de activități.
  • Programatorul determină ce sarcini vor fi finalizate în bifa curentă și așteaptă ca acestea să fie finalizate.
  • În modul hard step, aceste operații sunt repetate la fiecare măsură. Programatorul trimite toate sarcinile managerului și așteaptă ca acestea să fie finalizate.
6.3.1. Finalizarea sarcinii
Controlul este transferat managerului de activități.
  • Formează o coadă a tuturor sarcinilor primite, apoi, pe măsură ce apar firele libere, începe execuția lor. (Procesul de executare a sarcinilor diferă în funcție de sisteme. Sistemele pot lucra cu o singură sarcină sau pot procesa mai multe sarcini din coadă în același timp, realizând astfel execuție paralelă.)
  • În cursul execuției, sarcinile pot lucra cu întreaga scenă sau numai cu anumite obiecte, modificându-le datele interne.
  • Sistemele ar trebui să fie notificate cu privire la orice modificare a datelor generale (de exemplu, poziție sau orientare). Prin urmare, atunci când sarcina este executată, scena sau obiectul sistemului informează observatorul despre orice modificări. În acest caz, observatorul acționează de fapt ca un controlor al schimbării, care face parte din managerul de stat.
  • Controlerul de modificare generează o coadă de notificări de modificare pentru procesare ulterioară. Ignoră modificările care nu afectează observatorul dat.
  • Pentru a utiliza anumite servicii, o sarcină contactează managerul de servicii. Managerul de servicii vă permite, de asemenea, să modificați proprietățile altor sisteme care nu sunt disponibile pentru transmisie în motorul de mesagerie (de exemplu, sistemul de introducere a datelor modifică extensia ecranului - o proprietate a sistemului grafic).
  • De asemenea, sarcinile pot contacta managerul de mediu pentru a obține variabile de mediu și pentru a schimba starea de execuție (întrerupe execuția, trece la scena următoare etc.).


Figura 12. Manager de sarcini și sarcini

6.3.2. Actualizarea datelor
După finalizarea tuturor sarcinilor pentru bifa curentă, bucla principală a jocului cheamă managerul de stat pentru a începe faza de actualizare a datelor.
  • Managerul de stat cheamă pe rând fiecare dintre controlorii săi de modificare pentru a trimite notificările acumulate. Controlorul verifică la ce observatori să trimită notificări de modificare pentru fiecare subiect.
  • Apoi îl sună pe observatorul dorit și îl informează despre modificare (notificarea include și un pointer către interfața subiectului). În modul free-stepping, observatorul primește date modificate de la controlerul schimbării, dar în modul hard-stepping, trebuie să le solicite subiectului însuși.
  • De obicei, observatorii interesați să primească notificări de modificare a obiectelor de sistem sunt alte obiecte de sistem asociate cu același obiect generic. Acest lucru vă permite să împărțiți procesul de efectuare a modificărilor în mai multe sarcini care pot fi efectuate în paralel. Pentru a simplifica procesul de sincronizare, puteți combina toate extensiile legate de obiecte generice într-o singură sarcină.
6.3.3. Verificați progresul și ieșiți
Ultimul pas în bucla de joc este verificarea stării timpului de execuție. Există mai multe astfel de stări: rulare, pauză, scenă următoare etc. Dacă este selectată starea „în rulare”, următoarea iterație a buclei va începe. Starea „ieșire” înseamnă sfârșitul ciclului, eliberarea resurselor și ieșirea din aplicație. Pot fi implementate și alte stări, de exemplu, „pauză”, „scena următoare”, etc.

7. Concluzie

Ideea principală a acestui articol este prezentată în Secțiunea 2, „Starea de execuție paralelă”. Datorită descompunerii funcționale și descompunerii datelor, este posibil să se implementeze nu numai multithreading-ul motorului, ci și scalabilitatea acestuia la un număr și mai mare de nuclee în viitor. Pentru a elimina suprasarcina de sincronizare în timp ce vă păstrați datele actualizate, utilizați manageri de stat pe lângă mesagerie.

Modelul Observer este o funcție a motorului de mesagerie. Este important să înțelegeți bine cum funcționează pentru a alege cel mai bun mod de implementare pentru motor. De fapt, este un mecanism de interacțiune între diferite sisteme, care asigură sincronizarea datelor comune.

Managementul sarcinilor joacă un rol important în echilibrarea sarcinii. Anexa D oferă sfaturi pentru crearea unui manager de activități eficient pentru un motor de joc.

După cum puteți vedea, multithreading-ul motorului de joc este posibil datorită unei structuri bine definite și a unui mecanism de mesagerie. Poate îmbunătăți semnificativ performanța procesoarelor actuale și viitoare.

Anexa A. Schema motorului

Procesarea este pornită din bucla principală a jocului (vezi Fig. 4, „Bucla principală a jocului”).


Anexa B. Schema de interacțiune între motor și sisteme


Anexa C. Observator (model de proiectare)

Modelul Observer este descris în detaliu în cartea Tehnici de proiectare orientată pe obiecte. Design Patterns ", E. Gamma, R. Helm, R. Johnson, J. Vlissides (" Design Patterns: Elements of Reusable Object-Oriented Software ", Gamma E., Helm R., Johnson R., Vlissides J.). A fost publicat pentru prima dată în engleză în 1995 de către Addison-Wesley.

Ideea principală a acestui model este următoarea: dacă unele elemente trebuie notificate cu privire la modificările altor elemente, nu sunt obligați să caute lista cu toate modificările posibile, încercând să găsească datele necesare în ea. Modelul presupune prezența unui actor și a unui observator, care sunt utilizați pentru a trimite notificări de modificări. Observatorul monitorizează orice modificare a subiectului. Controlerul de schimbare acționează ca un intermediar între aceste două componente. Următoarea diagramă ilustrează această relație.


Figura 13. Şablon de observator

Procesul de utilizare a acestui model este descris mai jos.

  1. Controlorul modificării înregistrează observatorul și subiectul pentru care dorește să fie notificat.
  2. Controlorul schimbării este de fapt un observator. În locul observatorului, împreună cu subiectul, se înregistrează. Controlorul schimbării păstrează, de asemenea, propria listă de observatori și subiecți înregistrați la aceștia.
  3. O entitate adaugă un observator (adică controlorul modificărilor) la lista sa de observatori care doresc să fie notificați cu privire la modificările acesteia. Uneori este indicat suplimentar tipul de schimbare, ceea ce determină ce schimbări interesează observatorul. Acest lucru vă permite să simplificați procesul de trimitere a notificărilor de modificare.
  4. Când schimbă datele sau starea, subiectul notifică observatorul printr-un mecanism de apel invers și comunică informații despre tipurile modificate.
  5. Controlerul de modificări generează o coadă de notificări despre modificări și așteaptă un semnal pentru a le distribui obiectelor și sistemelor.
  6. În timpul distribuției, controlerul schimbării vorbește cu observatori reali.
  7. Observatorii solicită informații despre datele sau starea modificate de la subiect (sau le primesc împreună cu notificări).
  8. Înainte ca un observator să poată fi șters sau dacă nu mai trebuie să fie notificat despre un subiect, acesta elimină abonamentul la acel subiect din controlerul de modificări.
Există multe moduri diferite de a implementa distribuția sarcinilor. Cu toate acestea, cel mai bine este să păstrați numărul de fire de lucru egal cu numărul de procesoare logice ale platformei disponibile. Încercați să nu legați sarcinile de un anumit fir. Timpii de executare a sarcinilor diferitelor sisteme nu coincid întotdeauna. Acest lucru poate duce la distribuția neuniformă a sarcinii de lucru între firele de lucru și poate afecta eficiența. Pentru a ușura acest proces, utilizați biblioteci de gestionare a sarcinilor, cum ar fi

Nou pe site

>

Cel mai popular