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

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

1

20.02.2009, 22:58

Batchen von Vertizes

Hallo,

weil ich im Moment wieder etwas Zeit für Direct3D habe, wollte ich mich ans Zeichnen von zweidimensionalen Objekten machen. Dabei soll es ja erstens vorteilhaft sein, keine transformierten Vertizes zu verwenden, um den Vertexbuffer nicht ständig neu locken zu müssen, und zweitens bringt wohl das "Batchen", also das Ansammeln von zu rendernden Vertizes, auch einiges, um diese dann in jedem Frame mehr oder weniger in einem Rutsch an die Grafikkarte übertragen zu können.

Dazu habe ich hier ein interessantes Tutorial gefunden. Ich wollte nun vorerst nur den Linien-Abschnitt implementieren, allerdings werden dort ja leider transformierte Vertizes verwendet, wobei man die letztendlichen Positionen direkt mitablegen kann. Im Falle von untransformierten Vertizes geschieht das hingegen erst durch die Weltmatrix. Doch wie soll ich in der Rendermethode noch wissen, welche Abmessungen und Positionen die Linien haben sollen (um die Weltmatrix entsprechend bilden zu können), wenn in der Vertexstruktur diese Informationen gar nicht mehr enthalten sind?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

21.02.2009, 14:17

Re: Batchen von Vertizes

Zitat von »"ph4nt0m"«


Dabei soll es ja erstens vorteilhaft sein, keine transformierten Vertizes zu verwenden, um den Vertexbuffer nicht ständig neu locken zu müssen


nur weil sie nicht transformiert sind musst du den vertexbuffer doch nicht ändern. gerade dazu sind ja matrizen da.

Zitat von »"ph4nt0m"«


zweitens bringt wohl das "Batchen", also das Ansammeln von zu rendernden Vertizes, auch einiges, um diese dann in jedem Frame mehr oder weniger in einem Rutsch an die Grafikkarte übertragen zu können.


ja batchen kann viel bringen, klare sache. aber du solltest nur das batchen, was starr ist und sich nicht bewegt, bzw. zusammen gleich transformiert wird mit denselben matrizen, denn das batchen erfordert sonst unter umständen mehr locks als wenn du einfach mehr drawcalls hast.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

3

21.02.2009, 14:51

Zitat

nur weil sie nicht transformiert sind musst du den vertexbuffer doch nicht ändern. gerade dazu sind ja matrizen da.
Genau das wollte ich doch sagen, vielleicht ist das nicht so rübergekommen :)

Das Problem ist, dass man doch die Koordinaten der Vertizes meistens so ausrichtet, dass sich das Objekt ersteinmal in der Mitte, also am Ursprung befindet. Bei einem Quad für ein Sprite sieht das dann bei mir so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
Vertex q[4] = 
{
    { Vector3(-0.5f, -0.5f, 0.0f), 0xFFFFFFFF,                 0.0f, (float)height/newSize },
    { Vector3(-0.5f,  0.5f, 0.0f), 0xFFFFFFFF,                 0.0f,                  0.0f },
    { Vector3( 0.5f,  0.5f, 0.0f), 0xFFFFFFFF, (float)width/newSize,                  0.0f },
    { Vector3( 0.5f, -0.5f, 0.0f), 0xFFFFFFFF, (float)width/newSize, (float)height/newSize }
};

Nur dann kann man nämlich noch Rotationen um das Objekt selbst durchführen um es danach zu verschieben.
Und wenn ich die Verschiebung somit erst mit Hilfe der Weltmatrix durchführe, muss ich doch sowieso für jedes Objekt eine eigene Matrix setzen, weil sich die Objekte ja meistens nicht alle an derselben Position befinden.

Bei den transformierten Vertizes sind die spezifischen Koordinaten für jedes einzelne Objekt hingegen bereits vorher in den Vertizes selbst gespeichert und ich brauche diese eben nicht mehr durch eine Matrix zu transformieren.

Meine Frage ist nun, wie man überhaupt bei untransformierten Vertizes batchen kann, wenn man doch für jedes Objekt eine neue Matrix setzen muss.

4

21.02.2009, 16:14

man steckt alle Objekte die man batchen will, bereits vollständig transformiert in einen Vertexpuffer, den man dann mit einem schlag rendert, deshalb ist das auch nur für statische geometrie sinnvoll, weil du ansonsten ja ständig den Bufffer locken musst, was auch alles andere als schnell ist.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

5

21.02.2009, 16:30

Das heißt, für sich bewegende Objekte kommt Batching im Allgemeinen gar nicht in Frage? Wie ist dann die optimale Vorgehensweise? Jedes Objekt einzeln rendern, indem man nacheinander für jedes Objekt die passende Matrix setzt und es dann zeichnet? Kosten die ständigen Matrizenwechsel nicht genausoviel, wie vortransformierte Vertizes, die dafür alle in einem Rutsch gerendert werden können?

6

21.02.2009, 17:00

Was du noch probieren könntest, wäre Instancing.
Lieber dumm fragen, als dumm bleiben!

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

7

21.02.2009, 21:03

Was ich bisher über Instancing finden konnte, hörte sich erstens eher nach 3D (Meshes) an und hatte außerdem soweit ich das verstanden hatte mehr mit Objekten zu tun, die selbst mehrfach gezeichnet werden. Ich will aber die Sprites im Normalfall nur einmal zeichnen.

Wie geht ihr denn selbst an dieses Thema? Kann doch nicht sein, dass ihr alle ID3DXSprite verwendet oder mit 2D nichts mehr am Hut habt. :? Hier halten sich doch wirklich einige erfahrene Spieleprogrammierer auf, die doch wohl selbst schon einmal in der Situation waren, zweidimensionale Grafiken (die auch bewegt werden) ohne Hilfsmittel (also D3DX) möglichst optimal zu zeichnen und zu verwalten.

Der Link, den ich gepostet hatte, greift ja genau dieses Thema auf. Aber ich frage mich eben, wie man das mit normalen, also nicht transformierten Vertizes realisieren kann oder ob dieser Ansatz überhaupt empfehlenswert ist.

8

21.02.2009, 21:09

Zitat von »"ph4nt0m"«

Was ich bisher über Instancing finden konnte, hörte sich erstens eher nach 3D (Meshes) an und hatte außerdem soweit ich das verstanden hatte mehr mit Objekten zu tun, die selbst mehrfach gezeichnet werden. Ich will aber die Sprites im Normalfall nur einmal zeichnen.

Naja, ein Sprite, dass aus 2 Dreiecken besteht, ist ja ein Mesh. Und da jedes Sprite aus 2 Dreiecken besteht, zeichnest du ja im Prinzip imemr das selbe, nur Eben mit anderen Texturen.
Eventuell hast du ja einmal viele Sprites mit der selben Textur (Bei Partikeln z.B.)
Lieber dumm fragen, als dumm bleiben!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

21.02.2009, 21:29

Zitat von »"Jonathan_Klein"«

Zitat von »"ph4nt0m"«

Was ich bisher über Instancing finden konnte, hörte sich erstens eher nach 3D (Meshes) an und hatte außerdem soweit ich das verstanden hatte mehr mit Objekten zu tun, die selbst mehrfach gezeichnet werden. Ich will aber die Sprites im Normalfall nur einmal zeichnen.

Naja, ein Sprite, dass aus 2 Dreiecken besteht, ist ja ein Mesh. Und da jedes Sprite aus 2 Dreiecken besteht, zeichnest du ja im Prinzip imemr das selbe, nur Eben mit anderen Texturen.
Eventuell hast du ja einmal viele Sprites mit der selben Textur (Bei Partikeln z.B.)


Das lohnt sich aber bei 4/6 Vertices nicht.. schlussendlich musst du alleine an Positionsdaten gleich viel an die GK schicken, wie wenn du es gleich ohne Instancing machst.. (sofern man ebenfalls Rotation haben will)

Da kann man die Transformationen gleich auf der CPU machen und dann alles schicken..

Bei grossen Objekten ist da ja der Vorteil, dass keine n*5k an Vertexdaten an die GK müssen, sondern nur einmal und dann die Positions/Rotations - Daten, was dann im Verhältnis nichts mehr ist..

10

22.02.2009, 00:24

Stimmt, das klingt logisch.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige