Performance-Frage [weiteres Problem!]
-
Kuldren schrieb:
Allerdings sinken die FPS sobald ich beginne zu feuern (sind ja wieder 10 schuss pro Geschütz und 100 geschütze also 1000 Kugeln und somit 1000 drawcalls)
Gibts dafür ne gute Möglichkeit das ganze effizienter zu machen?
du weisst doch dass du drawcall limitiert bist und wieder machst du diese mini drawcalls. pack alle particle in einen vertexbuffer und zeichne sie mit einem rutsch (drawcall)
Nebenfrage: Ist es normal dass die FPS um ganze 30 fallen sobald man näher mit der Kamera heranfährt? Wenn ich nache rangehe...dass ich ca 5x5 Geschütze im Sichtfeld habe fallen die fps auf 30

ja, dein stichwort ist vsync.
-
rapso schrieb:
du weisst doch dass du drawcall limitiert bist und wieder machst du diese mini drawcalls. pack alle particle in einen vertexbuffer und zeichne sie mit einem rutsch (drawcall)
Darauf wollte ich hinaus, aber ich müsste Position (das ist ja noch einfach) und Rotation der Schüsse transformieren bevor ich die Vertices in den Buffer schreibe. Da steh ich leider an, weil ich ja bisher einfach die WorldMatrix mit
Device->SetTransform( D3DTS_WORLD, &Objects[q]->WorldMatrix);dazu verwendet habe. Aber wie mache ich das ohne danach direkt den Drawcall zu starten

