De laatste tijd is de bandbreedte van een videokaart bepalend voor de prestaties in hoge resolutie. En de nieuwe ATI RadeOn gebruikt bandbreedte besparende technieken, waarmee de effectieve bandbreedte wordt vergroot en de kaart dus sneller is dan bijvoorbeeld de GeForce 2.
Ik weet niet hoeveel van jullie kennis hebben van 3D Graphics, dit kan namelijk wel een beetje technisch worden.
Ik denk namelijk dat ik een oplossing weet voor het beperken van de bandbreedte, mogelijk met 30 - 60% (dus meer dan een halvering van het bandbreedte gebruik).
De ATI RadeOn gebruikt al enkele technieken zoals het niet tekenen van onzichtbare vlakken. Dit zou een normale videokaart al moeten doen. De techniek heet Hidden Surface Removal of BackFace Removal.
Het proces van het tekenen van een enkel beeld geschiedt door een verzameling vlakken op het scherm te tekenen. Deze vlakken vallen gedeeltelijk over elkaar heen. Dus de dichtbijzijnde vlakken moeten eigenlijk als laatste getekend worden. Maar sorteren van vlakken kost meer dan O(n) (lees: Orde N) aan tijd, namelijk O(nlogn). Dus wordt de Z-buffer techniek gebruikt.
Dat betekent dat je een Z-buffer naast je normale buffer houdt om de diepte bij te houden. Deze Z-buffer wordt geinitialiseerd op "oneindig" en de onafhankelijke pixels van de vlakken worden na het renderen (= bandbreedte verspillen) alleen getekend als de dieptewaarde aangeeft dat het vlak dichterbij als de al eerder getekende vlakken. Anders worden de pixels gewoon gedumpt (en is dus verspilling van bandbreedte).
Over het algemeen (gemeten dus) wordt iedere pixel zo'n 2 tot 3 maal overschreven, voordat het plaatje goed is.
Kan iedereen dit nog volgen??
Mijn idee is dus om eerst alle vlakken langs te gaan, maar NIET de pixels renderen. Alleen de dieptewaardes ophalen. Dit kost wel tijd, maar verspilt aanzienlijk minder bandbreedte.
Immers een pixel renderen, betekent in MIPMAPing dat er vaak zo'n 8 texels (trilineair filtering) van 32 bits uit het geheugen moeten worden gehaald.
Dus NIET renderen, alleen de dieptewaarde bepalen en deze alvast in de Z-buffer gooien.
Dan begin je weer van voor af aan (er is immers nog niets gerenderd) en dan haal je (alweer) de dieptewaarde van de pixels op. (zou je toch al doen). Dan ga je de pixels ALLEEN renderen als de dieptewaarde overeenkomt met die in de Z-buffer.
Dus niets 3 maal overschrijven, maar gewoon in 1 keer het goed plaatje.
Kost geen extra geheugen, slechts 1 maal extra alle dieptewaardes ophalen.
Dus dit kost 1 maal 32-bits extra voor alle diepte waardes, maar bespaart 8 (trilineair filtering) maal 32-bits maal 2 (besparen op overschrijven) = 512 bits.
Dus normaal renderen:
3 maal 8 maal 32 bits (renderen) + 32 bits (Z-buffer) = 800 bits per pixel
Mijn manier:
1 maal 8 maal 32 bits (renderen) + 2 maal 32 bits (Z-buffer) = 320 bits.
Dit is een 60% besparing in geheugen bandbreedte!! Oftewel een performance gain van factor 2,5!
Iemand commentaar??
Kan ik hier nu patent op aanvragen??
Ik weet niet hoeveel van jullie kennis hebben van 3D Graphics, dit kan namelijk wel een beetje technisch worden.
Ik denk namelijk dat ik een oplossing weet voor het beperken van de bandbreedte, mogelijk met 30 - 60% (dus meer dan een halvering van het bandbreedte gebruik).
De ATI RadeOn gebruikt al enkele technieken zoals het niet tekenen van onzichtbare vlakken. Dit zou een normale videokaart al moeten doen. De techniek heet Hidden Surface Removal of BackFace Removal.
Het proces van het tekenen van een enkel beeld geschiedt door een verzameling vlakken op het scherm te tekenen. Deze vlakken vallen gedeeltelijk over elkaar heen. Dus de dichtbijzijnde vlakken moeten eigenlijk als laatste getekend worden. Maar sorteren van vlakken kost meer dan O(n) (lees: Orde N) aan tijd, namelijk O(nlogn). Dus wordt de Z-buffer techniek gebruikt.
Dat betekent dat je een Z-buffer naast je normale buffer houdt om de diepte bij te houden. Deze Z-buffer wordt geinitialiseerd op "oneindig" en de onafhankelijke pixels van de vlakken worden na het renderen (= bandbreedte verspillen) alleen getekend als de dieptewaarde aangeeft dat het vlak dichterbij als de al eerder getekende vlakken. Anders worden de pixels gewoon gedumpt (en is dus verspilling van bandbreedte).
Over het algemeen (gemeten dus) wordt iedere pixel zo'n 2 tot 3 maal overschreven, voordat het plaatje goed is.
Kan iedereen dit nog volgen??
Mijn idee is dus om eerst alle vlakken langs te gaan, maar NIET de pixels renderen. Alleen de dieptewaardes ophalen. Dit kost wel tijd, maar verspilt aanzienlijk minder bandbreedte.
Immers een pixel renderen, betekent in MIPMAPing dat er vaak zo'n 8 texels (trilineair filtering) van 32 bits uit het geheugen moeten worden gehaald.
Dus NIET renderen, alleen de dieptewaarde bepalen en deze alvast in de Z-buffer gooien.
Dan begin je weer van voor af aan (er is immers nog niets gerenderd) en dan haal je (alweer) de dieptewaarde van de pixels op. (zou je toch al doen). Dan ga je de pixels ALLEEN renderen als de dieptewaarde overeenkomt met die in de Z-buffer.
Dus niets 3 maal overschrijven, maar gewoon in 1 keer het goed plaatje.
Kost geen extra geheugen, slechts 1 maal extra alle dieptewaardes ophalen.
Dus dit kost 1 maal 32-bits extra voor alle diepte waardes, maar bespaart 8 (trilineair filtering) maal 32-bits maal 2 (besparen op overschrijven) = 512 bits.
Dus normaal renderen:
3 maal 8 maal 32 bits (renderen) + 32 bits (Z-buffer) = 800 bits per pixel
Mijn manier:
1 maal 8 maal 32 bits (renderen) + 2 maal 32 bits (Z-buffer) = 320 bits.
Dit is een 60% besparing in geheugen bandbreedte!! Oftewel een performance gain van factor 2,5!
Iemand commentaar??
Kan ik hier nu patent op aanvragen??
Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD