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

04.01.2007, 12:48

Frage zu Vertex/Index-Buffer

Ich bin gerade bei dem Abschnitt mit Vertex/Index-Buffern in "3D-Spiele-Programmierung".
Nun habe ich die aufgabe zu dem Kapitel gelöst, in der man den Vertex-und Index-Buffer in viele kleine Buffer zerlgen sollte.
Des hat auch soweit genz gut geklappt.
Jetzt habe ich mal auf die FPS geschaut, und war etwas veriwrrt:
- Bei einem großem Vertex/Index_Buffer: über 999 FPS (bei 2048 Würfeln)
- Bei vielen kleinen Buffern: 80 FPS... (auch bei 2048 Würfeln)

Mir war klar, dass es einen Performance-Verlust gibt, aber dass er gleich so groß ist...?
Da kam mir die Frage, ob ich eventuell was falsch gemacht habe, oder ob das normal ist...
Vielleicht wiist ihr ja weiter.
Danke,

TheOffspring

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.01.2007, 13:07

bei so vielen kleinen batches ist ein derartiger performance verlust realistisch würd ich sagen ;)

du kannst ja mal deinen code zeigen, aber ich denk nicht, dass da viel falsch ist...

3

04.01.2007, 13:26

Ich denk mal der Render-Code ist der einzig wichtige (Variablennamen sollten sich von selbst erklären):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Alle Würfel zeichnen.
    for (int i=0; i<g_iNumCubes; i++)
    {

        // Zuerst den Vertex- und den Index-Buffer als Datenquelle aktivieren.
        g_pD3DDevice->SetStreamSource(0, g_pCubes[i].pVertexBuffer, 0, sizeof(SVertex));
        g_pD3DDevice->SetIndices(g_pCubes[i].pIndexBuffer);
        

        // Die Weltmatrix setzen
        mWorld = tbMatrixTranslation (g_pCubes[i].vPosition);
        g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));

        // Zeichnen!
        hResult = g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,    // Dreiecksliste
                                                     0,                     // Basisvertexindex
                                                     0,                     // Der kleinste Index
                                                     8,                     // Diff. zw. größtem u. kleinstem Index
                                                     0,                     // Von Anfang an zeichnen
                                                     12);                   // 12 Dreiecke
        if(FAILED(hResult))
        {
            // Fehler beim Zeichnen!
            TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_STOP);
        }
    }

Also sollte ich besser alle Vertices und Indices in einen großen Buffer schreiben und die dann auch darin Transformieren? Aber dann wird das mit den Objektpositionen und Bewegungsrichtungen etwas schwieriger...
Naja ich denke mal das würde sich mit dem Performance-Verlust auf jeden Fall rechnen.

Danke für die schnelle Antwort,
TheOffspring

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

04.01.2007, 14:12

das stichwort lautet instancing ;)
aber fürs erste wird es reichen einfach alles in einen großen (evtl. dynamischen) buffer zu schreiben.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

5

04.01.2007, 15:53

Re: Frage zu Vertex/Index-Buffer

Zitat von »"TheOffspring"«


- Bei einem großem Vertex/Index_Buffer: über 999 FPS (bei 2048 Würfeln)
- Bei vielen kleinen Buffern: 80 FPS... (auch bei 2048 Würfeln)

Und du bist dir sicher dass du nicht einmal in Vollbildmodus und dann im Fenstermodus gemessen hast ?
"Have you tried turning it off and on again?"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

04.01.2007, 16:23

bei 2048 batches is ein derartiger leistungsverlust wirklich realistisch!
da machen die paar fps die zwischen fullscreen und fenster um sind auch nix aus.
es gibt da diese faustregel die sagt, dass man möglichst nie mehr als 500 DrawPrimitive calls haben sollte...

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

7

04.01.2007, 21:53

Zitat von »"dot"«

bei 2048 batches is ein derartiger leistungsverlust wirklich realistisch!
da machen die paar fps die zwischen fullscreen und fenster um sind auch nix aus.

Im Fenstermodus werden die FPS auf die Bildschirmfrequenz beschraenkt, so war zumindest meine Erfahrung.
"Have you tried turning it off and on again?"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

04.01.2007, 21:57

nur wenn du vsync an hast, und das hat man beim performance testen normal nicht...

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

9

04.01.2007, 22:31

wozu es 'vsync' habe ich noch nie begiffen. gut es gibt keine zeilenverschiebungen. aber die sind meist nicht drastisch. aslo warum ein spiel mit 30 fps laufen lassen wenn es auch mit 100 geht.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

10

04.01.2007, 23:05

Zitat von »"dot"«

nur wenn du vsync an hast, und das hat man beim performance testen normal nicht...

Die 80 FPS klangen nur recht verdaechtig.

Zitat von »"Ghostrider"«

wozu es 'vsync' habe ich noch nie begiffen. gut es gibt keine zeilenverschiebungen. aber die sind meist nicht drastisch. aslo warum ein spiel mit 30 fps laufen lassen wenn es auch mit 100 geht.

Wie meinst du das? V-sync fuehrt doch nicht zu FPS-Einbußen. Es wird lediglich auf den Bildschrim "gewartet".
(Das wird wieder sehr Offtopic. Sorry)
"Have you tried turning it off and on again?"

Werbeanzeige