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
In der msdn heißt es: VOID* pointer to a memory buffer containing the returned vertex data
Man kann dem Lock daher nicht einfach irgendeine Speicherstelle geben, die zu einem std::vector gehoert. Der Lock schreibt dann irgendwo irgendwas in den std::vector, wenn der Vector sich z.b. mit der 73824 die Anzahl seiner Elemente abgelegt hat, so ist diese Information dann verloren. Damit kommt dieser im Normalfall nicht zurecht (was man in einen Vektor schreibt soll ja immer ueber dessen Funktionen gehen) und das endet im besten Fall in einem Absturz oder schlimmer in irgendwelchen nicht zuordenbaren Folgefehlern.
Auf die Gefahr hin dich miss verstanden zu haben, ich glaube aber es ist nicht ganz richtig was du geschrieben hast. Der Zeiger den man durch die data( ) Methode erhalten hat ist ein valides Array in das man schreiben und von dem man lesen kann. Im Aufruf der Lock( ) Methode hat es dennoch nicht viel verloren, zumal in dem Beispiel der std::vector noch eine Größe von 0 hat und es wahrscheinlich daher zum Fehler kommt. Die data( ) Methode bezieht sich aber auf C++11, und wird nicht überall unterstützt.Man kann dem Lock daher nicht einfach irgendeine Speicherstelle geben, die zu einem std::vector gehoert. Der Lock schreibt dann irgendwo irgendwas in den std::vector, wenn der Vector sich z.b. mit der 73824 die Anzahl seiner Elemente abgelegt hat, so ist diese Information dann verloren. Damit kommt dieser im Normalfall nicht zurecht (was man in einen Vektor schreibt soll ja immer ueber dessen Funktionen gehen) und das endet im besten Fall in einem Absturz oder schlimmer in irgendwelchen nicht zuordenbaren Folgefehlern.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »H5::« (17.03.2013, 13:20)
C-/C++-Quelltext |
|
1 2 3 4 5 |
VOID* pVertices; VertexBuffer->Lock(0, sizeof(Vertices_sortiert_VECTOR), (VOID**)&pVertices, 0 ); memcpy(pVertices, &Vertices_sortiert_VECTOR, sizeof(Vertices_sortiert_VECTOR)); VertexBuffer->Unlock(); |
C-/C++-Quelltext |
|
1 2 3 4 5 |
VOID* pVertices; VertexBuffer->Lock(0, sizeof(Vertices_sortiert_VECTOR.data()), (VOID**)&pVertices, 0 ); memcpy(pVertices, Vertices_sortiert_VECTOR.data(), sizeof(Vertices_sortiert_VECTOR.data())); VertexBuffer->Unlock(); |
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »lfp« (17.03.2013, 13:48)
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 29 30 31 32 33 |
void letstestsomevectorclass(LPDIRECT3DDEVICE9 D3DDevice){ // Vertices laden std::vector <VERTEX> testvector; VERTEX testvertex; testvertex.x = 5; testvertex.y = 5; testvertex.z = 1; testvertex.Color = RGB(100, 100, 100); testvector.push_back(testvertex); testvertex.x = 0; testvertex.y = 0; testvertex.z = 1; testvertex.Color = RGB(100, 100, 100); testvector.push_back(testvertex); testvertex.x = 10; testvertex.y = 0; testvertex.z = 1; testvertex.Color = RGB(100, 100, 100); testvector.push_back(testvertex); // VertexBuffer erstellen. LPDIRECT3DVERTEXBUFFER9 testVertexBuffer; auto MyFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; D3DDevice->CreateVertexBuffer(testvector.size( )*sizeof(VERTEX), 0, MyFVF, D3DPOOL_MANAGED, &testVertexBuffer, nullptr); BYTE* buffer; testVertexBuffer->Lock(0, testvector.size( )*sizeof(VERTEX), reinterpret_cast<void**>(&buffer), D3DLOCK_NOSYSLOCK); std::copy( testvector.begin( ), testvector.end( ), buffer ); testVertexBuffer->Unlock(); } |
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »H5::« (17.03.2013, 14:02)
Ja, da hatte ich mich vertan, aber hatte ich schon geändert.Warum schreibst du mit std::copy direkt in den VertexBuffer?
Unlock schreibt den VertexBuffer glaube ich in den Videospeicher.Die Methode VertexBuffer->Unlock() schreibt doch schon in den VertexBuffer...
Ja, Direct3D 11. Vorher hatte ich mich mit dem Thema Visualisierung nicht befasst.Du benutzt wohl ne andere Version von DirectX?
Ich habe mich nicht speziell auf die data Methode bezogen. Aber es gibt nur 3 Moeglichkeiten, wie ich data() und lock benutzen koennte. Entweder ich uebergebe den Pointer, den Data liefert an lock. Dann wird die Adresse, an der Lock die Daten des Buffers erwartet an den Anfang geschrieben und loescht die Daten dort (oder das Array kann nicht soviel Daten halten, und es passiert schlimmeres). Das waere schonmal schlecht. Oder ich uebergebe Lock die Adresse, an der ein vector seinen data() Pointer speichert, so das vec.data() nun diese Adresse liefert. Das waere extrem schlecht. Oder ich kopiere den Rueckgabewert von vec.data() erst in eine Variable und geben dann die Adresse dieser Variable an lock. Lock ueberschreibt dann diese Adresse mit einer anderen. Das waere jetzt nicht schlecht, aber die Variable haette jetzt mit dem Vector auch nichts mehr zu tun und man muesste sich fragen, was der Sinn dieser Aktion sein soll.Auf die Gefahr hin dich miss verstanden zu haben, ich glaube aber es ist nicht ganz richtig was du geschrieben hast. Der Zeiger den man durch die data( ) Methode erhalten hat ist ein valides Array in das man schreiben und von dem man lesen kann.
C-/C++-Quelltext |
|
1 2 |
SVertex* pData= (SVertex*)Buffer; pData[0].m_x= 3.0f; |
Werbeanzeige