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

08.05.2004, 14:12

Maximalgröße bei VertexBuffern

Ich hab ein kleiens Programm geschrieben das einen Boden aus meherern Dreiecken generiert. Beim initialiserin übergibt man die anzahl der X und Z Quadrate und es erstellt dasrau die Vertices. Also wenn man z. B. 2x2 übergibt werden 8 Dreiecke (für jedes Quadrat 2) also 24 Vertices erstellt.
Zueerst haben ich diese dann mit DrawPrimitivesUP angeziegt. Bei einer Feldgröße von 100 mal 100 hatte ich aber nur noch 14 Frames.
Also hab ich versucht das alles in einen VertexBuffer zu schreiben:

Quellcode

1
2
3
4
5
6
7
8
    if(FAILED(m_lpD3DDevice->CreateVertexBuffer(sizeof(TexturedVertex)*m_Size*6, 0, D3DFVF_TEXTUREDVERTEX, D3DPOOL_MANAGED, &m_lpVB, NULL)))
    {
        Error("VertexBuffer konnte nicht erstellt werden!");
    }
    void* pVertices=NULL;
    m_lpVB->Lock(0, 0, &pVertices, 0);
    memcpy(pVertices, m_BodenVertices, sizeof(TexturedVertex)*m_Size*6);
    m_lpVB->Unlock();;

Bei einer geringen Feldgröße (10x10) funktioniert alles wunderbar. Aber wenn ich ein Feld von 10x100 erstellen möchte, funktioniert es nicht mehr, das Programm stürtz bei dem memcpy Befehl ab. Durch testen hab ich herausgefunden das das Feld 25x12 noch funktioniert und korrekt dargestellt wird. bei 13x25 gehst schon nicht mehr, auch hier stürtz das programm beim memcpy ab.
Kann es also sein, das der VertexBuffer zu klein ist? Aber dann müsste er doch beim erstellen schon einen Fehler melden.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

08.05.2004, 14:35

Also als erstes bei einem Feld von 2x2 braucht man nur 9 Vertices. Und 2. frag die maximale Anzahl mal ab.(GetDeviceCaps caps.MaxVertexIndex)
ICh weiß nicht ob man das mit memcpy machen kann....

3

08.05.2004, 15:26

Das mit memcpy hab ich aus nem anderen Buch. Und es funktioniert ja auch. Der DX Caps Viewer zeigt mir bei MaxVertexindex 1.048.575 an. Bei 25*12*6 Vertices wären es aber nur 1800, Also eigentlich müsste es dann doch auch mit 100*100 (wären dann 600.000) passen.
Naja, es ist ja auch nur ein Test, ich wollte halt den unterschied zwischen DrawPrimitiveUP und DrawPrimitive testen. Deshalb habe ich ja auch keinen IndexBuffer eingebaut.
Aber warum stürtz das Programm denn trotzdem ab, obwohl der VertexBuffer doch erzeugt wrden konnte?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

08.05.2004, 15:46

verscuh doch mal das ganze mit ner schleife. Wenns dann funzt hat es was mit dem memcpy zu tun.

5

08.05.2004, 15:49

@Nox:
Das mit memcpy funtzt.
Ausserdem sinds 6*2*2 Vertexe für 2x2 felder. Ausser er verwendet Indices.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

08.05.2004, 16:11

Man muss nicht immer Listen nutzen, man kann auch linien nutzen, das
macht dann nur noch 4(bei 1x1) oder 13(bei 2x2).
Und wenn es bei der Anweisung memcpy abstürzt, dann liegt doch der Verdacht nahe, dass da das Problem liegt. Und wenn man es nicht versucht gekommt man es nie raus.
[edit] Es kann sein das der Compiler das memcpy in den falschen Hals bekommen hat....

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

7

09.05.2004, 22:40

keine Ahnung...aber genau solch ein Problem hatte ich auch...der Vertexbuffer war einfach scheinbar zu klein (und ich hab' nichts besseres gewusst, als einfach ein wenig mehr zu reservieren...)
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

10.05.2004, 11:46

memcpy ist eine Standardfunktion, die ist sicher in Ordnung. Du solltest einmal durchdebuggen und Dir speziell die Parameter (pVertices, m_BodenVertices, m_size) ansehen. Ausserdem checke bitte alle Rückgabewerte, IIRC liefert Lock auch einen.

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

9

10.05.2004, 22:44

Ich wette, das wird nicht helfen: bestimmt sind alle Parameter und Rückgabewerte OK, memcpy ist natürlich OK, nur schätze ich mal, dass der Zeiger des gesperrten Buffers auf einen zu kleinen Bereich zeigt (ich sagte ja, genau das passierte bei mir auch, und ich weiß nich wieso...)
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

10.05.2004, 23:20

Das kann man doch leicht prüfen:

Quellcode

1
2
int size=sizeof(TexturedVertex);
size=size*6*m_size;

Werbeanzeige