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

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

11

08.05.2014, 16:47

Sorry vielleicht habe ich mich falsch ausgedrückt... ich meinte das ein wenig anders:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
struct BlockVertex
{
    tbVector3 Position;
    tbVector3 Normal;
    tbVector2 Texture;
    static const DWORD VF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
};
for(Iterator i = Vector1.begin(); i != Vector1.end(); i++)
{
    BlockVertex tempVertex = i;
    tempVertex.Position += tbVector3(5, 2, 6);
    VectorAll.push_back(tempVertex );
}
Wie kann ich dass jetzt kürzer machen? Ohne den Umweg über "tempVertex".

Über Geometry Instancing werde ich mich genauer informieren, hört sich interessant an, was ich so auf die schnelle gelesen hab! Danke für den Tipp! ;)

Auch mit dem Chunksverschieben habe ich das anders gemeint: Mit "in X-Richtung verschieben" meine ich nicht, die Koordinaten, sondern die Einträge im Array! Wenn sich der Player nämlich bewegt, müssen neue Chunks geladen werden (natürlich nur, wenn mehrere Chunks überschritten wurden - nicht bei jeden 16 Blöcken :D ) und die alten, die weiter entfernt sind fallen quasi aus dem Array raus. Verstehst du?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

12

08.05.2014, 17:36

Zitat

Wie kann ich dass jetzt kürzer machen? Ohne den Umweg über "tempVertex".

Warum kopierst du in deinem Code die BlockVertex Instanz? Ich vermute, dass du folgendes machen möchtest:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
struct BlockVertex
{
...
    BlockVertex(const tbVector3& pos, const tbVector3& norm, const tbVector2& tex)
    : Position(pos), Normal(norm), Texture(tex)
    {
    }
};

for (auto blockVertexIt = Vector1.begin(); blockVertexIt != Vector1.end(); ++blockVertexIt)
{
    VectorAll.push_back(BlockVertex(blockVertexIt->Position + tbVector3(5, 2, 6), blockVertexIt->Normal, blockVertexIt->Texture));
}
sehr viel bringt das aber auch nicht mehr..

Zitat

und die alten, die weiter entfernt sind fallen quasi aus dem Array raus. Verstehst du?
Nein. Verstehe ich nicht. Warum musst du das Array modifizieren? Reicht es nicht zu, wenn du darauf zugreifst und dabei prüfst, ob die Chunks in der Reichweite sind?

Oder wenn du mehrfach in einem Frame darauf zugreifen möchtest und noch die Performance erhöhen möchtest, updatest du dir ein ptr array, dass in jedem Frame, in dem die Kamera bewegt wird geupdated wird.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void GetVisibleChunks(Chunk** pOut, const tbVector3& pos)
{
    pOut = new Chunk[MAX_CHUNKS_VISIBLE];
    unsigned int nChunksAdded = 0;
    for (int iChunk = 0; iChunk < nChunks; ++iChunk)
    {
        if (allChunks[i].IsVisible(pos))
            pOut[(++nChunksAdded) - 1] = &allChunks[i];

        if (nChunksAdded == MAX_CHUNKS_VISIBLE)
            break;
    }
}

if (Camera.PosChangedDuringThisFrame())
    GetVisibleChunks(&gameInstance.pVisibleChunks, Camera.GetPosition());
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (08.05.2014, 20:22)


13

08.05.2014, 17:52

Wie kann ich dass jetzt kürzer machen? Ohne den Umweg über "tempVertex".

Kürzer vielleicht nicht, aber auf jeden Fall eleganter: std::transform


EDIT: Schwachsinn raus...
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Steef« (08.05.2014, 17:58)


CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

14

08.05.2014, 18:08

sehr viel bringt das aber auch nicht mehr..
Würde es was bringen, wenn ich dem BlockVertex einen "+=" Operator hinzufügen würde, der dann zu einem Vertex eine Position addiert und einen Vertex returnt? Oder ist das nicht schneller?

Reicht es nicht zu, wenn du darauf zugreifst und dabei prüfst, ob die Chunks in der Reichweite sind?
Ich würde sagen nein, weil die Welt ja eine OpenWorldMap ist und deshalb unendlich groß sein kann. Ich würde da lieber dynamisch Chunks zuladen und wieder löschen. Und das, indem sie in einem Array "verschoben" werden, damit ich leichter benachbarte Chunks rausfinden kann. Gibts da 'ne Möglichkeit mit den Adressen?

@Steef: Kannst du mir ein Beispiel zu Transform machen? Ich verstehe nicht so ganz, wie es funktioniert! Am besten direkt diesen Code mit deiner Methode schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
for(Iterator i = Vector1.begin(); i != Vector1.end(); i++)
{
    BlockVertex tempVertex = i;
    tempVertex.Position += tbVector3(5, 2, 6);
    VectorAll.push_back(tempVertex );
}
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

15

08.05.2014, 18:28

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <algorithm>

// ...

size_t size_v_all = VectorAll.size();
VectorAll.resize(size_v_all + Vector1.size());

std::transform(Vector1.begin(), Vector1.end(),
    VectorAll.begin() + size_v_all,
    [] (BlockVertex v) -> BlockVertex
    {
        v.Position += tbVector3(5, 2, 6);
        return v; 
    }
    );
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

16

08.05.2014, 18:50

Zitat

Ich würde da lieber dynamisch Chunks zuladen und wieder löschen. Und das, indem sie in einem Array "verschoben" werden, damit ich leichter benachbarte Chunks rausfinden kann. Gibts da 'ne Möglichkeit mit den Adressen?

Ohne irgendetwas im Speicher zu bewegen wird schlecht gehen.

Was du machen könntest, wäre zumindest ein extra Array mit Pointern erstellen, dass bei jedem Chunkload im Raster entsprechend ein Item eines Arrays mit allen Chunks, das nicht gerastert ist, adressieren. Aber dadurch ist die Fragmentierung des Speichers sehr hoch und, bevor du in jedem Frame, in dem du auf den Chunk zugreifst, im Speicher hin und herspringst, ist es imho deutlich performanter und sauberer, wenn du einfach bei jedem Chunkload entsprechend die Chunkdaten auch mit bewegst.

Das sollte auch völlig ausreichend sein, wenn du für anderen Fall folgendermaßen rechnest: Dein Spieler bewegt sich mit ca. 2 Blöcken pro Sekunde. Ein Chunkload passiert nur nach 16 Blöcken, dauert also 8 Sekunden. Im Idealfall läuft dein Spiel mit 60 Frames in der Sekunde. Das heißt, dass du 480 Frames lang nur im Speicher hin und her springen würdest, nur um danach in einem Frame möglichst performant die Chunks zu sortieren. Ich denke nicht, dass das sinnvoll ist :)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

17

08.05.2014, 20:49

Ohne irgendetwas im Speicher zu bewegen wird schlecht gehen.

Kann ich nicht so ein Array machen:

C-/C++-Quelltext

1
vector<BlockWorld_Block**> Blöcke;
und dann immer die Adressen verschieben?

[] (BlockVertex v) -> BlockVertex

Was bedeutet diese Zeile?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

18

08.05.2014, 21:33

Zitat von »CeDoMain«

Kann ich nicht so ein Array machen:

Kannst du, aber was soll das bringen? Du speicherst einen Vektor von Pointern zu jeweils einem pointer zu einer Instanz. Wie gesagt, wenn du für jeden neuen Block dann einen neuen kleinen Speicherbereich allokierst, wird dein Rechner die ganze Zeit im Speicher beim ausführen bei JEDEM Zugriff hin und her springen müssen. Daher ist es besser, wenn du dir lieber einmal etwas länger zeit nimmst, damit über 400 weitere Frames performant laufen. ;)

Zitat

Was bedeutet diese Zeile?

http://en.wikipedia.org/wiki/Anonymous_f…ce_C.2B.2B11.29
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

19

09.05.2014, 18:46

OK vielen Dank für eure Hilfe!

@iSmokiieZz: Ich werde das trotzdem mal mit den Adressen probieren - mir lässt die Idee keine Ruhe - ich poste mein Resultat.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige