Warum hat mein Spiel nur 20 FPS?


  • Mod

    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.


  • Mod

    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.



  • volkard schrieb:

    Dann hätte ich mir echt einen Wolf gelesen.

    Hihi. 👍



  • dot schrieb:

    ka was du mir damit sagen willst. Ich glaub aber wir reden da grad aneinander vorbei...

    Hier bitte keine Diskussion übers einander vorbeireden ... 😃

    dot schrieb:

    Ok, dann war eben der OpenGL Pfad deiner Engine suboptimal implementiert...

    In Version 3.5? DirectX 8.1 hat nämlich immer noch besser funktioniert als OpenGL ... 😕



  • Der aus dem Westen ... schrieb:

    In Version 3.5? DirectX 8.1 hat nämlich immer noch besser funktioniert als OpenGL ... 😕

    Und? Das spricht noch weniger für die OpenGL Implementierung dieser Engine wenn sogar ein uralter Direct3D Pfad besser funktioniert als modernes OpenGL...



  • dot schrieb:

    Und? Das spricht noch weniger für die OpenGL Implementierung dieser Engine wenn sogar ein uralter Direct3D Pfad besser funktioniert als modernes OpenGL...

    Oder es spricht dafür, dass OpenGL ziemlich langsam ist, wobei ich OpenGL jetzt nicht unbedingt in anderen Implementierungen verwendet habe.



  • Der aus dem Westen ... schrieb:

    dot schrieb:

    Und? Das spricht noch weniger für die OpenGL Implementierung dieser Engine wenn sogar ein uralter Direct3D Pfad besser funktioniert als modernes OpenGL...

    Oder es spricht dafür, dass OpenGL ziemlich langsam ist, wobei ich OpenGL jetzt nicht unbedingt in anderen Implementierungen verwendet habe.

    Ich sag vielleicht mal dazu dass ich kein OpenGL Fanboy bin. Im Gegenteil, ich finde Direct3D ist OpenGL als API in jeder Hinsicht überlegen. Aber das ändert nichts dran dass das was du da sagst Schwachsinn ist. Nur weil jemand der keine Ahnung von OpenGL hat damit ein langsames Programm schreiben kann bedeutet das nicht dass OpenGL langsam ist. Tatsache ist dass du mit OpenGL gleich schnell sein kannst wie mit Direct3D. Und das wurde hier ja nicht nur von mir schon bestätigt. Ich frag mich ja wie genau du das eigentlich beurteilen kannst wenn du mit OpenGL offenbar nicht viel Erfahrung hat!?



  • dot schrieb:

    Ich sag vielleicht mal dazu dass ich kein OpenGL Fanboy bin. Im Gegenteil, ich finde Direct3D ist OpenGL als API in jeder Hinsicht überlegen. Aber das ändert nichts dran dass das was du da sagst Schwachsinn ist. Nur weil jemand der keine Ahnung von OpenGL hat damit ein langsames Programm schreiben kann bedeutet das nicht dass OpenGL langsam ist. Tatsache ist dass du mit OpenGL gleich schnell sein kannst wie mit Direct3D. Und das wurde hier ja nicht nur von mir schon bestätigt. Ich frag mich ja wie genau du das eigentlich beurteilen kannst wenn du mit OpenGL offenbar nicht viel Erfahrung hat!?

    Weil ich immer wieder Tests gemacht habe? Obwohl man, wenn man davon ausgeht, dass die Engine OpenGL nicht wirklich gut unterstützt, natürlich schon sagen kann, dass der Test ein bisschen einseitig ist.

    Allerdings lese mir mir gerade ein Buch zu OpenGL durch, und da sagt auch schon der Autor, dass mit OpenGL die Szene gerne langsamer wird. Was tun, was tun, was tun?



  • Der aus dem Westen ... schrieb:

    Weil ich immer wieder Tests gemacht habe?

    Also für mich klingt das eher so als hättest du da die Performance deiner Engine getestet und nicht das was mit OpenGL prinzipiell möglich ist...

    Der aus dem Westen ... schrieb:

    Allerdings lese mir mir gerade ein Buch zu OpenGL durch, und da sagt auch schon der Autor, dass mit OpenGL die Szene gerne langsamer wird. Was tun, was tun, was tun?

    Das spricht wohl nicht sehr für das Buch...



  • dot schrieb:

    Also für mich klingt das eher so als hättest du da die Performance deiner Engine getestet und nicht das was mit OpenGL prinzipiell möglich ist...

    Mit einigen Engines kannst du auswählen, welche Bibliothek verwendet werden soll, wie bei Irrlicht bspw. Das hat dann nichts mt der Engine, sondern mit der Schnittstelle zu tun, oder zumindest habe ich das bis heute gedacht ...



  • Wenn du Direct3D gegen OpenGL benchmarken willst musst du ein Programm schreiben dass beide APIs direkt verwendet und das jeweils möglichst optimal. Anders ist keine Aussage möglich.


Anmelden zum Antworten