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

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

41

27.03.2013, 15:11

sooo... jetzt wo Ferien sind, hab ich auch endlich wieder Zeit, mich mit DirectX zu befassen.
An dem Problem mit den vielen Vertices komm ich nicht dran vorbei.

Wenn ich euch jetzt sage "hier ist meine Funktion, die funktioniert nicht, was mach ich falsch?" können wir noch seeehr lange drüber diskutieren. Ob ein Objekt gezeichnet wird oder nicht hängt nicht alleine von der Objekt-Laden-Funktion ab, sondern auch noch von vielen anderen Faktoren. (ist das d3d-device richtig initialisiert, lösche ich alle backbuffer etc.).

Deshalb mach ich das jetzt etwas anders.

Ich habe in mitten von einigem Code folgende Funktion stehen:

C-/C++-Quelltext

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
27
28
void letstestsomevectorclass(LPDIRECT3DDEVICE9 D3DDevice){
    VERTEX testvertex [3];
    
    #define MyFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

    D3DDevice->CreateVertexBuffer(3*sizeof(VERTEX), 0, MyFVF, D3DPOOL_MANAGED, &VertexBuffer, NULL);

    testvertex[0].x = 5;
    testvertex[0].y = 5;
    testvertex[0].z = 1;
    testvertex[0].Color = RGB(100, 100, 100);


    testvertex[1].x = 0;
    testvertex[1].y = 0;
    testvertex[1].z = 1;
    testvertex[1].Color = RGB(100, 100, 100);


    testvertex[2].x = 10;
    testvertex[2].y = 0;
    testvertex[2].z = 1;
    testvertex[2].Color = RGB(100, 100, 100);

    VertexBuffer->Lock(0,0,(void**)&MYVOID,0);
    memcpy(MYVOID, testvertex, sizeof(testvertex));
    VertexBuffer->Unlock();
}


Die Funktion zeichnet mir wie gewünscht und ohne Fehler oder Speicherlecks ein graues Dreieck.

Wer kann mir die Funktion so umschreiben, dass sie rein theoretisch auch 1.000.000 Dreiecke zeichnen könnte? Diese 3 Millionen Punkte finden eben leider keinen Platz in einem C-Array.

Ich weiß, dass ich rein theoretisch auch den zeichnenden Part

C-/C++-Quelltext

1
2
d3ddev->SetStreamSource(0, VertexBuffer, 0, sizeof(VERTEX));
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

eine Millionen mal aufrufen könnte... aber das ist mir zu langsam, und keine dauerhafte Lösung.

Ich habe versucht die Funktion so klein wie möglich zu halten, so dass es jetzt nurnoch 28 Zeilen Code sind, die umgeschrieben werden müssen.

Sollte die Vertex-class inzwischen zu zuviel Verwirrung geführt haben, wäre ich natürlich auch an anderen Lösungswegen interessiert.

Beispielsweise der Lösungsweg von dot:


Für das Problem mit den Vertices verwend ich persönlich immer eine Hashtable (std::unordered_map).


Danke schonmal an alle, die versuchen sich meinem Problem auch nach 4 Seiten ergebnisloser Forumsdiskussion noch anzunehmen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

42

27.03.2013, 15:23

Ich denk am besten ist es, wenn du deine D3D Experimente mal ein paar Stunden ruhen lässt und dich ganz entspannt und unabhängig davon mit std::vector beschäftigst. Wenn dir jetzt jemand eine fertige Lösung präsentiert, würde dir das nicht wirklich helfen. Das sind einfach extrem wesentliche C++ Grundlagen, die du unbedingt verstanden haben solltest... ;)

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

43

27.03.2013, 15:41

Ich denk am besten ist es, wenn du deine D3D Experimente mal ein paar Stunden ruhen lässt und dich ganz entspannt und unabhängig davon mit std::vector beschäftigst.

...hmmm... ok...denkst du denn, dass sich das Problem mit der vector-class lösen lässt?

Wenn dir jetzt jemand eine fertige Lösung präsentiert, würde dir das nicht wirklich helfen. Das sind einfach extrem wesentliche C++ Grundlagen, die du unbedingt verstanden haben solltest... ;)

Also ich dachte eher dass ich das anhand der Lösung viel besser verstehen kann. Eine funktionierende Lösung als Beispiel sozusagen... Sollte ich die vector-class verwenden werd ich mich früher oder später eh noch damit beschäftigen müssen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

44

27.03.2013, 15:44

Ehrlich gesagt denk ich, dass es dir an gewissen essentiellen Grundlagen mangelt, die du unbedingt auffrischen solltest, da du sonst immer wieder, sobald es nur ein bisschen komplexer wird, Probleme haben wirst. Dich mit Dingen wie std::vector zu beschäftigen, wird dir auf keinen Fall schaden... ;)

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

45

27.03.2013, 15:46

:rolleyes: na gut.........

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

46

27.03.2013, 15:48

Aber vielleicht mal als Ausblick: Dein ursprüngliches Problem hier war ja gerade, dass du ein Array mit einer nicht fixen Anzahl an Elementen benötigst. std::vector ist genau das. Nimm das C++ Buch deiner Wahl zur Hand und schlag nach, derartige Dinge werden in jedem guten C++ Buch behandelt... ;)

Natürlich kannst du weiterhin hier Fragen stellen, aber ich denk fürs Erste solltest du dir einfach mal in Ruhe anschauen, was std::vector ist und vielleicht auch ein paar Grundlagen wie z.B. new[] und delete[] wiederholen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (27.03.2013, 15:54)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

47

27.03.2013, 15:54

Kannst ja auch einfach mehrmals memcpy machen.

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

48

27.03.2013, 16:09

Ich hab das Problem gelöst! :thumbsup: :dash: :D

Ich schreib die Funktion um und präsentier euch dann die Lösung...

Werbeanzeige