DirectX 12 D3D12 får ny funktion som ger mer kontroll över minnesallokering till antingen GPU eller CPU dynamiskt
I den kommande stora uppdateringen av Windows 10 OS kommer DirectX12 och närmare bestämt Direct3D (D3D12) inte att få en utan nya flaggor som kommer att förändra hur minnesresurser tilldelas. Det verkar som om Microsoft med rätta är bekymrade över hur minne och processorkraft begärs av och tilldelas applikationer, vilket ofta kan skapa en flaskhals. För övrigt kommer dessa nya flaggor inte att påverka minnet direkt, utan kommer att påverka hur det allokeras och hanteras.
Microsoft har aktivt utvecklat den senaste iterationen av DirectX-plattformen, som länge har varit en ledande standard för skrivbordsspel. Den senaste versionen av Microsoft DirectX 12 har fått flera nya funktioner nyligen. Nyligen täckte vi mest framträdande och viktiga nya funktioner i DirectX 12 vilket skulle gynna utvecklare och slutanvändare avsevärt. Den här veckan angav Microsoft att nästa stora uppdatering av Windows 10 borde innehålla två nya flaggor för DirectX12 Direct3D. Intressant är att utvecklare som vill utforska detsamma idag behöver helt enkelt ladda ner och installera den senaste Windows 10 Insider Preview build och SDK Preview Build för Windows 10 (20H1) från Windows Insider Program.
Windows 10 DirectX 12 Direct3D för att få två nya flaggor för dynamisk minnesallokering mellan CPU och GPU:
I den kommande uppdateringen av Windows 10 kommer D3D12 att lägga till två nya flaggor i D3D12_HEAP_FLAG-uppräkningen. Förresten, dessa nya flaggor är "impermanenta" egenskaper. Enkelt uttryckt betyder det att de nya flaggorna inte direkt påverkar det resulterande minnet i sig. Istället kommer de nya flaggorna att påverka hur minnet tilldelas. Dessutom reflekteras inte dessa flaggor från ID3D12Heap :: GetDesc eller ID3D12Resource :: GetHeapProperties.
D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT:
I sin nuvarande iteration, när en utvecklare ber D3D att tilldela en hög eller engagerad resurs, är det sista som händer innan han får tillbaka objektet att minnet blir bosatt. Detta liknar anmärkningsvärt ID3D12Device :: MakeResident utförs. Det behöver inte läggas till att en sådan process presenterar två problem direkt:
- Designen blockerar en CPU-tråd tills minnet är helt klart att användas. Detta är inte en idealisk eller önskad situation
- Processen gör det också möjligt för utvecklare att övercentrera minnet, utöver vad den nuvarande processbudgeten anger att han ska använda.
Det nyligen tillagda ID3D12Device3 :: EnqueueMakeResident gör att appar kan göra olika val. Apparna kan vänta på uppehållstillstånd med GPU snarare än CPU eller begära att uppehållsfunktionen misslyckas snarare än att gå över budget. Tilldelning av minne i en stat som inte är bosatt i staten leder till att både fördelarna ges vid den första resursanvändningen.
D3D12_HEAP_FLAG_CREATE_NOT_ZEROED:
Denna flagga försöker adressera nollställt innehåll som har begått resurser och högar som nyligen skapats av D3D mottagit. Microsoft försökte optimera denna process genom att möjliggöra mer återanvändningsminne som aldrig hade lämnat gränserna för en viss process utan nollställning. Detta fungerade dock inte bra och tvingade Microsofts ingenjörer att gå tillbaka till att bara återställa nollställt minne. Det behöver inte nämnas att detta sätt var ganska tråkigt eftersom minneshanteraren måste skriva nollor i minnet innan det returneras till utvecklarna för återanvändning.
Som ett sätt att optimera processen får utvecklare möjlighet att välja bort den tråkiga processen genom att helt enkelt ange den nya flaggan under tilldelning av hög / resurs. I huvudsak kan den dynamiska omfördelningen minimera den obligatoriska nollställningsprocessen hela tiden och allokera lite frigjort minne som utvecklarens processer använde utan att tvinga det igenom om-noll-processen.
Microsoft har redan lagt till dessa nya flaggor och de kräver inte nya drivrutiner. Dessutom finns det ingen dedikerad CheckFeatureSupport alternativ för dessa. I grund och botten är dessa nya flaggor tillgängliga när som helst när ID3D12Device8 exponeras, eller en kontroll för D3D12_FEATURE_D3D12_OPTIONS7 lyckas. Alla nya flaggor kräver att utvecklarna ska köra processer på en version av D3D12 som förstår dem.