JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

2D mit Direct3D
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 01:12    Titel: Antworten mit Zitat

Hm, aber die entsprechende DX9-Runtime ist überall installiert gewesen, oder?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 01:54    Titel: Antworten mit Zitat

Iwrd schon, da er sonst kaum hätte die dll ladne können. Und hätte er die net ladne können, wäre einen Windows StandardFehlermeldung gekommen. Außerdme war es installiert Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kovok
Mini JLI'ler


Alter: 36
Anmeldedatum: 06.07.2006
Beiträge: 8
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 10:47    Titel: Antworten mit Zitat

nochmal zurück zu den Vertexbuffern, ein paar Dinge sind da komisch:

1. Die Grafikkarte erstellt auch wenn du keinen Vertexbuffer nimmst einen
2. Du musst schon verdammt viele Vertexbuffer anlegen um mit einer Spriteengine heutige Grafikkarten in die Knie zu zwingen(da gibt es einfachereMethoden^^)
3. Erstell den Vertexbuffer dynamisch, dann ist es kein Problem
4. Es ist billger einen großen anstatt viele kleinen Vertexbuffer zu nehmen
5. Außerdem spart es Statechanges
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden AIM-Name MSN Messenger
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 11:45    Titel: Antworten mit Zitat

Kovok hat Folgendes geschrieben:
nochmal zurück zu den Vertexbuffern, ein paar Dinge sind da komisch:

1. Die Grafikkarte erstellt auch wenn du keinen Vertexbuffer nimmst einen
2. Du musst schon verdammt viele Vertexbuffer anlegen um mit einer Spriteengine heutige Grafikkarten in die Knie zu zwingen(da gibt es einfachereMethoden^^)
3. Erstell den Vertexbuffer dynamisch, dann ist es kein Problem
4. Es ist billger einen großen anstatt viele kleinen Vertexbuffer zu nehmen
5. Außerdem spart es Statechanges

Jopp, ist doch im Wesentlichen zusammengefasst was ich sagte. ;)
Zu 2. noch: Das ist ja korrekt, aber wirklich für jedes Sprite einen eigenen Puffer ist dann doch etwas übertrieben, zumal sich das ja dann schon schnell auf mehrere hundert bis tausend summiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 12:34    Titel: Antworten mit Zitat

zu 1. Hab ich ncoh nie von gehört. Ist das so, das wenn man aus dem Hauptmem rendert, das erste ien temporärer Buffer erstellt wird?

zu 2. Jo, der Speicher ist auch nciht das eignliche Problem, wohl eher die Geschwindigkeit beim Anzeigen.

zu 3. Hm, also ich ändere meine Vertexbuffer ja eignelihc nie, daher macht dynamisch auch nicht so viel sinn. Den macht es IMHO auch nicht beim initialisieren, wenn ich einen großen verwenden würde, weil ich den ja immer vergrößern müsste, sprich einen neune größeren erstellen und den alten reinkopieren.

zu 4. Wenn ich einen großen Buffer nehmen würde, bräuchte ich po Sprite eine Matriz weniger, eine Textur und einen Buffer weniger setzen. Sinn macht das eh nur, wenn ich sehr oft die selbe Textur habe. Benutze ich ienen großen Buffer muss ich jedesmla auf der CPU die Vertexe vorberechnen und dann alle an die Grafikkarte shcicken, was wesenltich mehr daten nur eben weniger aufrufe sind.
Würde man davon ausgehen, das ich jede Tetur nur ienmal am bidlshcirm hab,e hätte ich genausoviele Render calls, und Textur switches aber nur einen Vertexbuffer set.
Ich dneke jede Seite hat vor und nachteile und bin mir nciht wirkclih sicher, ob sich die Lösung mit dem großen Buffer so sehr rechnet, das der Aufwand sich lohnen würde.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kovok
Mini JLI'ler


Alter: 36
Anmeldedatum: 06.07.2006
Beiträge: 8
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 12:55    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
zu 1. Hab ich ncoh nie von gehört. Ist das so, das wenn man aus dem Hauptmem rendert, das erste ien temporärer Buffer erstellt wird?

