Vulkan en DirectX 12: Alles over grafische api's

Sinds de nieuwe grafische api’s enige tijd geleden zijn uitgebracht, zijn er veel games verschenen die hiervan gebruikmaken. Maken ze hun beloftes waar? In dit artikel alles over grafische api’s als Vulkan en DirectX 12, plus de belangrijkste nieuwe mogelijkheden ervan.

Na een lange periode van relatieve stilstand, werden in 2015 en 2016 twee nieuwe sterk vernieuwde grafische api’s uitgebracht: DirectX 12 en vervolgens Vulkan. Deze zouden de efficiëntie sterk verbeteren en de overhead verlagen.

Een ‘application programming interface’ (api) neemt over het algemeen de communicatie tussen twee software-onderdelen voor zijn rekening. Hier gaat het specifiek over grafische api’s, die de laag tussen de software en de drivers vormen. Zonder een api zouden ontwikkelaars de drivers direct moeten aansturen, wat gezien het grote aantal drivers en videokaarten een nachtmerrie zou zijn. In plaats daarvan ‘vertaalt’ de api algemene instructies naar wat de drivers en hardware kunnen uitvoeren.

Api’s zijn net zoals programmeertalen ruwweg te onderscheiden in twee groepen: ‘low-level’ en ‘high-level’. Geen van de twee is vanzelfsprekend superieur, want beide hebben hun voordelen en nadelen. Hoe hoger de api, des te meer ‘abstractie’ wordt toegepast. Dit houdt in dat de functies van de api niet direct passen op de functionaliteit van de onderliggende hardware. Het resultaat hiervan is dat de api meer van het werk doet, en het eenvoudiger is voor de ontwikkelaar om code te schrijven. Aan de andere kant leidt het wel tot meer overhead.

DirectX 12

In 2014 kondigde Microsoft plotseling een nieuwe api aan, die het jaar daarop uitkwam als DirectX 12. In navolging van destijds Mantle (deen api van AMD) kon deze low-level api beter omgaan met multicore-processors en was de overhead verminderd. Door deze verbeteringen is het aantal draw calls dat de processor kan sturen ruim tien keer zoveel. Dit betekent niet automatisch betere prestaties, maar hierdoor wordt het negatieve effect van een relatief langzame processor wel kleiner.

Naast de betere efficiëntie biedt DirectX 12 natuurlijk ook veel nieuwe mogelijkheden. Deze moeten wel ondersteund worden door de videokaart, en dit wordt uitgedrukt in twee verschillende termen: ‘feature levels’ en ‘resource binding tiers’.

Feature level geeft aan welk deel van DirectX 12 wordt ondersteund, waarbij 12_1 betekent dat de kaart volledige ondersteuning biedt. Let op: dit is niet hetzelfde als het versienummer, en kan onderscheiden worden door de underscore die aanwezig is in de feature level. Sommige oudere kaarten hebben wat beperkte DirectX 12 ondersteuning, bijvoorbeeld feature level 11_1. Deze kaarten kunnen wel DirectX 12 games uitvoeren, maar ondersteunen niet alle mogelijkheden.

Resource binding tiers gaan over beperkingen op het aantal verschillende taken dat de gpu (theoretisch) tegelijkertijd kan uitvoeren. Het maximum is drie, wat betekent dat er praktisch geen beperkingen zijn op dat vlak.

DirectX 12

© PXimport

Een van de interessantste features van DirectX 12 is Explicit Multi-Adapter, ook wel Explicit Multi-GPU genoemd. Dit stelt de eindgebruiker in staat om twee willekeurige videokaarten te combineren. Hiermee is het zelfs mogelijk om de rekenkracht van de geïntegreerde gpu van de processor te benutten!

Dit wordt mogelijk gemaakt doordat deze feature anders werkt dan traditionele multi-gpu-toepassingen. Bij SLI en CrossFire is elke kaart verantwoordelijk voor een ander frame. Dit betekent dat dezelfde kaart gebruikt moet worden, want verschillen in snelheid zouden leiden tot het vervelende fenomeen van ‘microstuttering’. Explicit Multi-Adapter werkt daarentegen met ‘split frame rendering’, waarbij elke kaart verantwoordelijk is voor een ander deel van hetzelfde frame. Dit voorkomt microstuttering, maar betekent wel dat game-ontwikkelaars meer werk moeten verrichten om het goed te laten werken. Bij SLI en CrossFire nemen drivers het grootste deel van dit werk voor hun rekening (wat impliciete aansturing wordt genoemd).

Helaas zijn er maar weinig enthousiastelingen die meerdere videokaarten hebben. Het is daarom vaak niet de moeite waard voor ontwikkelaars om hier moeite voor te doen. Als gevolg hiervan zijn er niet veel voorbeelden van goede ondersteuning voor Explicit Multi-Adapter.

Vulkan

Vulkan werd begin 2016 op de markt gebracht door het consortium Khronos, dat sinds 2006 verantwoordelijk is geweest voor de ontwikkeling van OpenGL. Officieel bestempelt Khronos Vulkan niet als de opvolger van OpenGL, maar ondanks de nieuwe mythologische naam is dit in de praktijk wel zo. De veranderingen zijn op veel vlakken vergelijkbaar met DirectX 12. Het is een ‘low-level’ api dat ernaar streeft multithreading beter te ondersteunen en overhead te minimaliseren. Daarnaast biedt Vulkan nog twee belangrijke voordelen ten opzichte van DirectX 12: Vulkan is open source en platformonafhankelijk, waar DirectX 12 alleen wordt ondersteund door Windows 10 en Xbox.

Het wordt hiermee veel eenvoudiger om games te ‘porten’ van het ene platform naar het andere. Desondanks is Vulkan in het begin vooral gebruikt om DirectX games geschikt te maken voor bijvoorbeeld Linux. Hier begint wel langzaam maar zeker verandering in te komen: enkele maanden geleden kondigde Khronos trots aan dat er meer aangekondigde games waren voor Vulkan dan voor DirectX 12.

In maart van dit jaar is Vulkan 1.1 uitgebracht, waarin de api is verbeterd en er nieuwe features zijn toegevoegd, waaronder Explicit Multi-GPU. In een game die hier ondersteuning voor biedt, zal het daarom ook met Vulkan mogelijk zijn om twee totaal verschillende gpu’s te gebruiken.

DirectX 12

© PXimport

Het meest opvallende verschil tussen de twee api’s is het ondersteunde platform: DirectX 12 werkt alleen op Windows 10 en Xbox, terwijl Vulkan in theorie op elk systeem zou moeten werken. Voor ontwikkelaars zijn er nog andere verschillen: Microsoft levert bijvoorbeeld veel meer ondersteuning en software dan Khronos.

Het is moeilijk om algemene uitspraken te doen over de effecten die de api’s hebben op de prestaties, omdat heel veel afhangt van het specifieke spel en de kwaliteit van de implementatie. Niettemin is duidelijk dat, om welke reden dan ook, AMD over het algemeen meer profiteert van het gebruik van DirectX 12 dan Nvidia (in vergelijking met DirectX 11). Ook boeken nieuwere videokaarten meer winst dan oudere modellen, die soms achteruitgang laten zien. Dit geldt ook voor Vulkan, vergeleken met OpenGL.

Het is vooralsnog niet mogelijk om een inschatting te maken van hoe de prestaties verschillen tussen deze twee api’s, omdat er heel weinig games zijn die zowel DirectX 12 als Vulkan ondersteunen in Windows. Zelfs sommige games die officieel beide api’s ondersteunen, doen dat op verschillende besturingssystemen – DirectX wordt gebruikt voor Windows, en Vulkan voor Linux en MacOS. Omdat de prestaties ook worden beïnvloed door het besturingssysteem, is het dan onmogelijk om het effect van de api’s te isoleren.

De toekomst

Veel ontwikkelaars blijven voorlopig werken met de oudere api’s. Dit komt doordat er een aantal drempels is voor daadwerkelijk gebruik van DirectX 12 en Vulkan. Allereerst is er vanwege de verregaande veranderingen en vernieuwingen beperkte documentatie, kennis en ervaring. Dit geldt voor beide api’s, maar met name voor Vulkan, omdat dit niet alleen een nieuwe versie is, maar ook een compleet nieuwe api voor ontwikkelaars die meestal alleen bekend zijn met DirectX.

Een ander probleem is dat oudere videokaarten niet of minder goed werken met de nieuwe api’s. Ontwikkelaars staan daarom voor de keuze om zowel een nieuwe als een oude api te ondersteunen (wat veel extra tijd kost), of om bij een oude api te blijven. Naarmate het aandeel van oudere videokaarten krimpt, zal dit steeds minder een probleem zijn.

Daarbij komt dat het voor daadwerkelijke prestatieverbetering niet voldoende is om bestaande code te ‘porten’ naar een nieuwe api. Goede optimalisatie en goed gebruik van de mogelijkheden is cruciaal. Dit kost ook weer extra tijd, en bij veel spellen is optimalisatie bij tijdgebrek het kind van de rekening.

Zijn DirectX 12 en Vulkan dan echt revolutionair? In technische zin wel. Hun ‘low-level’ aard is een breuk met OpenGL en DirectX zoals deze vanaf het begin hebben bestaan. Er zijn bijzonder interessante mogelijkheden zoals Explicit Multi-Adapter. In de praktijk zijn de gevolgen nog niet wereldschokkend geweest. Veel games blijven nog bij de oude api’s, en grote prestatieverbeteringen zijn zeldzaam.

Dit neemt niet weg dat de nieuwe api’s veel potentieel hebben. Met enig optimisme kunnen we wel zeggen dat de nieuwe features ontwikkelaars in staat stellen om op termijn de efficiëntie van games sterk te verbeteren, naarmate bekendheid met de api’s groeit.

Tekst: Farzin Parham

Deel dit artikel
Voeg toe aan favorieten