Hvordan interagerer CPU og GPU for at gengive computergrafik?

Aug 21, 2025
Hardware

Din computers Central Processing Unit (CPU) og Graphics Processing Unit (GPU) interagerer hvert øjeblik, du bruger din computer til at levere dig en skarp og lydhør visuel grænseflade. Læs videre for bedre at forstå, hvordan de arbejder sammen.

Foto af sskennel .

Dagens Spørgsmål og svar-session kommer til os med tilladelse fra SuperUser - en underafdeling af Stack Exchange, en gruppedrevsgruppe af Q & A-websteder.

Spørgsmålet

SuperUser-læser Sathya stillede spørgsmålet:

Her kan du se et skærmbillede af et lille C ++ - program kaldet Triangle.exe med en roterende trekant baseret på OpenGL API.

Ganske vist et meget grundlæggende eksempel, men jeg synes, det kan anvendes til andre grafikkortoperationer.

Jeg var bare nysgerrig og ville gerne vide hele processen fra at dobbeltklikke på Triangle.exe under Windows XP, indtil jeg kan se trekanten rotere på skærmen. Hvad sker der, hvordan interagerer CPU (som først håndterer .exe) og GPU (som til sidst udsender trekanten på skærmen)?

Jeg gætter på, at involveret i visning af denne roterende trekant primært er følgende hardware / software blandt andre:

Hardware

  • HDD
  • Systemhukommelse (RAM)
  • CPU
  • Videohukommelse
  • GPU
  • LCD-skærm

Software

  • Operativ system
  • DirectX / OpenGL API
  • Nvidia Driver

Kan nogen forklare processen, måske med en slags rutediagram til illustration?

Det bør ikke være en kompleks forklaring, der dækker hvert eneste trin (gætte, der ville gå ud over omfanget), men en forklaring, som en mellemliggende it-fyr kan følge.

Jeg er ret sikker på, at mange mennesker, der endda kalder sig it-fagfolk, ikke kunne beskrive denne proces korrekt.

Svaret

Selvom flere medlemmer af samfundet besvarede spørgsmålet, gik Oliver Salzburg den ekstra mil og besvarede det ikke kun med et detaljeret svar, men fremragende ledsagende grafik.

Billede af JasonC, fås som tapet her .

Han skriver:

Jeg besluttede at skrive lidt om programmeringsaspektet og hvordan komponenter taler med hinanden. Måske kaster det lys over bestemte områder.

Præsentationen

Hvad skal der til for at have det eneste billede, som du har sendt i dit spørgsmål, tegnet på skærmen?

Der er mange måder at tegne en trekant på skærmen. Lad os for enkelhedens skyld antage, at der ikke blev brugt vertexbuffere. (EN toppunktbuffer er et hukommelsesområde, hvor du gemmer koordinater.) Lad os antage, at programmet simpelthen fortalte den grafiske behandlingsrørledning om hvert enkelt toppunkt (et toppunkt er bare en koordinat i rummet) i træk.

Men , inden vi kan tegne noget, skal vi først køre stilladser. Vi får at se hvorfor senere:

// Ryd skærmen og dybdebufferen
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Nulstil den aktuelle modelvisningsmatrix
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

// Tegning ved hjælp af trekanter
glBegin (GL_TRIANGLES);

  // Rød
  glColor3f (1.0f, 0.0f, 0.0f);
  // Top Of Triangle (forside)
  glVertex3f (0.0f, 1.0f, 0.0f);

  // Grøn
  glColor3f (0,0f, 1,0f, 0,0f);
  // Venstre af trekant (foran)
  glVertex3f (-1.0f, -1.0f, 1.0f);

  // Blå
  glColor3f (0,0f, 0,0f, 1,0f);
  // Right Of Triangle (forside)
  glVertex3f (1.0f, -1.0f, 1.0f);

// Udført tegning
glEnd ();

Så hvad gjorde det?

Når du skriver et program, der ønsker at bruge grafikkortet, vælger du normalt en slags interface til driveren. Nogle kendte grænseflader til føreren er:

  • OpenGL
  • Direkte3D
  • MIRAKLER

I dette eksempel holder vi os til OpenGL. Nu, din interface til driveren er det, der giver dig alle de værktøjer, du har brug for til at lave dit program tale til grafikkortet (eller driveren, som derefter samtaler til kortet).

Denne grænseflade er bundet til at give dig visse værktøjer . Disse værktøjer har form af en BRAND som du kan ringe fra dit program.

Denne API er det, vi ser brugt i eksemplet ovenfor. Lad os se nærmere på.

Stilladset

Inden du virkelig kan tegne en egentlig tegning, skal du udføre en Opsætning . Du skal definere din visningsport (det område, der rent faktisk gengives), dit perspektiv ( kamera ind i din verden), hvilken anti-aliasing du vil bruge (for at udjævne kanterne af din trekant) ...

Men vi vil ikke se på noget af det. Vi kigger bare på de ting, du skal gøre hver ramme . Synes godt om:

Rydning af skærmen