zu 2. Jo, der Speicher ist auch nciht das eignliche Problem, wohl eher die Geschwindigkeit beim Anzeigen.

zu 3. Hm, also ich ändere meine Vertexbuffer ja eignelihc nie, daher macht dynamisch auch nicht so viel sinn. Den macht es IMHO auch nicht beim initialisieren, wenn ich einen großen verwenden würde, weil ich den ja immer vergrößern müsste, sprich einen neune größeren erstellen und den alten reinkopieren.

zu 4. Wenn ich einen großen Buffer nehmen würde, bräuchte ich po Sprite eine Matriz weniger, eine Textur und einen Buffer weniger setzen. Sinn macht das eh nur, wenn ich sehr oft die selbe Textur habe. Benutze ich ienen großen Buffer muss ich jedesmla auf der CPU die Vertexe vorberechnen und dann alle an die Grafikkarte shcicken, was wesenltich mehr daten nur eben weniger aufrufe sind.
Würde man davon ausgehen, das ich jede Tetur nur ienmal am bidlshcirm hab,e hätte ich genausoviele Render calls, und Textur switches aber nur einen Vertexbuffer set.
Ich dneke jede Seite hat vor und nachteile und bin mir nciht wirkclih sicher, ob sich die Lösung mit dem großen Buffer so sehr rechnet, das der Aufwand sich lohnen würde.


Zu 1: Ja die Grafikkarten der neuen Generation können nur noch mit Vertexbuffern arbeiten, was von der DrawPrimitiveUP version nur versteckt wird

zu 2: mit Culling dürftest du so viele aufrufe gar nicht haben, außerdem hast du sie so oder so, verhindern kannst du sie nur über einen großen Vertexbuffer

zu 3: Das war bezogen auf die vielen Locks und Unlocks weiter oben in einem post. Und mit dem Vergrößern, da sollte man sich fragen, ob man das wirklich pro frame einmal braucht, denn wenn du es nur ab und zu machst ist es nicht so extrem

zu 4: Vertexbuffer in einer bestimmten größe gehen auf der Graka schneller, das hat was mit verarbeitung zu tun. Und es ist immer noch besser nur die Textur zu tauschen, als auch noch Matrizen vertexbuffer, Renderstates etc.
Warum sich der Aufwand mit großem Buffer dennoch lohnt, hier eine einfache Rechnung:

Ausgangssituation: 500 Sprites an verschiedenen Orten und mit verschiedenen Texturen

1. Fall viele kleine Buffer einzelne Aufrufe:

500* setzen des Vertexbuffers
500* setzen des Indexbuffers(ok kann man wegoptimieren)
500* setzen der Matrix und Renderstates(auch hier kann man ein bischen optimieren, ist aber nich so einfach)
500* setzen der Textur
500* Rendercalls

2. Fall großer Buffer

1* setzen des Vertexbuffers
1* setzen des Indexbuffers
1* setzen der Matrix und Renderstates
500* setzen der Textur
500* Rendercalls

Ok beim näheren betrachten fällt auf, das das schlimmste hier die Rendercalls sind, die müsste man wegbekommen, aber der größte vorteil des 2. Falles ist, das er a einfacher zu optimieren, b sicherer und c zentralisiert ist
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden AIM-Name MSN Messenger
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 13:57    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
zu 3. Hm, also ich ändere meine Vertexbuffer ja eignelihc nie, daher macht dynamisch auch nicht so viel sinn. Den macht es IMHO auch nicht beim initialisieren, wenn ich einen großen verwenden würde, weil ich den ja immer vergrößern müsste, sprich einen neune größeren erstellen und den alten reinkopieren.

Du könntest dir auch einfach eine Klasse Vertexbuffer schreiben, die einerseits einen D3D-Vertexbuffer besitzt und dessen Funktionalität wrappt, zudem selbst eine Kopie der Daten verwaltet. Fügst du nun Daten hinzu, wird zuerst dein zusätzlicher Puffer im RAM erweitert und auf Wunsch mit einer Methode 'flush' oder so ähnlich mit dem Vertexbuffer abgeglichen, so kannst du alle Sprites in einem Rutsch erstellen und anschließend auf einmal in den Grafikkartenspeicher laden. Natürlich ist die Verwendung eines dynamischen Puffers genauso möglich. Haben dynamische Puffer eigentlich irgendwelche Laufzeit-Benachteiligungen gegenüber den Statischen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 14:16    Titel: Antworten mit Zitat

Wahrscheinlich schon, da sie ja auf dynamik optimiert sind.

@Kovok: Eins hast du bei deienr Rechnung aber vergessen: den kokmpletten Vertexbuffer mit 500 Vertexen an die grafikkarte übertragen., Und vorher noch 500 Vertext vom Prozessor transformeiren lassen, da die Maitrix das ja nicht übernehmen kann.
Solange man mit den Renderstates nciht viel macht, bleibt also folgendes:

500 * Matrix setzen
500 * Vertexbuffer setzen

gegen

500 * Vertex per prozessor transformieren
500 Vertexe in den dynamischen Vertexbuffer schreiben
1 * Vertexbuffer setzen

Der Rest wäre bei beiden Methoden gleich.
Ich würde beahutpen, das zumindest der Datenfluss vom Ram zur GraKa bei der ersten Version wesentlich niedriger ist. Und soo lange sollte das Buffersetzen doch nciht dauern, wenn doch nur ein Lesezeiger verändert werden muss? Das wird er ja auch wenn man biem Zeichnen sagt, ab welchen Dreieck im Buffer angefangen werdne soll zu zeichnen.

naja, es gäbe eine Kompromisslösung, indem man einen großen Vertexbuffer erstellt, der statisch sit, aber trotzdem jedesmal die Matirz neu setzt. Das wäre dann in genau dem Falle schneller, wenn das verschieben des Lesezeigers von einem Buffer in den andern wesentlich länger dauert als das Lesezeigerverschieben innerhalb eines Buffers.
Das wiederrum ist schätzungsweise von Grafikkarte zu Grafikkarte unterschiedlich, oder?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kovok
Mini JLI'ler


Alter: 36
Anmeldedatum: 06.07.2006
Beiträge: 8
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 16:06    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Wahrscheinlich schon, da sie ja auf dynamik optimiert sind.

Sie liegen im AGP speicher und nich im Videoram, um schneller darauf zugreifen zu können, sind aber nich wirklich langsamer
Jonathan_Klein hat Folgendes geschrieben:
@Kovok: Eins hast du bei deienr Rechnung aber vergessen: den kokmpletten Vertexbuffer mit 500 Vertexen an die grafikkarte übertragen., Und vorher noch 500 Vertext vom Prozessor transformeiren lassen, da die Maitrix das ja nicht übernehmen kann.
Solange man mit den Renderstates nciht viel macht, bleibt also folgendes:

500 * Matrix setzen
500 * Vertexbuffer setzen

gegen

500 * Vertex per prozessor transformieren
500 Vertexe in den dynamischen Vertexbuffer schreiben
1 * Vertexbuffer setzen


Wieso müsste ich die Vertex transformieren, ich würde im Weltsystem arbeiten und die Vertex sowieso setzen und nur die Matrix tauschen(was ich zugegebener maßen vergessen habe). Es ist für die Grafikkkarte immer schlechter viele Winzaufträge zu bekommen als ein paar große, irgendwo in der dxdoku steht auch noch wann die graka am schnellsten ist,
Dazu kommt das ich weiter mit einem statischen Buffer arbeiten würde, oder mit einem Verwalter wie Greven ihn beschrieben hat.
Jonathan_Klein hat Folgendes geschrieben:
Ich würde beahutpen, das zumindest der Datenfluss vom Ram zur GraKa bei der ersten Version wesentlich niedriger ist. Und soo lange sollte das Buffersetzen doch nciht dauern, wenn doch nur ein Lesezeiger verändert werden muss? Das wird er ja auch wenn man biem Zeichnen sagt, ab welchen Dreieck im Buffer angefangen werdne soll zu zeichnen.

die teuersten optionen für die Grafikkarte sind Rendercalls, Textur und Shaderswitchs, das setzen von Vertexbuffern ist zumindest bei meiner Grafikkarte langsamer als das nutzen eines großen.
Jonathan_Klein hat Folgendes geschrieben:
naja, es gäbe eine Kompromisslösung, indem man einen großen Vertexbuffer erstellt, der statisch sit, aber trotzdem jedesmal die Matirz neu setzt. Das wäre dann in genau dem Falle schneller, wenn das verschieben des Lesezeigers von einem Buffer in den andern wesentlich länger dauert als das Lesezeigerverschieben innerhalb eines Buffers.
Das wiederrum ist schätzungsweise von Grafikkarte zu Grafikkarte unterschiedlich, oder?

O doch das merkst du extrem dass es schneller ist. Mal mal sagen wir 300 Würfel mit einem Vertexbuffer und versetzung der Matrizen, und mal mit vielen Vertexbuffern, es dauert fast doppelt so lange.

Eine alternative wäre jedoch die Texturen zusammenzufassen und nur noch mit wenigen, sehr großen Texturen zu Arbeiten. Oder alle 8 Texturstages zu verwenden, denn es ist schneller, die einzelnen Texturstages zu aktivieren/deaktivieren als die Texturen zu setzen.

Letztendlich hast du recht, viel Geschwindigkeitsunterschied gibt es zwischen den Lösungen leider nich so wirklich, es kommt nur noch auf den Geschmack an, ich nutze nur deswegen die Variante in einem Vertexbuffer und einem rutsch, damit ich sicher sein kann, dass alle hintereinander gerendert werden. Denn ich hatte auch schon so ein kram produziert:

rendere ein paar sprites
schreibe text
rendere wieder ein bischen

und das kostet einfach zu viele Stageswitchs(k is kein gutes argument, nur die Dummheit des Programmierers)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 18:11    Titel: Antworten mit Zitat

GreveN ist sich sicher, meine Spriteklasse wäre langsam, aber eigenlitc glaube ich, das sie ganz in Ordnung ist.

Also, ich hab das mal ausgetestet.
Ich hab ein Test geschreiben, der ein Sprite 1500 m,al rendert und die zeit gemessen.
Heraus kam, das es so gut wie keinen Unterschied macht, ob ich den Vertexbuffer switche oder nicht.
Auch Alphablending an oder aus machte wenig unterschied.
Alelrdings wuchs die Zeit mit zunehmendne Sprites expotetiell an. Für 10.000 hat er 20-30 ms gebraucht, für 20.000 200ms und für 50.000 600ms. Etwas seltsam, naja.

Also, da ich ein ud das selbe Sprite render, könnte es fast sein, dass die Graka erkennt, das der Buffer gar nicht geswitched werden muss. Könnte sein, das es darum schneller geht, naja.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


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

BeitragVerfasst am: 08.08.2006, 20:03    Titel: Antworten mit Zitat

Beim D3DXSprite, was sollte er denn da an Vertex/Indexbuffern switchen für ein kleines Quad Wink
_________________
"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
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 20:19    Titel: Antworten mit Zitat

Jop, ich schätze mal die können nicht viel schneller oder langsamer sein. Ich schätze mal das sollte auch reichen. Naja, ich werde mal einen profiler basteln und in ruhe bisschen verlgeichen und gucken, und dann sehen was ich mache.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 22:04    Titel: Antworten mit Zitat

Eure Anwendungen sind wahrscheinlich eh nicht geometrielimitiert.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 22:33    Titel: Antworten mit Zitat

Ich rechne bei meinem Spiel mit maximal 1500 Sprites auf einmal, wenns ganz hart komtm 2000, das sollte einigermaßen reichen, hoffe ich.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
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