Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

30.03.2012, 17:17

DeferredRenderer - wo ist mein Flaschenhals?

Hi, ich arbeite immer noch an meinem DeferredRenderer bzw. dem gesammten RenderSystem meines aktuellen Projektes. Ich habe schon einiges gemacht, um den RenderPfad so schnell wie möglich zuhalten.
Aber auf meinem Laptop ist es immer noch grottig langsam, trotz einer kleinen Szene. Hier mal ein paar Fakten:

Zu erst render ich die ganze Szene in zwei Texturen per MultiRender Targets:
- ColorAndSpecularMap (RGBA 8-bit UByte) und
- NormalAndDepthMap (RGBA, 16-bit float, rgb -> xyz, a -> depth distance)

Beim DeferredShading wende ich PCF mit jittered sampling an. Hier nutzt ich bewusst dynamic-branching (mehr dazu hier aus GPU Gems) um erst nur 8 Samples zu nehmen und wenn weitere nötig sind den Rest der 32 Samples.
Das hat definitiv den RenderProzess deutlich beschleunigt - Aber auf meinem Laptop ist es immer noch recht langsam.

Insgesammt muss ich mehrmals ein Quad über den ganzen Bildschirm rendern, weil ich noch ein paar weitere Off-Screen Effekte in meinem RenderSystem habe wie z.B. transparente Objekte wie Glass - wo ich das Resultat des DeferredShadings in einer Texture brauche um es per DisplacementMapping darzustellen.
Der Hintergrund soll im Glass eben verzerrt dargestellt werden.

Jetzt vermute ich fast, das ich noch mal ein wenig Geschwindigkeit rausholen könnte, in dem ich die DepthMap nicht als 16-bit Float Texture sondern eben als speizielle GL_DEPTH_COMPONENT Texture verwende.
Dafür müsste ich dann allerdings auch das DeferredShading etwas anpassen, weil der Tiefenwert dann anders umgerechnet werden muss, um an die World-Coordinate zu kommen.
Aber ob das alleine hilft, damit es auch auf einem Handesünlichen Laptop vernünftig läuft, ist fraglich.

Bei einer Auflösung von 800x600 und Vsync aus und ohne Multisampling läuft das Program auf meinem Laptop mit ca. 20 bis 35 FPS. Also nicht wirklich brauchbar, somal die Szene noch winzig ist.
Habt ihr ein paar Tips für mich, worauf man bei einem DeferredRenderer noch achten sollte, um max. Performanz zu erziehlen?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

30.03.2012, 17:37

32 Schatten-Samples für jeden Bildschirmpixel auf einer Laptop-Grafikkarte... tja. Das ist die Engstelle, denke ich. Abgesehen davon ist bei Deferred Renderer üblicherweise die Speicherbandbreite der Flaschenhals, weil man für jeden beleuchteten Pixel alle nötigen Werte wieder und wieder lesen muss. Da Du aber nur eine Lichtquelle hast, wenn ich das richtig verstehe, wird es bei Dir das wohl nicht sein. Zumal Dein GBuffer ja recht schmal ist.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

30.03.2012, 17:51

Wenn ich nur eine Lichtquelle hätte, wäre der Deferred-Renderer überflüssig. Dann würde es auch ein Forware-Renderer tun. Außerdem nehme ich ja nicht immer 32-Samples. Sondern eben immer erst mal nur 8. Darum geht's ja in dem Artikel von GPU Gems, den ich verlinkt habe.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

30.03.2012, 18:16

grottig langsam, trotz einer kleinen Szene

Beim Deferred Rendering spielt die Größe der Szene kaum eine Rolle.
Was hauptsächlich zählt ist die Anzahl der "teuren" Pixel, und das sind beim Deferred Rendering meistens so viele, wie du auf dem Bildschirm hast :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

31.03.2012, 07:28

Nimm doch einen Profiler. Bottlenecks erraten macht nie viel Sinn.
@D13_Dreinig

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

31.03.2012, 09:39

Wenn ich nur eine Lichtquelle hätte, wäre der Deferred-Renderer überflüssig. Dann würde es auch ein Forware-Renderer tun. Außerdem nehme ich ja nicht immer 32-Samples. Sondern eben immer erst mal nur 8. Darum geht's ja in dem Artikel von GPU Gems, den ich verlinkt habe.


Hör auf, präventiv abzustreiten, und fang an auszuprobieren. Z.B. indem Du alles mal auf 1 Sample reduzierst. Auch 8 Samples plus dynamic branch sind auf den GPUs, die in heutigen Laptops verbaut werden, immernoch eine Last. Nach meiner Erfahrung gilt für Laptop-GPU vs. Desktop-GPU ungefähr ein Leistungsverhältnis von 1 zu 10.

Wenn Du viele schattenlose Lichter hast, dann kann es natürlich auch das Lesen des GBuffers für jeden beleuchteten Pixel sein. Mir fällt aber keine elegante Möglichkeit ein, dass mal auszuprobieren, außer natürlich mal die Anzahl der Lichtquellen drastisch zu senken.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige