DirectX 12 D3D12 får ny funksjon som gir mer kontroll over minnetildeling til enten GPU eller CPU dynamisk
I den kommende store oppdateringen til Windows 10 OS får DirectX12, og mer spesifikt, Direct3D (D3D12) ikke ett, men nye flagg som vil endre måten minneressurser tildeles. Det ser ut til at Microsoft er med rette bekymret for måten minne og prosessorkraft blir bedt om av og tildelt applikasjoner, noe som ofte kan skape en flaskehals. For øvrig vil disse nye flaggene ikke direkte påvirke minnet, men heller påvirke måten det tildeles og administreres på.
Microsoft har aktivt utviklet den siste iterasjonen av DirectX-plattformen, som lenge har vært en ledende standard for stasjonær spill. Den siste versjonen av Microsoft DirectX 12 har fått flere nye funksjoner i det siste. Nylig dekket vi mest fremtredende og viktige nye funksjoner til DirectX 12 som vil være til fordel for utviklere og sluttbrukere. Denne uken indikerte Microsoft at den neste store oppdateringen til Windows 10 skulle inneholde to nye flagg for DirectX12 Direct3D. Interessant, utviklere som ønsker å utforske det samme i dag, trenger bare å laste ned og installere den nyeste Windows 10 Insider Preview build og SDK Preview Build for Windows 10 (20H1) fra Windows Insider Program.
Windows 10 DirectX 12 Direct3D for å få to nye flagg for dynamisk minnetildeling mellom CPU og GPU:
I den kommende oppdateringen til Windows 10 vil D3D12 legge til to nye flagg i D3D12_HEAP_FLAG-oppregningen. Forresten, disse nye flaggene er "ugjennomtrengelige" egenskaper. Enkelt sagt, dette betyr at de nye flaggene ikke direkte påvirker selve minnet. I stedet vil de nye flaggene påvirke måten minnet tildeles på. Dessuten reflekteres ikke disse flaggene fra ID3D12Heap :: GetDesc eller ID3D12Resource :: GetHeapProperties.
D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT:
I sin nåværende iterasjon, når en utvikler ber D3D om å tildele en haug eller engasjert ressurs, er det siste som skjer før han kommer tilbake objektet, at minnet blir bosatt. Dette ligner bemerkelsesverdig ID3D12Device :: MakeResident blir utført. Unødvendig å legge til, presenterer en slik prosess to problemer med en gang:
- Designet blokkerer en CPU-tråd til minnet er helt klart til bruk. Dette er ikke en ideell eller ønsket situasjon
- Prosessen vil også tillate utviklere å overbelaste minne, utover det gjeldende prosessbudsjettet indikerer at han skal bruke.
Det nylig lagt til ID3D12Enhet3 :: EnqueueMakeResident lar apper ta forskjellige valg. Appene kan vente på bosted ved hjelp av GPU i stedet for CPU eller be om at bostedsoperasjonen mislykkes i stedet for å gå over budsjett. Tildeling av minne i en ikke-hjemmehørende stat gir både fordelene ved den første ressursbruken.
D3D12_HEAP_FLAG_CREATE_NOT_ZEROED:
Dette flagget prøver å adressere nullet innhold som har begått ressurser og dynger som nylig ble opprettet av D3D mottatt. Microsoft forsøkte å optimalisere denne prosessen ved å muliggjøre mer gjenbruk av minne som aldri hadde forlatt rammen for en gitt prosess uten nullstilling. Dette fungerte imidlertid ikke bra og tvang Microsofts ingeniører til å gå tilbake til å returnere bare nullet minne. Unødvendig å nevne, var denne måten ganske kjedelig da minnebehandleren eksplisitt må skrive nuller i minnet før den returnerer den til utviklerne for gjenbruk.
Som en måte å optimalisere prosessen på, får utviklere muligheten til å velge bort den kjedelige prosessen ved ganske enkelt å spesifisere det nye flagget under tildeling av dyng / ressurs. I hovedsak kan den dynamiske omdisponeringen minimere den obligatoriske nullstillingsprosessen hele tiden, og tildele noe frigjort minne som utviklerens prosesser brukte uten å tvinge det gjennom om null-prosessen.
Microsoft har allerede lagt til disse nye flaggene, og de krever ikke nye drivere. Videre er det ingen dedikert CheckFeatureSupport alternativ for disse. I hovedsak er disse nye flaggene tilgjengelig når som helst ID3D12Device8 blir eksponert, eller en sjekk for D3D12_FEATURE_D3D12_OPTIONS7 lykkes. Alt det nye flagget krever er at utviklerne skal kjøre prosesser på en versjon av D3D12 som forstår dem.