Nieuwe technologie Microsoft maakt in-game compileren van shaders overbodig

Microsoft maakt de sdk AgilitySDK 1.618 voor Advanced Shader Delivery beschikbaar voor ontwikkelaars. Deze DirectX 12-technologie maakt het in-game compileren van shaders overbodig door de shaders reeds gecompileerd af te leveren tijdens de installatie van een game.

De nieuwe technologie is vanaf 16 oktober eerst alleen beschikbaar voor bepaalde games voor de ROG Xbox Ally-handhelds die via de Xbox-app gedownload zijn, zo liet Microsoft eerder al weten. Met de release van versie 1.618 is de technologie via DirectX-api's echter ook beschikbaar voor derden, al duurt het waarschijnlijk nog lang voordat gamers hier iets van gaan merken.

Microsoft is voor Advanced Shader Delivery afhankelijk van vrijwel alle betrokkenen in het proces van gameontwikkeling en -distributie. Gameontwikkelaars en enginemakers moeten bijvoorbeeld tijdens het ontwikkelproces een 'state object database' opstellen op basis van een gestandaardiseerd format. Dit is nodig om de shaders vooraf te kunnen compileren zonder het voor alle mogelijke hardware te hoeven herhalen. Daarnaast werkte Microsoft samen met Intel, Nvidia, AMD en Qualcomm; deze bedrijven moeten de offline gecompileerde shaders via een plugin voor hun respectievelijke hardware aanleveren om dat proces makkelijker te maken.

Advanced Shader Delivery
SODB staat voor state object database. PSDB staat voor precompiled shader database. Bron: Microsoft

Uiteindelijk moeten de tools door leveranciers van installers worden geïmplementeerd in het installatieproces. Uitgevers met een eigen launcher of derden zoals Steam kunnen de api gebruiken om de benodigde vooraf gecompileerde shaders aan te leveren tijdens de installatie van een ondersteunde game.

Tech tegen hapering door in-game shaders compileren

Het idee achter de technologie is dat platforms toegang hebben tot een grote database van reeds gecompileerde shaders. Bij de installatie van een game worden de juiste shaders voor de gebruikte hardware aangeleverd, waardoor het systeem deze niet meer hoeft te compileren tijdens het draaien van de game. Het compileren van shaders is een cpu-taak die veel rekenkracht kost. Dit kan voor langere laadtijden, wachtschermen en in-game haperingen zorgen. Met de technologie wist Microsoft naar eigen zeggen de opstarttijd van Avowed met tot 85 procent te verlagen.

Shaders zijn gpu-programma's die bepalen hoe de gpu visuele aspecten van een game moet renderen. Er zijn shaders voor verschillende stappen in de renderpipeline. Een shader wordt gecompileerd om voor een specifieke game op de relevante hardware uitgevoerd te kunnen worden. De database van Microsoft moet dan ook talloze hardwareconfiguraties ondersteunen.

De technologie van Microsoft is overigens in principe niet nieuw. Consolegames maken al gebruik van vooraf gecompileerde shaders. Dat is op specifieke consoles vrij eenvoudig te realiseren, want de relevante hardware van bijvoorbeeld iedere Xbox Series X, PlayStation 5 Pro of Nintendo Switch 2 is identiek. Voor pc-games loopt de hardware enorm uiteen. De technologie van Microsoft moet vooraf gecompileerde shaders mogelijk maken voor uiteenlopende pc's.

hoe werkt een videokaart gpu hero

Door Yannick Spinner

Redacteur

26-09-2025 • 16:23

46

Reacties (46)

Sorteer op:

Weergave:

Ik weet niet of dit nu iets van 'recent' is, maar kom steeds meer games tegen waar je bij opstarten (zeker eerste keer) weer x tijd zit te wachten 'compiling shaders', dat ik denk... kunnen ze dat niet gewoon compiled aanleveren? Nouja, daar is dit dus voor :P
Ik ken er ook niet alles van maar bijvoorbeeld shaders voor Vulkan (backend die tegenwoordig zeker bij triple A games wordt gebruikt) moeten gecompiled worden afhankelijk van de mogelijkheden die je device hebben. Deze compiled versie (SPIR-V) wordt vervolgens door de game zelf gebruikt tijdens het draaien.

Meeste games doen dit dus één keer per installatie en cachen het vervolgens ergens denk ik op schijf. Tot je nieuwe drivers/nieuwe device of iets dergelijks installeert. Dan moet het opnieuw.

De echte 3D guru's mogen me gerust corrigeren :).
Dit klopt helemaal.

Wat ook meespeelt is dat if-statements in shaders inefficiënt zijn, dus een optimalisatie die wordt toegepast om conditionele shaders te maken is voor elke conditie een aparte shader te compileren en deze efiiciëntere shaders te gebruiken wanneer het van toepassing is. Dit zorgt ervoor dat shader compilatie langer duurt en de shader cache meer ruimte inneemt.

[Reactie gewijzigd door ghangster op 26 september 2025 17:33]

Ow dat wist ik niet, verklaart wel waarom er soms zoveel shaders in een game zitten. Is dit vergelijkbaar met waarom de CPU if's ook niet fijn vind en het dus de branche predictor in de war stuurt? Of zit er meer achter op de GPU?
Ten eerste, een GPU heeft lang niet zo'n sophisticated branch predictor als dat een CPU heeft. GPU's zijn ontworpen rondom een groot aantal relatief simpele compute units.

Ten tweede, een shader programma draait niet één keer, maar in een hele groep aan parallelle instanties. Dat gaat het meest efficiënt als alle instanties binnen een compute unit (een wave) exact hetzelfde programma uitvoeren, en daarbij dezelfde branches volgen. Anders krijg je dat de instanties op elkaar moeten gaan wachten en verschillende data uit geheugen gaan halen. Het is dus handig als je van tevoren al kunt bepalen welke exacte variant van een programma je uit gaat voeren, voordat je de instructie naar de GPU stuurt.
Wat ik me dan afvraag alleen: Moet hij elke keer opnieuw gecompiled worden. Kan hij dat niet één keer doen zolang er geen hardware veranderd is?
Op dit moment gebeurt dit elke keer wanneer je een GPU driver update installeert.
Jedi: Fallen Order en Jedi: Survivor. Compileren altijd shaders bij opstart.

Misschien omdat het PC versies zijn van console games waarbij optimalisatie voor PC prioriteit #877 was?
Bij de spellen waarbij dat het geval is, is dat wat mij betreft echt een non-issue waarbij de oplossing simpelweg te complex is. Die paar keer dat je een spel speelt en er nieuwe GPU drivers zijn is wel te overzien. Maar wat @E!Ma0RB7 schreef, ik ben inderdaad ook spellen tegengekomen waarbij elke keer opnieuw shaders gecompileerd worden (iig Jedi Fallen Order, en misschien nog een andere).
Inderdaad. Borderlands 4, elke keer bij opstarten. The last of us had ook nog een issue met compileren van shaders in het begin. En zo zijn er nog wel een paar titels te noemen.
Ik weet niet of dit nu iets van 'recent' is, maar kom steeds meer games tegen waar je bij opstarten (zeker eerste keer) weer x tijd zit te wachten 'compiling shaders'
En da's alleen maar goed om te zien, want voorheen (UE4 tijdperk) was dit nauwelijks onder de aandacht bij developers. Geen shader precompilation step betekent meestal dat je te maken krijgt met shader compilation stutters tijdens het spelen. Of een deel van de shaders moeten tijdens loading zones en/of het spelen van cutscenes compilen, maar die aanpak wordt nauwelijks gehanteerd.

Maar nog veel belangrijker: zelfs met zo'n shader precompilation step worden shaders vrijwel altijd gemist door developers, waardoor je alsnog te maken krijgt met haperingen, zoals in Silent Hill F en Borderlands 4. Er zijn maar weinig studio's die echt een stutter-free ervaring kunnen aanleveren, al helemaal als ze UE4/UE5 gebruiken.

Hulde dat Microsoft hier het voortouw in neemt nu. Hopelijk is het een goede oplossing.
Voortouw ? Mja. Steamdeck heeft zo`n soortgelijke systeem al op dag 1, en dat was anno 2022.
MS loopt zoals gewoonlijk weer eens achter.
Uh, ja... en de Steam Deck is een apparaat. Die specifieke oplossing van Valve gaat de honderden miljoenen Windows gamers wereldwijd niet helpen, ben ik bang.
Steam doet het bij mij ook op Ubuntu. Geen idee of het ook op Windows gebeurt, maar als ze die shader cache toch al hebben, zie ik niet waarom Steam het niet doet.

Toch leuk dat Microsoft de feature van Steam heeft overgenomen, dat gaat een hoop mensen een hoop tijd schelen.
Appels met peren. Dit is een uniforme oplossing voor alle hardware combinaties, dus daar gaat heel wat meer tijd en moeite in zitten dan als je het slechts voor één hardware profiel (Steam Deck) hoeft te doen.
Ik kan me nog herinneren dat Battlefield 2 na elke wijziging van je graphics settings shaders opnieuw moest compileren. En dat is een spel uit 2005, dus dit is wel van alle tijden denk ik.
Dit komt omdat de instructieset van de GPU niet gestandaleseerd is zoals bij de CPUs. GPU-makers kunnen nieuwe instruties introduceren (en ook instruties verwijderen) in nieuwe generatie GPUs en de GPUs van verschillende vendors hebben ook een ander instructieset. Je kan daarom niet alle shaders van tevoren compileren, dit kan wel bij consoles omdat de GPU daar niet veranderd. Zoals andere al hebben gezegd wordt daarom de shader gecompileerd naar een tussenrepresentatie en deze tussenrepresentatie wordt dan later door de driver gecompileerd voor de GPU die in je computer zit. Dit heeft echter een nadeel, de compiler in de driver kan bugs bevatten en wordt nu en dan geupdate. Daarom moet je soms na het updaten van je driver opnieuw shaders compileren. Ook kunnen spellen bij een update hun shaders veranderen, dan moeten de shaders ook weer gecompileerd worden.

Om te voorkomen dat shaders opnieuwe gecompileerd worden bij elke start van een spel heeft je driver een cache. Spellen weten trouwens niet of hun shader wel of niet in de cache zit. Daarom laten de meeste spellen elke keer bij het opstarten de shaders compileren. Wel gaat het sneller omdat de driver gewoon de shder uit de cache haalt, soms merk je het niet eens maar soms zie je nog steeds 'compiling shaders' staan maar gaat het veel sneller naar de eerste keer.
Hangt ook wel af van de game. Bij MMO's heb je vaak te maken met updates/patches, ik denk ook niet dat dit daarbij gaat helpen.

Bij Steam is er trouwens wel een optie om shaders compilen op de achtergrond te doen. Zelf heb ik die uitstaan vanwege geen supersnelle PC.
...Is dit vaak een probleem? Zo ver ik weet wordt dit aan het begin gedaan als je het spel opstart, dus het enige wat hiermee veranderd is dat je 30 seconden wint.

Ik zeg geen nee tegen verbeteringen, maar ik vraag me af of het de moeite waard is.
Niet helemaal waar. Sommige games/engines kiezen ervoor om schaders bij het opstarten van de game te genereren. Maar dat is geen gegeven. Als je dit niet implementeert dan zal de schader de eerste keer dat het nodig is, compileren en dat kan dus midden in een game zijn waar je een scène voor het eerst bezoekt of afspeelt.

Die coole unieke epic skin die je hebt vrijgespeeld is een voorbeeld. Pixel-schader die nodig is. Als je dat van te voren niet genereert en opslaat, dan maakt en laad de driver die pas in wanneer voor het (eerst) nodig.
Sommige games lijken er een handje van te hebben om het vaker te doen. Enshrouded is er bijvoorbeeld één die bij bijna elke update opnieuw gaat compileren. Nu valt dat op mijn game PC nog wel mee hoelang het duurt, maar op de PC van m'n vrouw kan het zo een 10+ minuten duren met een 8600G.

En bij multiplayer games is het vaak nog geen 30 seconden, maar singleplayer games willen nog wel eens veel langer de tijd nemen, een ander die ik zo weet is The Last of Us.
In principe is dat alleen het geval bij een eerste boot van de game inderdaad. Maar zodra er nieuwe hardware is, of wanneer er een vernieuwde driver- of gameversie geïnstalleerd is, kan het dat de shaders opnieuw gecompileerd moeten worden
Naast wat anderen al zeggen, bij het installeren van een nieuwe graphics driver ben je je cache ook kwijt.
Shader pre-compilation is een tijdrovend process om te implementeren en testen, en ook erg vatbaar voor fouten. Er zijn bijv. zat games die uitkomen met pre-compilation, maar dan alsnog een hele hoop shader permutaties missen.

Dit systeem-breed aanpakken met een API/tool/whatever is uiteindelijk beter voor zowel de ontwikkelaars, als de eindgebruiker.
Ja dit is een probleem vooral bij de Unreal 5 engine. Deze engine wordt steeds meer gebruikt.

Silent Hill
Shader compilen is echt geen 30 seconden werk, nieteens als je de beste CPU hebt (9800X3D)
Veel moderne UE5 games hebben makkelijk zo`n 30K shaders die gedaan moeten worden.

Je denkt w.s. aan Shader Verification, dat is iets anders. En dat duurt doorgaans wel zo`n 10 seconden op een moderne systeem.

Shader compilen doe je ook nog eens telkens als :
1. De ontwikkelaar een update uitgebracht heeft waar meer shaders in verwerkt zitten.
2. Je een driver update doet van je GPU.
Op zich juich ik dit als systeem. Waar ik me wel zorgen over maak is dat ontwikkelaars dan shader pre-compile helemaal uit hun code halen. Als zo'n systeem dan een keer uit de lucht gaat, of je hardware wordt niet meer ondersteund dan is je spel daarna één stotterbende.
Het diagram laat zien dat er altijd teruggevallen moet kunnen worden op lokale shader compilatie.
Compiling shaders. Elke keer als ik Borderlands 4 opstart. Gek word ik er van!

Duurt niet heel lang, maar toch.
Het compileren van shaders is een cpu-taak die veel rekenkracht kost. Dit kan voor langere laadtijden, wachtschermen en in-game haperingen zorgen. Met de technologie wist Microsoft naar eigen zeggen de opstarttijd van Avowed met tot 85 procent te verlagen.
leuk dat de opstart tijd verlaagt is, maar zijn de shader stutters ook weg? die zijn toch voor de meeste games, meer storend
Als de game aan precompilatie doet zijn PSO stutters over het algemeen minimaal.
Maar of het probleem hiermee helemaal opgelost is- nee. Indie games gaan dit nog steeds niet doen, en ontwikkelaars zullen nog steeds variaties gaan missen.
Dat is inderdaad het belangrijkste... In principe zou een game die de shaders bij het opstarten compileert er geen last meer van moeten hebben, maar soms gaat dat om een of andere reden niet goed. Borderlands 4 bijvoorbeeld had ik ondanks dat hij bij het opstarten het al doet toch nog shader compilation stutters bij en ook Digital Foundry melde datzelfde probleem, maar na een windows reinstall had ik dat probleem ineens niet meer. In principe zou het niet uit moeten maken natuurlijk of de shaders bij het opstarten gecompileerd worden of als pakketje gedownload worden, zolang alles er maar is en er niet alsnog tijdens spelen ineens dingen gecompileerd moeten worden.

Wat betreft het opstarten en de tijd die het kost, dat hangt heel erg af van je hardware. Ik heb nu net geupgrade naar een 9800X3D en die vliegt er (in ieder geval bij Borderlands 4) echt zo hard doorheen dat het me totaal niet boeit. Op de Steam Deck heb ik echter wel eens irritant lang moeten zitten wachten (de CPU van de SD is relatief zwak). En in principe heeft de Steam Deck al shader pre-caching, wat ze ook kunnen doen omdat het net als een console fixed hardware is... maar soms lijkt een game dat niet te snappen of zo. Ik meen dat het Borderlands 3 was waar ik best wel lang zat te wachten.
Is dit hetzelfde als de vulkan shaders die gemaakt worden voor je een game in Bazzite/steamOS?
die precompile trend is wel funest voor shader stitching (en daarbij zaken zoals size coding)... tenzij je dat allicht weer op bytecode niveau kunt doen maar dat lijkt me ook weer niet de bedoeling :P

aan de andere kant heb je tijdwinst, geen compilatie complicaties bij gamers met outdated drivers, en minder makkelijke shader tampering/injection... zoals reshade enzo. daar zullen game dev wel blij mee zijn.

[Reactie gewijzigd door maali op 26 september 2025 16:58]

Ik heb hier nul verstand van, maar wel (negatieve) ervaring als gebruiker en dus wil ik het snappen.

Het verbaas(t/de) me dat shaders steeds weer opnieuw gecompileerd moeten worden. Waarom w(e/o)rd(t) dit gedaan? Bij nieuwe drivers, gewijzigde settings of andere veranderde factoren kan ik me het opnieuw compileren wel voorstellen. Maar bij meerdere games gebeurt het inderdaad elke keer. Ook zonder duidelijke wijzigingen.

Waarom gebeurt dit?
Als er niets verandert, lijkt me dat de game de gecompileerde shaders moet kunnen cachen. Als dat niet gebeurt, lijkt me dat luiheid van de developers (of een of andere moeilijkheid in de engine of het framework dat ze gebruiken).
Over het algemeen cachen games hun shaders naar mijn weten. Steam downloadt ze voor me en ook van bijvoorbeeld emulators zijn shaders caches te downloaden.

Ik heb nog nooit een recompile gezien na het wijzigen van de in-game settings, alleen bij driver/game/firmware-updates. Ik zie ook niet in waarom dat zou gebeuren.

Als het elke keer gebeurt denk ik dat die games hun shaders niet cachen of dat ze die cachen op een plek waar ze niet naartoe mogen schrijven. Je zou voor de gein eens kunnen proberen zo'n game als administrator te draaien om te zien of hij zijn shaders dan wel kan cachen, als dat werkt zou herinstalleren naar een andere map dan Program Files al een stuk helpen.
Mr Torch gaat eens opzoeken wat men bedoeld met shaders, want als niet gamer snap ik helemaal niks van dit verhaal.
Shaders zijn kleine programma's zeg maar die niet op je CPU uitgevoerd worden maar op de GPU. Deze voeren berekeningen uit per vertex (triangle punten), per pixel op je scherm zodat er uiteindelijk wat te tonen valt door de GPU op je scherm. De GPU is op zich trager dan een CPU maar kan veel meer van deze programma's tegelijk draaien waardoor het uiteindelijk in parallel sneller gaat.

Deze shaders moeten echter zoals alle software gecompiled worden vooraleer ze klaar zijn voor gebruiken. En dat vraagt dus wat tijd die op voorhand voor je daadwerkelijk speelt meestal wordt uitgevoerd om geen micro stutters tijdens de gameplay op te leveren.

Moest je wat dieper willen gaan: https://en.wikipedia.org/wiki/Shader.

Vroeger (jaren 90) had je dit niet omdat er toen een beperkte set aan functies was die de graphics cards vendors via hun drivers aanboden. Je zat dus vast aan wat zij voor je beschikbaar stelden + ook in de volgorde die de driver bepaalde. Sinds de introductie van shaders (programmable pipeline) kun je als game developers dus veel meer invloed uitoefenen in wat er gebeurd en in welke volgorde (voor optimalisatie) via shaders. Je codeert dus zelf wat de GPU moet doen zeg maar.

[Reactie gewijzigd door Powerblast op 26 september 2025 17:25]

Soms worden de gecompileerde sharders wel meer dan een gig en sommige spellen slaan dat ook leuk op in je documenten map die gesynced wordt met OneDrive |:(

Ik kijk naar jou Victoria 3

Dus als dit in het vervolg in de installatie map komt, ben ik alleen maar bij.


Om te kunnen reageren moet je ingelogd zijn