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

BasicMan01

Frischling

  • »BasicMan01« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Nürnberg

Beruf: Webanwendungsentwickler

  • Private Nachricht senden

1

03.10.2012, 22:26

Best Practice: viele viele Cubes

in meinen derzeitigen Testszenarien spiele ich mit einer großen Menge an Wüfeln herum.
Bei einer Menge von ca. 2500 Würfeln merkt man schon erhebliche Performanceeinbrüche.
Dies brachte mich auf den Gedanken, dass hier irgendwas nicht gut umgesetzt wurde :D , denn bei Spielen wie Minecraft scheinen viel mehr Würfel viel schneller zu rendern.

Zunächst hatte ich mir nur einen Würfel erstellt. Ganz unproblematisch erst mal mit 6 Seiten á 2 Dreiecken ohne Vertex- oder Indexbuffer.
Diesen dann 2500 mal verschoben und mittels DrawPrimitiveUP gerendert.

Desweiteren hatte ich auch die 2500 SetTexture-Aufrufe (die ich hatte) mal entfernt und nur noch mit einer Grafik und entsprechenden Verschieben der Texturekoordinaten gearbeitet.

Das hat bisher nur recht wenig gebracht.

Als nächstes hätte ich nen Vertexbuffer evt. auch Indexbuffer verwenden wollen, allerdings bezweifle ich, dass es bei einem Würfel viel bringen würde.

Hat hier jemand schon von Grund auf einen effektiven Weg parat?

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

2

03.10.2012, 22:33

Als nächstes hätte ich nen Vertexbuffer evt. auch Indexbuffer verwenden wollen, allerdings bezweifle ich, dass es bei einem Würfel viel bringen würde.
Am Besten lädst Du das noch in ein VBO auf der Grafikkarte. Und ja, das bringt schon bei einem Würfel einen ziemlich starken Performanceschub, ich habe das Mal mit 2 Dreiecken gemessen und da hat es massiv Leistung gebracht.
Sonst könntest Du auch noch Instancing verwenden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

03.10.2012, 22:42

Bei Spielen wie Minecraft sind niemals alle Würfel gleichzeitig sichtbar. Der erste Schritt zu besserer Performance ist also, von vornherein nur das zu rendern, was auch wirklich potentiell sichtbar ist. Stichwort: View Frustum Culling
Um dann das Rendern der Würfel an sich zu optimieren, wirst du Instancing verwenden wollen, da du vermutlich Drawcall-limitiert bist. Unter der Annahme, dass du Direct3D 9 verwendest, siehe hier.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

03.10.2012, 22:50

Was dot gesagt hat. Plus: Minecraft macht pro Segment (z.b. 16x16x16 Würfel) einen VertexBuffer auf und füllt ihn mit den sichtbaren Flächen aller Würfel. Es lässt also die Seiten eines Würfels weg, die zu einem Nachbarwürfel zeigen, der ebenso besetzt ist. Damit sparst Du ne Menge.

[edit] Der erste Schritt wäre aber erstmal: komm von DrawPrimitiveUP weg. Nimm stattdessen statische VertexBuffer, die Du nur dann wegschmeißt und neubaust, wenn sich was an diesem Teil der Landschaft geändert hat. Der nächste Schritt ist dann, viele Würfel zu einem DrawPrimitive() zusammenzufassen. Wenn Du all Deine Würfeltexturen auf einer Textur sammelst und die Würfelkoordinaten selbst ausrechnest, kannst Du damit stressfrei hundertausende Würfel malen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige