|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 16.08.2007, 20:09 Titel: dynamisches array vs. statisches |
|
|
Ich hab ein (für mich) seltsames phänomen:
Ich rendere eine Fläche mit 16 Vertices. Deklariere ich das Array für die Vertices als statisches Array (mit fester Größe halt), läuft alles einwandfrei...
Beispiel:
Code: | SVertex3D_NN sVerticesCube[16]; |
Erzeuge ich das Array dynamisch, also so:
Code: | sVerticesCube = new SVertex3D_NN[iSize]; |
flimmert meine ausgegebene Fläche (es verschwinden kurzfristig einzelne dreiecke, kann man leider schlecht beschreiben)
Jemand eine Idee woran das liegt? _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 16.08.2007, 20:20 Titel: |
|
|
Könntest du etwas mehr relevanten Code posten, das was du da zeigst ist etwas wenig. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 16.08.2007, 20:26 Titel: |
|
|
Oehm, ja sicher, obwohl doch das problem eigentlich bereits lokalisiert ist:
Es muss halt irgendwas mit der Array-Erzeugung zu tun haben... What ever...
Code: |
SVertex3D_NN sVerticesCube[8];
sVerticesCube[0] = SVertex3D_NN( Math::ceVector3<float>( -1.0f, 1.0f, 1.0f ),
0xFFFF0000, 0.0f, 1.0f );
sVerticesCube[1] = SVertex3D_NN( Math::ceVector3<float>( 1.0f, 1.0f, 1.0f ),
0xFFFF0000, 0.0f, 0.0f );
sVerticesCube[2] = SVertex3D_NN( Math::ceVector3<float>( 3.0f, 1.0f, 1.0f ),
0xFFFF0000, 1.0f, 0.0f );
sVerticesCube[3] = SVertex3D_NN( Math::ceVector3<float>( 5.0f, 1.0f, 1.0f ),
0xFFFF0000, 1.0f, 0.0f );
sVerticesCube[4] = SVertex3D_NN( Math::ceVector3<float>( -1.0f, 1.0f, -1.0f ),
0xFFFF0000, 0.0f, 0.0f );
sVerticesCube[5] = SVertex3D_NN( Math::ceVector3<float>( 1.0f, 1.0f, -1.0f ),
0xFFFF0000, 0.0f, 1.0f );
sVerticesCube[6] = SVertex3D_NN( Math::ceVector3<float>( 3.0f, 1.0f, -1.0f ),
0xFFFF0000, 0.0f, 0.0f );
sVerticesCube[7] = SVertex3D_NN( Math::ceVector3<float>( 5.0f, 1.0f, -1.0f ),
0xFFFF0000, 0.0f, 1.0f );
short dwIndices2[] = { 5,4,0,0,1,5, 6,5,1,1,2,6, 7,6,2,2,3,7 };
_pVertexBuffer = new Graphic::ceVertexBuffer();
_pVertexBuffer->CreateBuffer( sizeof( sVerticesCube ), 8 );
_pVertexBuffer->SetVertexBuffer( 0, sizeof(sVerticesCube), sVerticesCube ); //Lock and Unlock is automatic
_pIndexBuffer2 = new Graphic::ceIndexBuffer();
_pIndexBuffer2->CreateBuffer( sizeof(dwIndices2) );
_pIndexBuffer2->SetIndexBuffer( 0, sizeof(dwIndices2), dwIndices2 );
|
TIA _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 16.08.2007, 20:29 Titel: |
|
|
Wenn du das hier genauso beibehälst wenn du mit dem dynamischen Array arbeitest:
Zitat: | _pVertexBuffer->SetVertexBuffer( 0, sizeof(sVerticesCube), sVerticesCube ); |
Nimmt er dann nicht die grösse des Pointers? Also 4 Byte (afaik).
Besser wäre da sicher folgendes:
CPP: | _pVertexBuffer->SetVertexBuffer( 0, sizeof(SVertex3D_NN)*iSize, sVerticesCube ); |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 17.08.2007, 07:50 Titel: |
|
|
Das is in beiden Fällen falsch:
CPP: | _pVertexBuffer->CreateBuffer( sizeof( sVerticesCube ), 8 );
|
Sollte beidenfalls heißen:
CPP: | _pVertexBuffer->CreateBuffer( sizeof( SVertex3D_NN ), 8 );
|
|
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 17.08.2007, 18:17 Titel: |
|
|
Leider funktioniert keine der beiden Varianten. das flimmern bleibt...
Allerdings ist die Änderung des sizeof schon verständlich, hab ich definitiv übersehen.
Ich hab hier mal die CreateBuffer
Code: |
EResult ceDX9VertexBuffer::CreateBuffer(const size_t pVertexSize, const DWORD dwNumVertices)
{
_pBufferSize = pVertexSize;
_dwNumVertices = dwNumVertices;
if(FAILED( ceDX9Device::GetInstancePtr()->GetDXDevice()->CreateVertexBuffer(_pBufferSize,
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_MANAGED,
&_pBuffer,
NULL) ) )
{
return CE_FAIL;
}
return CE_OK;
}//CreateBuffer
|
und die SetBuffer
Code: |
EResult ceDX9VertexBuffer::SetVertexBuffer(const size_t pOffset, const size_t pLength, const void* pData)
{
if(_bBufferLocked) {
EXCEPTION(L"Buffer already locked!");
return CE_FAIL;
}
void* pTemp = this->LockBuffer(pOffset,pLength);
memcpy(pTemp, pData, pLength);
return this->UnlockBuffer();
} |
Funktion... obwohl da nix ungewöhnliches dran ist... _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.08.2007, 20:00 Titel: |
|
|
Hast du mal die Werte vom vertex als auch Indexbuffer nach dem zuweisen (und vor dem Unlock) geprüft? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 19.08.2007, 10:54 Titel: |
|
|
Ja, da ist nichts auffälliges gewesen.
Was mich halt auch wundert ist, dass die Fläche ansich normal gerendert wird, nur ab und zu sind halt aussetzer, die nicht kommen, wenn ich das array statisch erzeugt habe... _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.08.2007, 13:23 Titel: |
|
|
hmm mich wundert ob das gewollt ist, dass du in deiner createBuffer Methode nur die Größe eines Vertices als buffer größe angibst? schneidi74 hat Folgendes geschrieben: | CPP: | _pBufferSize = pVertexSize;
//...
if(FAILED( ceDX9Device::GetInstancePtr()->GetDXDevice()->CreateVertexBuffer(_pBufferSize, |
|
Müsste nicht eigtl die buffer größe vertexSize * numVertices sein? Das kann bei statischen arrays klappen, weil sizeof(s_array) die gesamte (Buffer-)größe zurückgibt, bei sizeof(*d_array) gibst du aber dann nur eine Vertexgröße an
Gruß DXer |
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 20.08.2007, 01:28 Titel: |
|
|
Bei der dynamischen Variante handelt es sich auch ganz sicher um einen Zeiger? D.h.
Code: |
SVertex3D_NN * sVerticesCube;
|
? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 20.08.2007, 19:10 Titel: |
|
|
So, also es lag wirklich an einer falschen "sizeof" Benutzung.
Falls mal jemand ebenfalls vor einem Flimmerproblem steht, so läufts bei mir jetzt:
Code: | _pVertexBuffer = new Graphic::ceVertexBuffer();
_pVertexBuffer->CreateBuffer( (this->_dwNumVertices * sizeof( SVertex3D_NN ) ), this->_dwNumVertices );
_pVertexBuffer->SetVertexBuffer( 0, (this->_dwNumVertices * sizeof( SVertex3D_NN ) ), this->_vecTerrain ); //Lock and Unlock is automatic
|
_________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 20.08.2007, 19:55 Titel: |
|
|
Korrekt wäre:
CPP: | _pVertexBuffer->CreateBuffer( sizeof( SVertex3D_NN ), this->_dwNumVertices );
|
Und:
CPP: | if(FAILED( ceDX9Device::GetInstancePtr()->GetDXDevice()->CreateVertexBuffer(_pBufferSize*dwNumVertices,
|
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 21.08.2007, 13:50 Titel: |
|
|
und dann die beiden erst in deiner Funktion zu multiplizieren mit bufferSize = vertSize * numVerts;, wie ich vorhin gesagt hab.
Gruß DXer |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|