OpenGL gegen Physik?

8

Ich bin sehr neu in der Spielprogrammierung und ich bin in meinem ersten Projekt. Ich bin zu einem Punkt gekommen, an dem ich kompetenten Rat brauche:

Damit die Spielphysik nun an Objekten arbeiten kann, muss sie die Position jedes Objekts und seine Ausrichtung im 3D-Raum kennen. Im Rahmen der Simulation und aufgrund von Objekten bewegt sich (Positionsänderung) und ändert die Ausrichtung (Drehung).

Bedeutet dies, dass Rotations- und Translationsberechnung zweimal durchgeführt werden? Eine in der Physik und die andere erfolgt mit glTranslate und glRotate, bevor das Objekt gezeichnet wird?

IMO sollte dies nicht passieren. Auch die Berechnung von Translation und Rotation im Teil Physik führt dazu, dass sie die CPU anstelle der GPU verwenden, was sich auf die Leistung auswirkt.

Wie machen Experten das und welche Ratschläge geben Sie zur effizienten Spielarchitektur, um mit solchen Situationen umzugehen?

M.Sameer
quelle

Antworten:

17

Es gibt eine Reihe von Gründen, warum Rendering- und Physik-Pipelines traditionell diskret gehalten wurden. Denken Sie beim Auflisten daran, dass es nicht nur um Spiele geht. Ihre Frage betrifft jede Anwendung, die eine 3D-Rendering-Technologie wie OpenGL verwendet, deren Konkurrenten oder Vorläufer.

  • Nicht jede Anwendung, die 3D verwendet, benötigt Physik. Denken Sie daran, dass OpenGL nicht nur für Spiele entwickelt wurde, sondern auch medizinische Simulationen über die Modellierung von Verkaufsstatistiken, Flugsimulationen bis hin zu komplexen chemischen Reaktionen usw. umfasst.
  • Jedes System, das zu vielen Zwecken dient, wird hinsichtlich der Effizienz verwässert. Eine grafische Pipeline muss unglaublich schnell sein. Sobald Sie Punkte einführen, an denen diese Pipeline mit anderen Subsystemen wie dem Hauptsystemspeicher (in dem sich Ihr Code befindet) verbunden werden muss, wird die Effizienz um Größenordnungen verringert. Die Hardware auf Ihrer Grafikkarte ist sehr speziell eingegrenzt und für das Verschieben von Pixeln äußerst optimiert , zu hohen Kosten und langjähriger, wettbewerbsintensiver Forschung.

  • Die Art der Mathematik und Datenstrukturen, die physikalische Operationen umgeben (insbesondere Kollisionserkennung und -auflösung, ohne die es wirklich keine Physik gibt ), unterscheidet sich stark von der für das Rendern erforderlichen Mathematik.

  • Es gibt Lösungen, die sich mit Physik in Hardware befassen. Aber im Gegensatz zu der Art und Weise, wie wir rendern, unterscheidet sich die Art und Weise, wie wir Physik in einer bestimmten Situation ausführen, stark. Der grundlegendste Hinweis darauf ist, dass die Newtonsche Physik nicht für alle geeignet ist. Es gibt andere Möglichkeiten, die Physik mathematisch zu modellieren, die in anderen Situationen besser geeignet sind, beispielsweise in der Hamilton-Mechanik. Insbesondere in Spielen kann jedes einzelne Spiel seine Physik anders modellieren, sei es in 2D oder 3D. Diese müssen nicht einmal die reale Physik widerspiegeln! - weil ein Spiel ein Produkt der Fantasie ist. Mit anderen Worten, die Physik ist letztendlich Teil Ihrer Spieldynamik, und das kann sich von Spiel zu Spiel ändern - geschweige denn von allen anderen Lösungen, auf die Technologien wie OpenGL angewendet werden.
  • Eine genaue Simulation der Physik auf Scheitelpunkt-für-Scheitelpunkt-Ebene ist derzeit größtenteils keine praktikable Option. Angesichts der hohen Polyanzahl von Modellen in den meisten Spielen und der inhärenten Schwierigkeit der Kollisionserkennung mit konkaven Polyedern ist es nicht so einfach, nur die Physik anhand des bereitgestellten Modells zu berechnen. Bei vielen, wenn nicht den meisten 3D-Spielen werden Begrenzungsvolumina in Form von Zylindern oder Kästen verwendet, um die Kollisionserkennung zu vereinfachen, wobei diese Art der Kollisionserkennung sogar erforderlich ist. Angesichts der aktuellen Technologie würde der Verarbeitungsgrad nicht viel Platz für den Rest Ihrer Spielelogik lassen. Sogar Nvidias PhysX erfordert, dass komplexe, konkave Polyeder für die Physiksimulation in einfachere konvexe Polyeder zerlegt werden.

  • Ihre Grafikkarte erzeugt mit den durchgeführten Transformationen eine Perspektive . Das unterscheidet sich von den in der Physik durchgeführten Transformationen, die nichts mit der Perspektive als solcher zu tun haben - es werden lediglich grundlegende Positionen und Orientierungen in Ihrer Welt berechnet. Wenn Sie sich über MVC wissen, werden Sie verstehen, dass es zwischen den Daten , die Sie in Ihrer Anwendung zu halten, und wie Ihr einen deutlichen Unterschied ist vorhanden , dass die Daten.

Die Computertechnologiebranche wird von den Bedürfnissen bestimmt, und während Visualisierung ein nahezu universelles Bedürfnis ist, sind physikalische Simulationen weder als Anforderung noch in Bezug auf ihre jeweiligen Implementierungen universell.

Mein Rat ist also, hör auf, dir Sorgen um den Strich zu machen, und konzentriere dich darauf, wie du die beiden Dinge machst, die du tun musst: Rendering und Physik. Sie werden nicht an die Daten in der Verarbeitungspipeline Ihrer Grafikkarte gelangen (CUDA / OpenCl sind Ausnahmen): Wenn Sie Dreiecke und Materialdaten eingeben, wird Ihre 3D-Welt als Bewegtbild herausgepumpt.


Abgesehen davon ist Ihre Frage nicht ohne Sinn. Der Wunsch nach einer kombinierten Basis für Physik und Rendering und die Tatsache, dass Gleitkomma-Mathematik viel langsamer als Fixpunkt sein kann, zeigt uns, warum Voxel-Technologien ein enormes Wiederaufleben des Interesses erleben: Sie vereinfachen die ganze Welt bis hin zur Gitterpositionierung , achsenausgerichtete konvexe Polyeder. Dies verbessert die Leistung erheblich, indem die für physikalische Operationen erforderliche Menge an Gleitkomma-Vektor-Mathematik reduziert wird, da Sie jetzt hauptsächlich in einem räumlich unterteilbaren, instanziierbaren, ganzzahlig indizierten Raster arbeiten. Das gleiche Raster kann sowohl für das Rendern als auch für die Physik verwendet werden, insbesondere da Sie für diese beiden unterschiedlichen Subsysteme unterschiedliche Rasterauflösungen verwenden können (wenn Sie eine Octree-basierte Lösung wie SVOs verwenden).

Nick Wiggill
quelle
3
Der fünfte Aufzählungspunkt muss stärker hervorgehoben werden: Sie verwenden normalerweise eine Kollisionsgeometrie, die von der visuellen Geometrie getrennt ist.
jhocking
Ihre Antwort ist sehr aufschlussreich. Vielen Dank. Ich habe darüber nachgedacht, OpenCL für Physikcode zu verwenden. Dies führt dazu, dass Matrixoperationen der Transformation, von denen ich gesprochen habe, auf der GPU ausgeführt werden und eine gewisse Leistungssteigerung bewirken sollten. Was denkst du, ist das eine gute Idee?
M.Sameer
3
Es ist ein Vergnügen. "Wir sollten kleine Wirkungsgrade vergessen, etwa in 97% der Fälle: Vorzeitige Optimierung ist die Wurzel allen Übels" - Donald Knuth. Konzentrieren Sie sich auf Ihre Logik und optimieren Sie nach Bedarf. Sie sind viel zu besorgt über die Leistung in einem sehr frühen Stadium der Entwicklung Ihres Spiels. Es ist sehr einfach, die Verarbeitung zwischen CPU und GPU wie bei CUDA / OpenCL zu verlangsamen. Google "CUDA langsam", finden Sie viele Ergebnisse. Was Sie an die GPU senden, muss sehr sorgfältig gestapelt werden. Erwarten Sie nicht, alle paar Millisekunden usw. zu schreiben.
Ingenieur