Warum hat mein Spiel nur 20 FPS?
-
Hallo.
Ich mache gerade ein Spiel, dass so ähnlich wie Minecraft ist ( in einer
3D Welt herum laufen und mit Blöcken etwas bauen können ).
Leider habe ich da ein Problem mit den Bildern / Sekunde.Mein Programm zeichnet 180 000 solche Blöcke wie bei Minecraft, und braucht
dafür eine Ewigkeit. Ich wollte gerne wissen, wie es in Minecraft bei über
100mal sovielen Blöcken zu 100 fps kommt?Das Spiel habe ich mit openGL und C++ programmiert.
Ich hoffe ihr könnt mir da weiter helfen!
Lg
SFandler
-
Wahrscheinlich weil Minecraft in Java geschrieben ist.
Mein Programm zeichnet 180 000 solche Blöcke wie bei Minecraft, und braucht
dafür eine Ewigkeit.Du machst aber schon Sichtbarkeitstests, oder?
Auch in Minecraft sind keine 180000 Blöcke gleichzeitig zu sehen.
-
SFandler schrieb:
Mein Programm zeichnet 180 000 solche Blöcke wie bei Minecraft, und braucht dafür eine Ewigkeit.
Und wie genau macht dein Programm das?
-
OpenGL? Solltest du nicht DirectX verwenden, wenn du auf Geschwindigkeit stehst?
Verwendest du direkt eine Engine? Da ist nämlich einiges optimiert.
Und schließlich: zeichnest du jedes Mal eine neue Szene, oder bloß die Änderungen?
-
Der aus dem Westen ... schrieb:
OpenGL? Solltest du nicht DirectX verwenden, wenn du auf Geschwindigkeit stehst?
Zwischen Direct3D und OpenGL gibt es rein prinzipiell keinen wirklichen Geschwindigkeitsunterschied.
Der aus dem Westen ... schrieb:
Und schließlich: zeichnest du jedes Mal eine neue Szene, oder bloß die Änderungen?
Normalerweise zeichnet man in jedem Frame alles neu...
-
dot schrieb:
Zwischen Direct3D und OpenGL gibt es rein prinzipiell keinen wirklichen Geschwindigkeitsunterschied.
Tatsächlich. Ich habe mal eine recht aufwendige Szene gezeichnet, einmal mit DirectX, einmal mit OpenGL 3.5. Mit DirectX: 30 Prozent Auslastung und 150 FPS, mit OpenGL 50 Prozent und 100 FPS. Graka von nVidia und Prozessor von AMD, DualCore.
Meine Erfahrung: bleib, wenn's dir um Geschwindigkeit geht, bei DirectX.
dot schrieb:
Normalerweise zeichnet mal in jedem Frame alles neu...
Ich versuche das eigentlich zu vermeiden. Bedeutet mehr Code, nutzt Graka und Prozessor aber besser aus.
-
dot schrieb:
Der aus dem Westen ... schrieb:
Und schließlich: zeichnest du jedes Mal eine neue Szene, oder bloß die Änderungen?
Normalerweise zeichnet mal in jedem Frame alles neu...
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
-
volkard schrieb:
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
Naja, man müsste mal genauer definieren was man eigentlich mit "zeichnen" und "alles" meint und so. Aber wenn er damit sowas meint wie man es früher mit 2D-Sprites gemacht hat, wo man praktisch nur das Sprite an seiner alten Position erst gelöscht und dann an die neue Position gezeichnet und möglichst viel vom Bild in Takt gelassen hat, dann wird das mit 3D-Grafik nicht nur wahnsinnig kompliziert umzusetzen sondern auch wahnsinnig ineffizient sein...
-
volkard schrieb:
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
Es bedeutet ganz schön viele Abfragen für jedes in der Szenerie eingetragenes Objekt, ob sich was geändert hat, aber bei gut 100 Abfragen pro Sekunde rentiert sich das schon. Und du brauchst richtig tiefen Zugriff ...
Na ja, gut, für gewöhnlich lässt man wirklich die ganze Szene neu zeichen, anstatt die Abfrage durchzuführen. Man muss schon recht masochistisch rein, aber ich bin nun mal pedantant.
-
Der aus dem Westen ... schrieb:
Tatsächlich. Ich habe mal eine recht aufwendige Szene gezeichnet, einmal mit DirectX, einmal mit OpenGL 3.5. Mit DirectX: 30 Prozent Auslastung und 150 FPS, mit OpenGL 50 Prozent und 100 FPS. Graka von nVidia und Prozessor von AMD, DualCore.
Wenn du das nicht grad auf einer Intel-Karte getestet hast, die für ihre extrem schlechten OpenGL Treiber berüchtigt sind, dann würd ich mal sagen dass du da was falsch gemacht hast.
Der aus dem Westen ... schrieb:
dot schrieb:
Normalerweise zeichnet mal in jedem Frame alles neu...
Ich versuche das eigentlich zu vermeiden. Bedeutet mehr Code, nutzt Graka und Prozessor aber besser aus.
Interessant, wie genau gehst du da vor?
-
Der aus dem Westen ... schrieb:
dot schrieb:
Zwischen Direct3D und OpenGL gibt es rein prinzipiell keinen wirklichen Geschwindigkeitsunterschied.
Tatsächlich. Ich habe mal eine recht aufwendige Szene gezeichnet, einmal mit DirectX, einmal mit OpenGL 3.5. Mit DirectX: 30 Prozent Auslastung und 150 FPS, mit OpenGL 50 Prozent und 100 FPS. Graka von nVidia und Prozessor von AMD, DualCore.
klingt als wuerdest du unter opengl etwas suboptimal machen, kann passieren.
beides sollte heutzutage garkeinen unterschied machen, meine engine laeuft auf d3d9,d3d11 und ogl und schaft in graphik limitierten faellen die gleiche fps.frueher war normalerweise opengl schneller, weil es weniger overhead bei funktionsaufrufen hatte, jedoch ist das heute marginal.
Meine Erfahrung: bleib, wenn's dir um Geschwindigkeit geht, bei DirectX.
meine erfahrung: es liegt meist am programmierer, nicht an den tools. (minecraft ist uebrigens auch opengl + java).
volkard schrieb:
dot schrieb:
Der aus dem Westen ... schrieb:
Und schließlich: zeichnest du jedes Mal eine neue Szene, oder bloß die Änderungen?
Normalerweise zeichnet mal in jedem Frame alles neu...
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
du renderst statische dinge in einen buffer und kopierst den jedes frame ueber den aktuellen und zeichnest dann dynamische dinge drueber.
die bekannteste methode nennt sich "imposter rendering" siehe z.B.http://www.gamasutra.com/view/feature/2501/dynamic_2d_imposters_a_simple_.php?page=2
-
Ich meinte, kann ich Objekte in der Grafikkarte parken? Ganze Raumschiffe zum Beispiel? Die über Frames überleben? Das widerspräche meinen bescheidenen Ausflügen in die 3D-Welt. Dann hätte ich mir echt einen Wolf gelesen.
Daß ich im Anwendungscode Koordinatenfolgen und ganze Modelle parken kann, ist klar, und auf Abruf so effizient wie möglich an die Graka werfen.
-
dot schrieb:
Wenn du das nicht grad auf einer Intel-Karte getestet hast, die für ihre extrem schlechten OpenGL Treiber berüchtigt sind, dann würd ich mal sagen dass du da was falsch gemacht hast.
nVidia, und nicht ich, sondern wohl die Engine ...
und dabei wird hier jedes Mal die Szenerie neu gezeichnet.
dot schrieb:
Interessant, und wie genau gehst du da vor?
Siehe rapso. Eine andere Methode ist, Pixel für Pixel neu zeichnen zu lassen, indem man die vorhanden mit den 'Soll'-Pixeln abgleicht - die Engine, die ich verwende, erlaubt mir, ein Bild zu erstellen, ohne dies zeichnen zu lassen.
-
volkard schrieb:
Ich meinte, kann ich Objekte in der Grafikkarte parken?
Ja. Imposter sind auch eine Möglichkeit komplette gerenderte Bilder in der Graka zu parken. Ich bezog mich auf die Idee dass man möglichst viel des kompletten Framebuffer intakt hält. Das wäre absolut inpraktikabel und ineffizient.
volkard schrieb:
Ganze Raumschiffe zum Beispiel? Die über Frames überleben? Das widerspräche meinen bescheidenen Ausflügen in die 3D-Welt. Dann hätte ich mir echt einen Wolf gelesen.
Hängt davon ab was genau du damit meinst. Niemand der Performance will wird heutzutage mit glBegin()/glEnd() und so ankommen und alles in jedem Frame wieder und wieder über den Bus schicken. Wenn du Performance willst dann packst du deinen Kram natürlich in den VRAM.
-
volkard schrieb:
Ich meinte, kann ich Objekte in der Grafikkarte parken? Ganze Raumschiffe zum Beispiel? Die über Frames überleben?
ich wueste nicht weshalb das nicht gehen sollte, wenn man das will.
volkard schrieb:
Das widerspräche meinen bescheidenen Ausflügen in die 3D-Welt. Dann hätte ich mir echt einen Wolf gelesen.
du musst schon genauer sagen was dich das denken laesst
Daß ich im Anwendungscode Koordinatenfolgen und ganze Modelle parken kann, ist klar, und auf Abruf so effizient wie möglich an die Graka werfen.
oder wenn sich nichts aendert, kannst du nichts tun und das bild bleibt gleich, ich denke das ist auch klar und wuerde doch genau den fall von "Der aus dem Westen ..."s beschreibung haben.
-
Der aus dem Westen ... schrieb:
Siehe rapso.
Imposter haben aber nix damit zu tun dass der Framebuffer intakt bleibt.
Der aus dem Westen ... schrieb:
Eine andere Methode ist, Pixel für Pixel neu zeichnen zu lassen, indem man die vorhanden mit den 'Soll'-Pixeln abgleicht - die Engine, die ich verwende, erlaubt mir, ein Bild zu erstellen, ohne dies zeichnen zu lassen.
ka was du mir damit sagen willst. Ich glaub aber wir reden da grad aneinander vorbei...
Der aus dem Westen ... schrieb:
nVidia, und nicht ich, sondern wohl die Engine ...
und dabei wird hier jedes Mal die Szenerie neu gezeichnet.
Ok, dann war eben der OpenGL Pfad deiner Engine suboptimal implementiert...
-
volkard schrieb:
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
Nur unter der Bedingung, dass der Blickwinkel sich nicht ändert. Und selbst dnan darfst du dich mit tollen Sichtbarkeitstests (Pixelgenau!) rumplagen. Besonders lustig ist das nicht.
-
otze schrieb:
volkard schrieb:
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
Nur unter der Bedingung, dass der Blickwinkel sich nicht ändert. Und selbst dnan darfst du dich mit tollen Sichtbarkeitstests (Pixelgenau!) rumplagen. Besonders lustig ist das nicht.
Natürlich meinte ich heftige Blickwinkeländerungen. Sonst bräuchte ich die 3D-Grafikkarte nicht. Ich mache mich schlau. Momentchen.... In 14 Tagen oder so werde ich einigermaßen stabil. Bis dahin halte ich erstmal die Klappe.
-
volkard schrieb:
Geht es anders? Ich würde gerne sauviele Objekte liegenlassen und nur ein paar ändern zwischen den Frames.
Wichtiger ist erstmal vorher grob Objekte die nicht sichtbar sein können ausschließen. Für 90% alle Fälle reicht das schon. Was man eher evtl. noch machen wird ist Objekte in einem Frame "liegenlassen", z.B. wenn man die mehrmals rendern möchte. D3D10 Hardware bietet da entsprechende Möglichkeiten.
-
Zu OPs Problem: Mehr Informationen. Und profile Mal vernünftig über alles. Sichtbarkeitsprüfungen sind sicherlich sehr wichtig, gerade wenn Du was mit Shadern machst (aber wenn Du versuchst Minecraft nachzumachen, wird die Grafik wohl ebenso ... hübsch sein).
Vielleicht hast Du auch enormen Overhead bei den Container-Zugriffen oder so, man kann ja einiges falsch machen. Letztendlich: Hast Du dein Programm im Debug oder Release laufen? Falls ja, mach es Mal andersrum und schau, ob sich was ändert. Das könnte ebenfalls ein wenig herauskristallisieren, wo dein Performanceloser ist.