Variable Rate Shading i spel som saknar inbyggt stöd
För en tid sedan fick D3D12 stöd för variable rate shading (VRS), en teknik som möjliggör att olika delar av bilden kan beräknas med olika kvalitetsgrader. För mer information rekommenderar jag er att läsa Sweclockers artikel.
Jag har utökat Triangelplockaren med funktionalitet att applicera samt visualisera bildbaserad (image-based) VRS i befintliga spel. Den färdigrenderade frame-bilden analyseras och resultatet används därefter för att påverka hur VRS-inställningarna ska vara nästkommande frame. Utfallet av analysen är en bild som indikerar huruvida området ska få VRS 1X1, 2X2 (mörkgult i filmklippen) eller 4X4 (ljusgult i filmklippen). För att få ökad prestanda måste analyssteget gå relativt fort, annars riskerar den eventuella prestandavisten att utebli.
Så här långt har två testprogramvaror använts, Tom Clancy's The Division och Battlefield V. Ingen av dem har inbyggt stöd för bildbaserad VRS. Prestandavinsten kan variera rejält beroende på hur speltillverkaren valt att rendera. Exempelvis är det mindre fördelaktigt om compute-pipelinen används för de tyngre ljus-beräkningarna, då VRS-effekten endast påverkar renderings-pipelinen.
Ta gärna en titt på filmklippen nedan (efter att Youtube färdigbehandlat dem till 4k-upplösning), de visar hur VRS kan användas för att relativt enkelt öka prestandan i befintliga spel som inte har inbyggt stöd för VRS. Spelen renderades alltid med upplösningen 3840x2160. De tröskelvärden som redovisas säger egentligen inte så mycket för er utan används internt i analyssteget, högre värde innebär högre acceptans och därmed ökad sannolikhet att grafikfel uppstår.
Tom Clancy's The Division
Nedan finner ni ett antal filmklipp från spelets benchmark samt ett klipp som visar starten av speldemot. Prestandaresultaten i filmklippen är inte desamma som fås då filminspelning är inaktivt. Därför redovisas även benchmark-resultat för respektive testfall då videoinspelning inte utförs.
Summering av prestandaresultaten
Utan VRS: avg FPS: 56,3 - typical FPS: 57,0
Med "VRS-låg": avg FPS: 61,1 - typical FPS: 61,4 - ~8-9% högre än utan VRS
Med "VRS-hög": avg FPS: 66,3 - typical FPS: 66,7 - ~17-18% högre än utan VRS
Med "VRS-kass-överallt": avg FPS: 76,4 - typical FPS: 76,8 - ~35-36% högre än utan VRS
Benchmark, VRS inaktiverat (referens)
Resultat utan videoinspelning: avg FPS: 56,3 - typical FPS: 57,0
Benchmark, VRS aktiverat med gränsvärde 3 för 4X4 och 16 för 2X2 (svårt att se några grafikfel)
Resultat utan videoinspelning: avg FPS: 61,1 - typical FPS: 61,4 - ~8-9% högre än utan VRS
VRS-visualisering:
Benchmark, VRS aktiverat med gränsvärde 8 för 4X4 och 25 för 2X2 (tydliga grafikfel uppstår)
Resultat utan videoinspelning: avg FPS: 66,3 - typical FPS: 66,7 - ~17-18% högre än utan VRS
VRS-visualisering:
Benchmark, VRS med 4X4 över hela skärmen (fel överallt, visar maximal VRS-effekt)
Resultat utan videoinspelning: avg FPS: 76,4 - typical FPS: 76,8 - ~35-36% högre än utan VRS
Gameplay, slår av och på VRS/VRS-visualisering vid flera tillfällen. Notera FPS-skillnaderna!
Battlefield V
Gameplay, slår av och på VRS/VRS-visualisering vid flera tillfällen.
Det finns kanske inte så mycket att diskutera kring detta, men förhoppningsvis kan det leda till att fler hobby- och proffsutvecklare anammar tekniken. Mitt mål är att arbeta vidare något med analyslogiken och landa någonstans där prestandanvinsten blir runt 10-15% utan att större grafikfel uppstår.
Kika gärna på fler videoklipp längre ner i tråden: Mortal Kombat 11, Metro Exodus och FIFA 18.
Lärare i spelutveckling (BTH) som tycker om att tugga trianglar