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

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

08.12.2014, 16:41

Eine Renderer Klasse?

Hi, ich habe CoookeiMonssterr's Thread gelesen
und mich gewundert wie ein guter Renderer aussieht.

CoookeiMonssterr z.B. hat eine Methode zum Rendern, welche er ein Array von Vertices zum Render gibt (hoffentlich übergibt er bald nur noch den Pointer zum Vertex Buffer).
Dementsprechende wird wohl die Engine weiterhin aufgebaut.

Bei mir ist es etwas anders aufgebaut. Bei mir verwaltet die Rendererklasse (Singleton) die Schnittstellen, z.B. das SwapChain oder den Device COM Pointer.
Implementiert sind bei mir jetzt nur einfach Methoden wie:
BeginScene();
EndScene();
SetViewMatrix();
SetWorldMatri();

getDevice(); // Eigentlich über Propertys gelöst, da ich C# nutze


Bei mir holen sich andere Klassen, wie z.B. Triangle per Singletonpointer die Schnittstellen:
Renderer.getInstance().getDevice();
Und arbeiten intern damit weiter.

Meine Frage ist eigentlich nur die: Was kann man besser machen and den beiden jeweiligen herangehensweisen und gibt es Alternativen, die stilistisch einfach besser sind?
Bitte gerne mit Diagrammen oder Source

Gruß Julién
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

08.12.2014, 16:55

Du könntest zum Beispiel Singleton raus schmeißen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

08.12.2014, 18:29

Das Vorgehen hat auch eine sehr hohe Kopplung der Primitiven an die konkrete Renderer-Instanz und die verwendete Hardware-API. Finde ich leicht unglücklich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

08.12.2014, 19:08

Wenn du im Grunde nur einen Wrapper schreibst, also ähnliche Funktionen anbietest wie die darunterliegende Schnittstelle und das meiste einfach so weiter reichst, hast du noch sehr wenig erreicht. Es kann trotzdem schon viel Code sein, aber wirklich viel helfen muss der nicht.

Meiner Meinung nach lernt man Softwaredesign am aller besten, wenn man es ohne irgendwelche Tipps ausprobiert, mitten im Projekt hängen bleibt und von vorne anfangen muss. Denn viele Probleme versteht man erst dann wirklich, wenn man sie selber einmal hatte. Und obwohl es viele gute Guidelines gibt, kann man sie doch auch oft falsch anwenden, wenn man nicht das Problem verstanden hat, das sie lösen sollen. Natürlich verschlingt dieser Trial & Error Ansatz eine Menge Zeit. Aber besser wird man eben in erster Linie, indem man viel Zeit investiert.

Ich hatte beispielsweise früher eine 3D-Modell Klasse die im Grunde in einzelnes Modell (ein Haus, einen Menschen...) repräsentiert hat. Sie konnte eine Datei laden, hat über einen Manager die Texturen verwaltet und hatte Methoden zum Rendern. Jedes Spielobjekt hatte dann ein 3D Modell und es einmal pro Frame gerendert. Das passte sehr schön in mein Programmiermodell, jedes Objekt updated sich einmal pro Frame (Position+=Geschwindigkeit usw.) und zeichnet sich einmal pro Frame.
Man konnte auch unter der Haube jede Menge optimieren. Ich hatte Manager die jedes Modell und jede Textur nur einmal laden. Und View-Frustum-Culling hatte ich auch.
Aber eine Sache ging nicht: Eine wichtige Grundregel bei 3D Grafik ist, dass Kontextwechsel teuer sind. 100 Modelle mit 100 verschiedenen Texturen zu rendern ist viel langsamer, als 100 Modelle mit der selben Textur zu rendern. Man möchte Texturwechsel, Shaderwechsel und überhaupt alle Wechsel so gut es geht reduzieren.
Nun, jetzt hatte jedes Spielobjekt aber ein 3D Modell, und jedes 3D Modell konnte verschiedene Submodels haben. Die Modelle kannten sich untereinander nicht, also konnte ich dort nichts optimieren.

Also habe ich den Render-Part komplett umgeschrieben. Jetzt werden Modelle von einer Rendererklasse verwaltet, die in jedem Frame die Modelle nach ihrer eigenen Sortierung rendert (und nicht mehr in der Reihenfolge in der die Rendermethode der Spielobjekte aufgerufen wird). Spielobjekte setzen jetzt nur noch Renderparameter wie die Position und Rotation, tätigen aber keinen Renderaufruf mehr. Und die Rendererklasse kann intern alles schön nach Shadern und Texturen sortieren und nur dann Dinge ändern, wenn sie auch wirklich geändert werden müssen. Und dann habe ich spaßeshalber mal die Optimierung abgeschaltet und wie früher für jedes Submodel alle Texturen und Shader neu gesetzt und die Geschwindigkeit verglichen. Und von da an wusste ich, dass sich das umstrukturieren gelohnt hat :)

Insgesamt kannst du dir sicherlich eine Menge Tipps und Inspiration holen. Aber egal wie viel du liest, lernen tut man es am Ende doch durch die praktische Anwendung. Du wirst immer Designentscheidungen bereuen und das ein oder andere mal Dinge umbauen. Von daher würde ich dir raten, einfach deine eigenen Erfahrungen zu machen. Und auch manchmal einfach mit schlechten Entscheidungen zu leben, denn du wirst immer neue und bessere Ideen haben und wenn du sie jedesmal umsetzt kann ich dir garantieren, dass du niemals irgendetwas fertiges in deinen Händen halten wirst.
Lieber dumm fragen, als dumm bleiben!

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

09.12.2014, 17:36

Danke erstmal an die mehr oder weniger ausführlichen Antworten :thumbsup:

Ich werde jetzt erstmal schauen, dass der Renderer selber das Rendern übernimmt. Das Singleton wird dann unnötig, da ich es ja nur für den globalen Zugriff genutzt habe, damit die Objekte sich selbst rendern können.

Heute hat mich mein Infolehrer gefragt, ob ich denn nicht eine Referenzimplementierung des Visitorpattern für den Kurs machen kann und hat mich damit auf eine Idee gebracht.
Ist es sinnvoll das Rendern per Visitorpattern zu implementieren?
Ich habe bis jetzt selten und wenige Design Patterns genutzt und weis jetzt nicht ob, es an dieser Stelle denn überhaupt sinnvoll ist.

Gruß Julién
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

09.12.2014, 18:04

Schon ja. Wir verwenden bei Rickety Racquet z.B. so einen Ansatz, auch wenn wir nicht von vornherein explizit ein Visitor-Pattern im Kopf hatten. Letztlich ist es aber eins.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

09.12.2014, 18:08

Also ich benutze das Visitorpattern.
Der Renderer geht quasi die Spielewelt durch und hinterlegt bei jedem Objekt ein eigenes Objekt. Dieses vom Renderer abgelegte Objekt übernimmt dann das eigentliche zeichnen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

09.12.2014, 18:10

Jup. So in etwa ist das bei uns auch. Nur hinterlegen wir nix.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige