grafik - Hvorfor fungerer Direct3D kun på Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Hvad er Direct3D? Det er en API, er det ikke? Er det implementeret af Windows eller med grafikkort?


Hvis grafikkortene implementerer Direct3D API, hvorfor kan ikke andre operativsystemer bruge Direct3D-ressourcer fra grafikkortet?


Hvis Direct3D implementeres af Windows, skal den bruge grafikkortressourcer, som OpenGL eller OpenCL. Hvis Direct3D-opkald ikke er direkte til grafikkortet, ville det være langsommere på grund af mellemkald.


Vær venlig at hjælpe mig med at forstå, hvad Direct3D er.

Bedste reference



  Hvad er Direct3D? Det er en API, er
  ikke det? Er det implementeret af Windows
  eller med grafikkort?



Ja, Direct3D er en API. Det implementeres (for det meste) af Windows selv. Men Windows vil offload en stor del af det egentlige arbejde til grafikkortets drivere og i sidste ende til selve gfx-kortet, så man kan også sige, at et gfx-kort 'implementerer' D3D.



  Hvis grafikkortene implementerer
  Direct3D API, hvorfor kan ikke andre
  operativsystemer bruger Direct3D
  ressourcer fra grafikkortet?



De kan og de gør det, men kun en relativt lille (men ofte kritisk del) af D3D-funktionaliteten implementeres direkte af kortets hardware, så der kræves meget mere arbejde i software til implementering af D3D.



  Hvis Direct3D implementeres af Windows,
  det skal bruge grafikkort ressourcer,
  såsom OpenGL eller OpenCL.



Nej, det er en misforståelse. OpenGL og OpenCL er også API'er, og kun delvist implementeret af gfx-hardware (ligesom D3D). Gfx-hardware har normalt en (proprietær) 'native' API, hvilket er hvad gfx-driverne (begge for D3D og OpenGL) brug.



  Hvis Direct3D-opkald ikke er direkte til
  grafikkortet, det ville være langsommere
  på grund af mellemkald.



Der er ikke nødvendigvis nogen 'mellemliggende opkald' - D3D-driveren bruger kortene native API, som forklaret ovenfor.

Andre referencer 1


Direct 3D er en grafik API, der er oprettet af Microsoft. Det ligner funktionen til åbenhed. OpenGL er et konkurrerende 3D grafik API, der er oprettet som en åben standard. D3D behøver ikke, at OpenGL skal fungere.


Kortfabrikanter bestemmer hvilke API'er de vil implementere; mest altid inkluderer DirectX (som inkluderer Direct3D) og muligvis OpenGL.


Der er indirection, da det ikke går direkte til kortet, kortene D3D kalder i sin tur driverne, men det er typisk ubetydeligt.

Andre referencer 2


Direct3D er en API udviklet af Microsoft designet til at hjælpe udviklere med at gøre 3D grafik. OpenGL og Direct3D er to separate API'er, men de skal både interface til videokortet ved hjælp af drivere udviklet af de virksomheder, der fremstiller videokortene. Begge API'er (Direct3D og OpenGL) skal begge gå gennem driveren for at få adgang til videokortet, og deres hastigheder er afhængige af deres design og deres implementering i grafikkortdrivere.


OpenCL er noget andet - det er designet til at hjælpe udviklere med at skrive programmer, der udfører generelle computere på GPU'en (ikke kun for grafik). OpenCL kan sammenlignes med CUDA, men sidstnævnte er kun understøttet af NVIDIA-kort. Brug CUDA i stedet af OpenCL kan have nogle fordele, afhængigt af dit mål system, da NVIDIA kan stille nye funktioner til rådighed for CUDA API før de accepteres i OpenCL API. Men selv OpenCL og CUDA skal interface til føreren for at få noget gjort på GPU'en.


Som du allerede ved, fungerer Direct3D kun på Microsoft og på Wine (for det meste), men dets struktur som API er meget anderledes end OpenGL. Direct3D bruger strukturer og indeholder flere OOP-elementer i API'en, mens OpenGL fungerer som en statsautomat, der mangler strukturer eller OOP-funktioner. Direct3D kan ofte gå lidt hurtigere end OpenGL med hensyn til de funktioner, som den hævder at officielt støtte i API'en, fordi den ikke er designet til maksimal kompatibilitet med en bred vifte af enheder; På den anden side har OpenGL typisk udvist mere inerti, når det er kommet til at vedtage nye funktioner på grund af det iboende problem med at tilføje nye funktioner til dets API (Khronos-koncernen er stærkt påvirket af CAD-industrien såvel som mange andre, så det skal imødekomme en bred vifte af behov). Den tid, det tog for Khronos-gruppen til endelig at vedtage asynkrone API-opkald i OpenGL, er testamente for denne kendsgerning, og fik mange mennesker til at miste troen på OpenGL.


OpenGL er imidlertid crossplattform, godkendt af Apple, og det virker på alle operativsystemer, som det implementeres på. Du kan nemt bruge det med mange populære vinduesværktøjer (Qt, SDL, FreeGLUT, JogAmp, gtk osv.) Og har tillid til, at din applikation vil kompilere på andre operativsystemer, hvis du skrev det korrekt. OpenGL API, i modsætning til Direct3D, er en open source industristandard.


Hvad præstationen angår, er det stadig diskutabelt, hvem der er hurtigere: afhængigt af hvordan du strukturerer dit program eller batch dine opkald, kan det ændre sig. Det skal dog ikke være en overvejelse, hvilken API du bruger, medmindre du har testet din ansøgning og har bevis for, at valget af API er årsagen til din flaskehals.

Andre referencer 3


Fra Wikipedia: [1]



  Direct3D er et Microsoft DirectX API
  delsystem komponent. Formålet med
  Direct3D er at abstrakte
  kommunikation mellem en grafik
  applikation og grafik hardware
  chauffører. Det er præsenteret som en tynd
  abstrakt lag på et niveau, der er sammenligneligt
  til GDI (se vedhæftet diagram).
  Direct3D indeholder mange funktioner
  at GDI mangler.

  
  Direct3D er en øjeblikkelig mode grafik
  API. Det giver en grænseflade på lavt niveau
  til alle 3D-funktioner i 3D-kort
  (transformationer, klipning, belysning,
  materialer, teksturer, dybdebuffering
  og så videre). Det havde også et højere niveau
  Retained mode komponent, der har nu
  blevet officielt afbrudt.