JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=5d5bfb7711bfd1788dc0b4e64e98ba8aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

dynamisches array vs. statisches

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 16.08.2007, 20:09    Titel: dynamisches array vs. statisches Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 16.08.2007, 20:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 16.08.2007, 20:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 16.08.2007, 20:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 17.08.2007, 07:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 17.08.2007, 18:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 17.08.2007, 20:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 19.08.2007, 10:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.08.2007, 13:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 20.08.2007, 01:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 20.08.2007, 19:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 20.08.2007, 19:55    Titel: Antworten mit Zitat

Korrekt wäre:

CPP:
_pVertexBuffer->CreateBuffer( sizeof( SVertex3D_NN ), this->_dwNumVertices );


Und:

CPP:
if(FAILED( ceDX9Device::GetInstancePtr()->GetDXDevice()->CreateVertexBuffer(_pBufferSize*dwNumVertices,
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 21.08.2007, 13:50    Titel: Antworten mit Zitat

und dann die beiden erst in deiner Funktion zu multiplizieren mit bufferSize = vertSize * numVerts;, wie ich vorhin gesagt hab.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum