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

1

02.09.2010, 19:12

Multithreaded rendering

Alyx aus dem Forum hat mir mit den Grundzügen des "Multithreaded Rendering" schon sehr weiter geholfen. Nun möchte ich nicht wie sonst, einen Wrapper schreiben der die DX oder OpenGL Funktionen einfach wrappt, sondern einen der bereits das ganze ein wenig vereinfacht. Ich habe mir also gedacht das ich eine Structur habe, die ich dem Wrapper übergebe, und der anhand der Informationen nun die Scene rendert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
struct RenderEntrie {
    Matrix* Transforms; //< Speichert ein Array von Matrizen. Bei mehreren Matrizen wird instanziert gerendert.
    unsigned int TransformCount; //< Speichert die Anzahl der Matrizen.
    VertexBuffer* Vertices; //< Der Vertex Buffer.
    IndexBuffer** Indices; //< Die Index Buffer.
    unsigned int IndexCount; //< Die Anzahl der Index Buffer.
    Material* Material; //< Das zu verwendende Material.
}; 


Doch wie speichere ich die RenderEntries nun am besten? Generell habe ich es so gedacht, dass ich dies einfach in einer Liste Speichere und wenn alles was zu rendern ist in dieser Liste ist, wird die Liste in einen zweiten Thread gerendert. Doch wärend ich diese Liste render verändere ich ja nun zum beispiel mal die Matrize von einem RendrEntrie, weil sich dieses Objekt zum Beispiel in der nächten Szene weiter bewegt hat oder ähnliches. Also müsste ich ja nun, damit keine Porbleme auftreten, diese RenderEntries einmal komplett rüber kopieren. Aber würde das nicht enorm viel Zeit in anspruch nehmen? Oder sagt man einfach, das man nur einen Zeiger auf diese RenderEntries gibt und nach dem rendern das Objekt wieder zerstört? Also dass man für jedes mal rendern ein neues Render Entrie erstellen muss. Oder legt man beispiesweise fest, das das Objekt jene Texture, folgenden Vertexbuffer und Indexbuffer hat und man diese erst wieder verändern kann, wenn man ein neues RenderEntrie erstellt und variable Dinge, wie die Transformationsmatrizen, werden dann in der Liste einfach rüber kopiert? Oder folgt man doch einen ganz anderen Ansatz?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

2

12.09.2010, 18:09

Also irgentwie ist der Thread nun ein wenig unter gegangen. Um nochmal etwas genauer zu beschreiben was ich bisher habe:

Ich habe einen GraphicsStage, dieser kann man x-beliebig viele GraphicsEntities hinzufügen durch GraphicsEntity::AttachEntitie(); Gleichzeitig kann man dieser Stage mitteilen, in welches Target gerendert werden soll und jede GraphicsStage hat seine eigenen RenderStates. Ein GraphicsEntity hält Sachen wie VertexBuffer, IndexBuffer, Transformationen sowie Shader und deren Constanten.

Wenn man nun GraphicsStage::RenderEntities() aufruft, sollen alle Entities in einem eigenen Thread gerendert werden. Das ganze hat nun aber den Nachteil, das ich viele Dinge rüber kopieren muss, wie beispielsweise die Transformationen ... Oder verfolge ich hier vieleicht einen komplett falschen ansatz?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

12.09.2010, 22:31

Die Frage ist: Was genau versprichst du dir davon? Und warum musst du was kopieren? Warum veränderst du die Matritzen von einem RenderEntry?

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

4

12.09.2010, 23:40

Es würde doch reichen, wenn der Render-Threat Zeiger auf alle relevanten Daten enthält. Diese Daten können dann in einem anderen Thread verändert werden, also z.B. Objekte bewegen... Man müsste eben CriticalSections intelligent einsetzen.

5

13.09.2010, 00:15

Das problem ist dann einfach nur, dass sich die beiden Threads nur gegenseitig in behindern, und genau das möchte ich ja vermeiden. Was ich mich aber gerade frage is, ob sich dies ebenso lohnt, selbst wenn ich kein multithreading benutze. Ich meine, ich kann diese Liste ja später nach Shader und Texturen sortieren?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

13.09.2010, 00:28

Meine Frage zielte eher drauf ab ob so ein System überhaupt sinnvoll ist. Ich meine, kannst du wirklich auf Batchebene parallelisieren? Hast du keinerlei Abhängigkeiten zwischen Batches, also z.b. eine bestimmte Renderreihenfolge die einzuhalten ist, mehrere Passes, verschiedene Rendertargets, etc.!?

7

13.09.2010, 01:16

Also eigentlich nicht, bis auf die RenderTargets, aber man kann ja auch mehrere GraphicsStages habe, und jede Stage kann in ein anderes Target rendern. Ich frage mich sowieso immer, wie man DX oder OpenGL anständig wrappt? Sonst habe ich immer Methode für Methode praktisch 1zu1 übernommen, lediglich den Namen verändert und wirklich dolle war das nicht.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

13.09.2010, 08:51

Sonst habe ich immer Methode für Methode praktisch 1zu1 übernommen, lediglich den Namen verändert und wirklich dolle war das nicht.

Und Sinn macht das auch keinen.
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]

9

13.09.2010, 14:59

Zitat

Und Sinn macht das auch keinen.
Eine Idee wie man es besser machen könnte? Aus irrlicht oder ähnlichem werde ich auch nicht schlau, die Wrappen das ebenso. Genauso auch die TriBase, ich habe keine Ahnung wie man es "Anders" besser macht.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

13.09.2010, 15:04

Dass die Tribase Multithreaded Rendering unterstützt wär mir ziemlich neu. Von Irrlicht hab ich keine Ahnung aber kanns mir auch irgendwie schwer vorstellen...

Werbeanzeige