2D Tilemap Rendering

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: 2D Tilemap Rendering

Beitrag von Raven280438 »

Hi,

ich bins mal wieder.

Im Moment beschäftige ich mich mit Texturierung.
Meine Frage: soll ich die Texture-Koordinaten bei jeder Frame neu berechnen, oder Zwischenspeichern? Zwischenspeichern würde ja weniger Rechenleistung benötigen, aber der Speicherbedarf wird größer.

Und noch eine Frage:
Im Moment habe ich im Renderer ein Array aus Vertices (inkl. Farbe und Texture-Koordinaten etc.). Bei jeder Frame befülle ich das Array neu und am Ende packe ich das komplette Array in den VertexBuffer.

Code: Alles auswählen

D3D11_MAPPED_SUBRESOURCE ms;
this->GetDXContext()->Map(this->DX11VertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
memcpy(ms.pData, &this->pVertexData[0], sizeof(VERTEX) * this->VerticesInBuffer);
this->GetDXContext()->Unmap(this->DX11VertexBuffer, NULL);
Das bedeutet aber auch, dass ich die Vertices doppelt im Speicher habe, oder? Gibt es eine Möglichkeit, den Vertexbuffer Stück für Stück zu befüllen? D.h. am Anfang Mappen, dann Stück für Stück befüllen, und dann Unmappen.


Frohe Weihnachten!


Gruß
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: 2D Tilemap Rendering

Beitrag von Krishty »

Man kann Vertex Buffer Stück für Stück befüllen, ja. Aber
http://zfx.info/viewtopic.php?f=5&t=2797#p35482 hat geschrieben:GPU und CPU laufen asynchron; und während die CPU die Vertices kopiert, kann die GPU den Puffer nicht benutzen. Der Speicher, in den du da kopierst, sieht zwar auch wie ein normaler Zeiger aus, kann aber dank Speichervirtualisierung je nach Treiber was komplett anderes sein – z.B. ein Stück AGP-gekoppelter Speicher, das für Burst Writes (also gradliniges Schreiben großer Datenmengen) optimiert ist. Darum ist man üblicherweise bemüht, das Staging zeitlich so knapp und gradlinig wie möglich zu halten – und memcpy() ist meist hochoptimiert und höchsteffizient.
Die Vertices erst im gemappten Speicher zusammenzubauen wäre deshalb wahrscheinlich kontraproduktiv.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: 2D Tilemap Rendering

Beitrag von Raven280438 »

Hi,

ok danke. Also lass ich es so wies ist ;)

Wie schauts mit den Texture-Koordinaten aus? Immer neu Berechnen oder zwischenspeichern?
Mangelt es bei Spielen eher an Rechenleistung, oder Speicher?


Gruß
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: 2D Tilemap Rendering

Beitrag von Schrompf »

Probiere es aus :-) Ich könnte dazu heutzutage keine belastbare Aussage mehr treffen, dazu sind mir die CPUs heutzutage viel zu komplex geworden. Im Zweifelsfall würde ich die Variante wählen, jedesmal live zu berechnen, weil ich dadurch ein wenig Verwaltungsaufwand für die zusätzlichem Variablen spare. Und Programmieraufwand ist ja ein ebenso wichtiges Kriterium wie Rechenzeitaufwand.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten