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?