Grafikrørledningen vil ikke rydde skærmen for dig hver ramme. Du bliver nødt til at fortælle det. Hvorfor? Dette er grunden til:

Hvis du ikke rydder skærmen, gør du det ganske enkelt trække over det hver ramme. Derfor ringer vi glClear med GL_COLOR_BUFFER_BIT sæt. Den anden bit ( GL_DEPTH_BUFFER_BIT ) beder OpenGL om at rydde dybde buffer. Denne buffer bruges til at bestemme, hvilke pixels der er foran (eller bag) andre pixels.

Transformation


Billedkilde

Transformation er den del, hvor vi tager alle inputkoordinaterne (vinklerne i vores trekant) og anvender vores ModelView-matrix. Dette er den matrix, der forklarer hvordan vores model (hjørnerne) roteres, skaleres og oversættes (flyttes).

Dernæst anvender vi vores projektionsmatrix. Dette flytter alle koordinater, så de vender korrekt mod vores kamera.

Nu transformerer vi igen med vores Viewport-matrix. Vi gør dette for at skalere vores model til størrelsen på vores skærm. Nu har vi et sæt hjørner, der er klar til at blive gengivet!

Vi vender tilbage til transformation lidt senere.

Tegning

For at tegne en trekant kan vi simpelthen bede OpenGL om at starte en ny liste over trekanter ved at ringe glBegin med GL_TRIANGLES konstant.
Der er også andre former, du kan tegne. Som en trekantstrimmel eller a trekantventilator . Disse er primært optimeringer, da de kræver mindre kommunikation mellem CPU'en og GPU'en for at tegne den samme mængde trekanter.

Derefter kan vi give en liste med sæt med 3 hjørner, der skal udgøre hver trekant. Hver trekant bruger 3 koordinater (som vi er i 3D-rum). Derudover giver jeg også en farve for hvert toppunkt ved at ringe glColor3f Før ringer glVertex3f .

Skyggen mellem de 3 hjørner (de tre hjørner af trekanten) beregnes af OpenGL automatisk . Det interpolerer farven over hele polygonets overflade.

Interaktion

Nu, når du klikker på vinduet. Applikationen skal kun fange vinduesmeddelelse der signaliserer klik. Derefter kan du køre enhver handling i dit program, du ønsker.

Dette får en masse sværere, når du først vil interagere med din 3D-scene.

Du skal først vide tydeligt, hvilken pixel brugeren klikkede på vinduet. Så tag din perspektiv i betragtning kan du beregne retningen af ​​en stråle fra det museklikspunkt ind i din scene. Du kan derefter beregne, om et objekt i din scene krydser hinanden med den stråle . Nu ved du, om brugeren klikkede på et objekt.

Så hvordan får du det til at rotere?

Transformation

Jeg er opmærksom på to typer transformationer, der generelt anvendes:

  • Matrixbaseret transformation
  • Knoglebaseret transformation

Forskellen er, at knogler påvirker single hjørner . Matricer påvirker altid alle tegnede hjørner på samme måde. Lad os se på et eksempel.

Eksempel

Tidligere har vi indlæst vores identitetsmatrix inden vi tegner vores trekant. Identitetsmatricen er en, der simpelthen giver ingen transformation overhovedet. Så uanset hvad jeg tegner, påvirkes kun af mit perspektiv. Så trekanten roteres slet ikke.

Hvis jeg vil rotere det nu, kunne jeg enten lave matematikken selv (på CPU'en) og bare ringe glVertex3f med Andet koordinater (som roteres). Eller jeg kunne lade GPU'en gøre alt arbejdet ved at ringe glRotatef inden tegning:

// Drej trekanten på Y-aksen glRotatef (mængde, 0,0f, 1,0f, 0,0f);

beløb er selvfølgelig bare en fast værdi. Hvis du vil animeret , skal du holde styr på beløb og øg det hver ramme.

Så vent, hvad skete der med al matrix-samtalen tidligere?

I dette enkle eksempel behøver vi ikke bekymre os om matricer. Vi kalder simpelthen glRotatef og det tager sig af alt det for os.

glRotat producerer en rotation af vinkel grader omkring vektoren x y z. Den aktuelle matrix (se glMatrixMode ) ganges med en rotationsmatrix, hvor produktet erstatter den aktuelle matrix, som om glMultMatrix blev kaldt med følgende matrix som argument:

x 2 ⁡ 1 - c + cx ⁢ y ⁡ 1 - c - z ⁢ sx ⁢ z ⁡ 1 - c + y ⁢ s 0 y ⁢ x ⁡ 1 - c + z ⁢ sy 2 ⁡ 1 - c + cy ⁢ z ⁡ 1 - c - x ⁢ s 0 x ⁢ z ⁡ 1 - c - y ⁢ sy ⁢ z ⁡ 1 - c + x ⁢ sz 2 ⁡ 1 - c + c 0 0 0 0 1

Nå tak for det!

Konklusion

Hvad der bliver tydeligt er, at der er meget snak til OpenGL. Men det fortæller ikke os hvad som helst. Hvor er kommunikationen?

Det eneste, OpenGL fortæller os i dette eksempel, er når det er gjort . Hver operation tager en vis tid. Nogle operationer tager utrolig lang tid, andre er utroligt hurtige.

Afsendelse af et toppunkt til GPU'en vil være så hurtig, at jeg ikke engang ved, hvordan jeg skal udtrykke den. At sende tusinder af hjørner fra CPU'en til GPU'en, hver eneste ramme, er sandsynligvis slet ikke noget problem.

Rydning af skærmen kan tage et millisekund eller værre (husk, du har normalt kun omkring 16 millisekunder tid til at tegne hver ramme), afhængigt af hvor stor din visning er. For at rydde det skal OpenGL tegne hver eneste pixel i den farve, du vil rydde til, det kan være millioner af pixels.

Bortset fra det kan vi stort set kun spørge OpenGL om funktionerne i vores grafikkort (maks. Opløsning, maks. Anti-aliasing, maks. Farvedybde, ...).

Men vi kan også udfylde en struktur med pixels, der hver har en bestemt farve. Hver pixel har således en værdi, og strukturen er en kæmpe "fil" fyldt med data. Vi kan indlæse det på grafikkortet (ved at oprette en teksturbuffer) og derefter indlæse en skygge , fortæl den skygge at bruge vores tekstur som input og køre nogle ekstremt tunge beregninger på vores "fil".

Derefter kan vi "gengive" resultatet af vores beregning (i form af nye farver) til en ny struktur.

Sådan kan du få GPU'en til at fungere for dig på andre måder. Jeg antager, at CUDA udfører svarende til det aspekt, men jeg har aldrig haft mulighed for at arbejde med det.

Vi berørte virkelig kun hele emnet. 3D-grafikprogrammering er et helvedesdyr.


Billedkilde


Har du noget at tilføje til forklaringen? Lyder i kommentarerne. Vil du læse flere svar fra andre teknisk kyndige Stack Exchange-brugere? Tjek den fulde diskussionstråd her .

.indgangsindhold .indgangsfod

How To RENDER With GPU, CPU Or BOTH In Blender

CPU VS GPU: How Do They Affect Video Games?

AutoCAD Rendering With CPU Or GPU

Maya: GPU And CPU Render Tests [Arnold]

V-Ray Rendering- GPU Vs. CPU

CPU Vs GPU In Blender Rendering

GPU Vs CPU Video Rendering And Video Editing

What Is A GPU And How Does It Work? - Gary Explains

CPU Vs GPU For Video Editing And Rendering

CPU VS GPU Rendering (Extensive)


Hardware - Mest populære artikler

Hvad er bashøjttalere, mellemhøjttalere og tweeter?

Hardware Jul 18, 2025

Woofers, mellemhøjttalere og diskanthøjttalere er alle typer højttalere. Ofte er alle tre typer højttalere monteret i et enkelt kabinet, men du kan også finde hver i diskrete k..


Sådan installeres (eller flyttes) apps til et andet drev på Windows 10

Hardware Jul 24, 2025

Windows 10 giver dig mulighed for at installere apps fra butikken på ethvert drev, du kan lide. Du kan også flytte apps, du tidligere har installeret, til en ny placering uden at ..


Sådan tilføjes streamingtjenester til din Sonos Player

Hardware Apr 12, 2025

UCACHED INDHOLD Da du fik din nye Sonos-afspiller, fandt du det sandsynligvis let at opsætte . Det tilbyder endda automatisk at scanne din musikmappe. Hvad du mås..


Sådan bruges Aktivitetsovervågning på Apple Watch til at spore din kondition

Hardware Dec 9, 2024

Hvis du ejer et nyt Apple Watch, bliver du muligvis stadig vant til aktivitetsmonitoren og spekulerer på, hvad det er, alle disse cirkler handler om. I dag vil vi forklare dig, hvo..


Hvordan finder du ud af, hvilken computerblæser der er højt?

Hardware Feb 5, 2025

UCACHED INDHOLD Hvad gør du, når en fan på din computer er høj nok til at være forstyrrende for din arbejdsgang, eller ødelægger det sjove, når du laver andre ting? Dagens..


Sådan gendannes utilsigtede slettede filer på din Windows-pc, tommelfinger eller SD-kort

Hardware Feb 22, 2025

UCACHED INDHOLD Hvis du ved et uheld har slettet filer fra din Windows-computer eller fra et eksternt USB-drev, hukommelseskort eller anden ekstern lagerenhed, er der en nem måde..


MightyMintyBoost er en 3-i-1 gadgetoplader

Hardware May 31, 2025

UCACHED INDHOLD Hvis du leder efter en alsidig batteriforstærker, vil denne DIY 3-i-1 sol / usb / væg nuværende oplader kendt som MightyMintyBoost let komme på din telefon, mp..


Fremskynd din Windows Vista-computer med ReadyBoost

Hardware Jan 8, 2025

UCACHED INDHOLD Windows Vista indeholder en ny funktion kaldet ReadyBoost, der giver dig mulighed for at tilslutte en flash-hukommelse eller et SD-kort for at gemme almindeligt anvendte fil..


Kategorier