rapso schrieb:
ja, dein stichwort ist vsync.
Das hab ich schon in einem anderen Thread gelesen. Kann aber nicht wirklich was damit anfangen. Soll ich VSync abschalten? Wär das nicht Kontraproduktiv (Obwohls dann trotzdem mehr Frames wären?
-
Kuldren schrieb:
rapso schrieb:
du weisst doch dass du drawcall limitiert bist und wieder machst du diese mini drawcalls. pack alle particle in einen vertexbuffer und zeichne sie mit einem rutsch (drawcall)
Darauf wollte ich hinaus, aber ich müsste Position (das ist ja noch einfach) und Rotation der Schüsse transformieren bevor ich die Vertices in den Buffer schreibe. Da steh ich leider an, weil ich ja bisher einfach die WorldMatrix mit
Device->SetTransform( D3DTS_WORLD, &Objects[q]->WorldMatrix);dazu verwendet habe. Aber wie mache ich das ohne danach direkt den Drawcall zu starten

ja genau, du machst das, nicht D3d, du per hand in deinem code, in d3d setzt du identity.
rapso schrieb:
ja, dein stichwort ist vsync.
Das hab ich schon in einem anderen Thread gelesen. Kann aber nicht wirklich was damit anfangen. Soll ich VSync abschalten? Wär das nicht Kontraproduktiv (Obwohls dann trotzdem mehr Frames wären?
bitte informier dich doch darueber. wenn du weisst was das ist und wozu, wirst du all deine fragen beantworten koennen. that's no rocked science.
-
rapso schrieb:
bitte informier dich doch darueber. wenn du weisst was das ist und wozu, wirst du all deine fragen beantworten koennen. that's no rocked science.
Ok...werde mich später damit auseinandersetzen
rapso schrieb:
ja genau, du machst das, nicht D3d, du per hand in deinem code, in d3d setzt du identity.
Ok ... ich stelle jeden Schuss mit nur einem Dreieck dar und dieses Dreieck muss ich um einen bestimmten Winkel rotieren.
Dazu verwende ich prinzipiell die Formeln:
x'=x*cos(phi)-y*sin(phi) y'=x*sin(phi)+y*cos(phi)(x und y sind ja nur die Größe der Schüsse in x und y durch 2 - dabei beachte ich auch die vorzeichen)
Allerdings gelten die ja nur für das drehen um den Winkel (phi) und nicht das ausrichten nach phi.
Den Winkel hole ich mir übrigens so:
xBuf=(targetAimed->x-Position.x); yBuf=(targetAimed->z-Position.z); gFAngle=atan2f(xBuf,yBuf);Wenn ich aber die obigen Formeln verwenden will müsste ich für jeden der 3 Punkte eine andere Winkeldifferenz ausrechnen (also den Winkel des Punkts und dann vom Auszurichtenden Winkel abziehen) UND anschließend dann mit den obigen Formeln um diese Winkeldifferenz rotieren- Allerdings erscheint mir das sehr kompliziert bzw. aufwändig- gibts da keine einfachere Möglichkeit?
Noch eine Frage:
Kann es sein dass der Teil mit dem ich den Vertexbuffer fülle:BYTE* VertexBufferStart=NULL; Device->CreateVertexBuffer(sizeof(cbuf), D3DUSAGE_WRITEONLY, D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB, NULL); VB->Lock(0,0,(void**)&VertexBufferStart,0); memcpy(VertexBufferStart,cbuf,sizeof(cbuf)); VB->Unlock(); Device->SetFVF(D3D_CUSTOMVERTEX);Den Speicher frisst?
Denn nach einiger Zeit stockt das Programm bzw. der Rechner.
Muss ich da noch etwas freigeben? Obwohl der VB ein Member der Klasse und keine temporäre Variable ist?Bin für alle Tipps dankbar!
-
Kuldren schrieb:
Wenn ich aber die obigen Formeln verwenden will müsste ich für jeden der 3 Punkte eine andere Winkeldifferenz ausrechnen (also den Winkel des Punkts und dann vom Auszurichtenden Winkel abziehen) UND anschließend dann mit den obigen Formeln um diese Winkeldifferenz rotieren- Allerdings erscheint mir das sehr kompliziert bzw. aufwändig- gibts da keine einfachere Möglichkeit?
du hast doch gesagt dass du schon die matrix hast, weil du sie doch an D3D als world matrix uebergibst. multipliziere doch einfach die positionen der vertices mit dieser matrix, d3d hat schon alle funktionen die du dafuer brauchst, bzw die eine.
Noch eine Frage:
Kann es sein dass der Teil mit dem ich den Vertexbuffer fülle:
[cpp]BYTE* VertexBufferStart=NULL;
Device->CreateVertexBuffer(sizeof(cbuf), D3DUSAGE_WRITEONLY,
D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB, NULL);
VB->Lock(0,0,(void**)&VertexBufferStart,0);
memcpy(VertexBufferStart,cbuf,sizeof(cbuf));
VB->Unlock();
Device->SetFVF(D3D_CUSTOMVERTEX);[/cpp]
Den Speicher frisst?
Denn nach einiger Zeit stockt das Programm bzw. der Rechner.
Muss ich da noch etwas freigeben? Obwohl der VB ein Member der Klasse und keine temporäre Variable ist?du scherzkaeks

leg einmal einen buffer an, nur einmal beim initialisieren, der ausreichend gross ist, ja, klar weisst du die groesse nicht, aber schaetz irgendwas grosses ab und falls du mehr particle haben solltest, musst du eventuell mehrmals lock + draw machen oder du ignorierst nach ein paar tausend particle einfach was noch kommt.
-
rapso schrieb:
du hast doch gesagt dass du schon die matrix hast, weil du sie doch an D3D als world matrix uebergibst. multipliziere doch einfach die positionen der vertices mit dieser matrix, d3d hat schon alle funktionen die du dafuer brauchst, bzw die eine.
du scherzkaeks

leg einmal einen buffer an, nur einmal beim initialisieren, der ausreichend gross ist, ja, klar weisst du die groesse nicht, aber schaetz irgendwas grosses ab und falls du mehr particle haben solltest, musst du eventuell mehrmals lock + draw machen oder du ignorierst nach ein paar tausend particle einfach was noch kommt.
Hoppla
....Erstmal ein großes Danke! für die vielen Tipps.
Hab jetzt sowohl Spielfeld als auch Schüsse und Geschütztürme so umstrukturiert dass die DrawCalls minimiert wurden.
Allerdings bleibt das Problem bestehen dass die Framezahl absackt wenn man näher heranzoomt - damit das nicht falsch verstanden wird. die Framezahl bleibt dann auch so niedrig - das ist also kein kurzzeitiger effekt sondern sie geht erst wieder hinauf wenn ich weiter heraus"zoome"...Allerdings tritt das Problem auch erst auf wenn ich ca 100 Geschütze am Spielfeld habe...bei 20 passiert gar nichts beim kameraverschieben.Durch das ganze "Optimieren" sinkt die Framerate auch "nur" noch von 59/60 auf 50-57 herab wenn alle 100 Geschütze feuern.
Allerdings kann das ganze auch auf 60 FPS laufen - dafür muss ich nur mit der Kamera etwas weiter aus der Szene heraus .... Anscheinend beeinflusst das das ganze doch enorm...Liegt das wirklich nur am Vsync?
-
Kuldren schrieb:
Allerdings kann das ganze auch auf 60 FPS laufen - dafür muss ich nur mit der Kamera etwas weiter aus der Szene heraus .... Anscheinend beeinflusst das das ganze doch enorm...Liegt das wirklich nur am Vsync?
nein, an vsync liegt es wenn die framerate von 60 auf 30 ohne zwischenstufen faellt.
es kann sein dass es ganz normal langsam wird? wenn du dem nachgehen willst, schau dir z.b. NVIDIA PerfHUD oder AMD GPU PerfStudio an.
-
rapso schrieb:
Kuldren schrieb:
Allerdings kann das ganze auch auf 60 FPS laufen - dafür muss ich nur mit der Kamera etwas weiter aus der Szene heraus .... Anscheinend beeinflusst das das ganze doch enorm...Liegt das wirklich nur am Vsync?
nein, an vsync liegt es wenn die framerate von 60 auf 30 ohne zwischenstufen faellt.
es kann sein dass es ganz normal langsam wird? wenn du dem nachgehen willst, schau dir z.b. NVIDIA PerfHUD oder AMD GPU PerfStudio an.
Danke...
Leider wird meine Karte laut UserGuide nicht unterstützt bzw. beim Kompilieren meckert meine IDE dass
#include "NVPerfSDK.h"nicht gefunden werden kann.
Ist es denn normal dass es mehr Rechenleistung kostet wenn man näher an die Objekte heranzoomt? Die Geschütze sind so lowpoly dass ich mir das irgendwie nicht vorstellen kann.
-
Kuldren schrieb:
Leider wird meine Karte laut UserGuide nicht unterstützt bzw. beim Kompilieren meckert meine IDE dass
#include "NVPerfSDK.h"nicht gefunden werden kann.
und das obwohl du dir das nvperf sdk geladen und installiert hast?
Ist es denn normal dass es mehr Rechenleistung kostet wenn man näher an die Objekte heranzoomt? Die Geschütze sind so lowpoly dass ich mir das irgendwie nicht vorstellen kann.
ich hab keine ahnung was der grund ist, gibt sicher 100dinge die es sein koennten, ein screenshot und angabe welche graka du hast koennte erstmal helfen.
mach zudem mal alles in wireframe und sag ob es dann schneller bzw ohne den einbruch laeuft.
-
[quote="rapso"]und das obwohl du dir das nvperf sdk geladen und installiert hast?
Jup...Geladen und installiert.rapso schrieb:
ich hab keine ahnung was der grund ist, gibt sicher 100dinge die es sein koennten, ein screenshot und angabe welche graka du hast koennte erstmal helfen.
mach zudem mal alles in wireframe und sag ob es dann schneller bzw ohne den einbruch laeuft.Also im Solid Mode fallen die FPS in Relation zur Nähe zum Spielfeld.
Im WireframeMode (UND - das ist das wichtige- MIT geladenen Texturen also die Linien werden wie die Texturen gefärbt) läuft es bei egal welcher Distanz bei festen 59/60 FPS....
Außerdem ist mir aufgefallen dass wenn ich naheheranzoome und die FPS auf 29/30 fallen - auch das abfeuern der geschosse die FPS nicht mehr beeinflusst und dass sie bei 29/30 kleben bleiben...Total seltsamHier ein paar Screenshots: (Bitte beachte den Abstand zum Spielfeld und die damit zusammenhängenden FPS)
http://i191.photobucket.com/albums/z231/kuldren/14092008-01.jpg
http://i191.photobucket.com/albums/z231/kuldren/14092008-02.jpg
http://i191.photobucket.com/albums/z231/kuldren/14092008-03.jpg
http://i191.photobucket.com/albums/z231/kuldren/14092008-04.jpg
http://i191.photobucket.com/albums/z231/kuldren/14092008-05.jpg
http://i191.photobucket.com/albums/z231/kuldren/14092008-06.jpgMeine Grafikkarte ist die Nvidia Geforce 7500 LE (Ja ist echt untere klasse aber so schlecht dass sie das nicht packt? wie gesagt...oblivion und WoW laufen bei guter Auflösung und mittleren details auch flüssig...)
EDIT: es ist übrigens nicht beabsichtigt dass bei manchen bildern die FPS angaben doppelt vorhanden sind.....das ist wohl beim kopieren ins paint passiert also bitte die unteren werte ansehen
-
Kuldren schrieb:
rapso schrieb:
und das obwohl du dir das nvperf sdk geladen und installiert hast?
Jup...Geladen und installiert.
ich glaube du hast einfach nur nicht die include pfade usw. gesetzt.
wobei bisher bei perfHUD nichts zum includen war, man musste nur d3d speziell initialisieren udn ueber perfhud starten. schau in die doku, es ist nicht viel arbeit.rapso schrieb:
ich hab keine ahnung was der grund ist, gibt sicher 100dinge die es sein koennten, ein screenshot und angabe welche graka du hast koennte erstmal helfen.
mach zudem mal alles in wireframe und sag ob es dann schneller bzw ohne den einbruch laeuft.Also im Solid Mode fallen die FPS in Relation zur Nähe zum Spielfeld.
Im WireframeMode (UND - das ist das wichtige- MIT geladenen Texturen also die Linien werden wie die Texturen gefärbt) läuft es bei egal welcher Distanz bei festen 59/60 FPS....
Außerdem ist mir aufgefallen dass wenn ich naheheranzoome und die FPS auf 29/30 fallen - auch das abfeuern der geschosse die FPS nicht mehr beeinflusst und dass sie bei 29/30 kleben bleiben...Total seltsamtja, im wireframe fluessig, ohne wireframe faellt die fps, ich wuerde sagen du bist fillrate oder pixelshader oder texture limitiert.
Meine Grafikkarte ist die Nvidia Geforce 7500 LE (Ja ist echt untere klasse aber so schlecht dass sie das nicht packt? wie gesagt...oblivion und WoW laufen bei guter Auflösung und mittleren details auch flüssig...)
oblivion mit 60fps? ich glaube da kaempft die graka eher um ihre 30fps, oder?

aber ohne genau rauszufinden woran es liegt kann man nicht sinnvoll optimieren.
btw. http://developer.download.nvidia.com/presentations/2008/GDC/GDC_08_Perf_Tools.pdf
-
rapso schrieb:
ich glaube du hast einfach nur nicht die include pfade usw. gesetzt.
wobei bisher bei perfHUD nichts zum includen war, man musste nur d3d speziell initialisieren udn ueber perfhud starten. schau in die doku, es ist nicht viel arbeit.
Hab zwar schon mal reingeschaut und da steht direkt was von install only und dann die änderungen im code
tja, im wireframe fluessig, ohne wireframe faellt die fps, ich wuerde sagen du bist fillrate oder pixelshader oder texture limitiert.
das heißt? liegts nur an der Karte oder am code? bzw. wenn ich auf HW beschränkt bin kann ich doch ohnehin nicht viel tun oder?oblivion mit 60fps? ich glaube da kaempft die graka eher um ihre 30fps, oder?

"flüssig" also spielbar ohne dass es extrem ruckelt...;)
aber ohne genau rauszufinden woran es liegt kann man nicht sinnvoll optimieren.btw. http://developer.download.nvidia.com/presentations/2008/GDC/GDC_08_Perf_Tools.pdf
thx...werd mir mal alles ansehenDanke auf jeden fall für die viele Hilfe!