OpenGL - "ultra-smooth" - animation von einfachen horizontal bewegendes Objekt
Ich will einfach nur eine einfache animation (zum Beispiel in C++ mit OpenGL) einige sich bewegende Objekt - sagen wir mal einfache horizontale Bewegung von einem Platz, von Links nach rechts.
In OpenGL, die ich nutzen kann "double-buffering" Methode und lassen Sie uns sagen, ein Benutzer (läuft meine Anwendung mit der animation) haben sich "vertikale sync" auf - ich nenne einige-Funktion jedes mal, wenn ein monitor aktualisiert sich selbst (kann ich erreichen, dass zum Beispiel unter Verwendung von Qt-toolkit und seine Funktion "swapBuffers").
So, ich denke, die "weichsten" - animation, die ich erreichen kann, ist, "das Quadrat von beispielsweise 1 pixel (können auch andere Werte) zu jeder Zeit überwachen erfrischt", also bei jedem "frame" den Platz von 1 pixel weiter - "HABE ich GETESTET, UND ES hat wahrlich FUNKTIONIERT REIBUNGSLOS".
Aber das problem entsteht, wenn ich will "eigene" - thread für das "Spiel der Logik" (verschieben des Quadrats um 1 pixel nach rechts) und für "animation" (Anzeige der aktuellen position des Quadrats auf dem Bildschirm). Weil sagen wir mal die Spiel-Logik-thread ist eine while-Schleife, wo ich den Platz von 1 pixel und dann "schläft" der thread für einige Zeit, beispielsweise 10 Millisekunden, und mein monitor aktualisiert, beispielsweise alle 16 Millisekunden die Bewegung des Platzes "nicht 100% glatt", weil manchmal der monitor-refresh-zwei Zeiten, in denen das Quadrat verschiebt sich nur um 1 pixel und nicht um 2 Pixel (weil es zwei "verschiedene" Frequenzen der monitor-und Spiel-Logik-thread) - und die Bewegung Aussehen wird "etwas Ruckeln".
Also, logisch, ich könnte bleiben mit dem ersten super-glatt-Methode, aber es kann nicht verwendet werden, zum Beispiel "multiplayer" (z.B. "server-client") - Spiele - weil verschiedene Computer haben unterschiedliche Frequenzen des Monitors (so sollte ich verwenden verschiedene threads für die Spiellogik (auf dem server) und für die animation (auf den clients) ).
Also meine Frage ist:
Gibt es irgendeine Methode, mit den verschiedenen threads für die Spiellogik und animation, die tun was "100% glatt" animation einige bewegende Objekt, und wenn etwas vorhanden ist, bitte beschreiben Sie hier, oder wenn ich hatte nur ein paar "komplexere Szene zu Rendern", nur ich würde nicht sehen, dass "kleine, ruckartige Bewegung", die sehe ich jetzt, wenn ich mich bewege, einige einfache quadratische horizontal, und ich tief konzentrieren sich auf es 🙂 ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, das ist eigentlich typisch separate Spiel-loop-Verhalten. Verwalten Sie alles, was Sie Physik (Bewegungs -) Aktionen in einem thread, so dass der render-thread seine Arbeit zu tun. Dies ist eigentlich wünschenswert.
Vergessen Sie nicht, dieses Art der Implementierung der game-loop ist maximal verfügbare Bildrate, während die Erhaltung konstanter Physik Geschwindigkeit. Bei höheren FPS, Sie können nicht sehen, diesen Effekt durch eine chance, wenn es nicht irgendwelche anderen code problem. Einige Haken zwischen framerate und Physik zum Beispiel.
Wenn Sie erreichen wollen, was Sie beschreiben, als perfekte Glätte, Sie könnten synchronisieren Sie Ihre Physik-engine mit VSync. Machen Sie einfach alle Ihre Physik VOR dem aktualisieren kommt, als darauf zu warten, für einen anderen.
Aber das alles gilt für Konstante Geschwindigkeit der Objekte. Sie haben ein Objekt mit dynamischer Geschwindigkeit, man kann nie wissen, Wann zu ziehen, um "in sync". Dasselbe problem entsteht, dann wollen Sie mehrere Objekt mit verschiedenen Konstanten Geschwindigkeiten.
Dies ist auch NICHT das, was Sie wollen, in komplexen Szenen. Die ganze Idee von V-sync limit screen tearing-Effekt. Sollten Sie auf jeden Fall NICHT hook Ihr Physik-oder rendering-code zum display-refresh-rate. Sie wollen, dass Sie Physik-code ausgeführt werden, unabhängig von Benutzer display-refresh-rate. Dies könnte ECHTE Schmerzen in multiplayer-spielen zum Beispiel. Für den Anfang, Blick auf diese Seite: Wie Ein Spiel Die Schleife Funktioniert
BEARBEITEN:
Ich sagen, dass Ihre vision von der perfekten Glätte, ist unrealistisch. Sie können die Maske mit Techniken Kevin schrieb. Aber Sie wird immer kämpfen, mit HW Grenzen, wenn die refresh-rate, oder die Anzeige pixelation. Zum Beispiel, Sie haben die Fenster von 640x480 px. Jetzt wollen Sie, dass Ihr Objekt horizontal zu bewegen. Sie können bewegen Sie Ihr Objekt durch einen Vektor in Richtung der rechten unteren Ecke, ABER Sie müssen das Inkrement Objekt-Koordinaten von float-Zahl (640/480). Aber beim Rendern, Sie gehen zu zahlen. So Ihr Objekt bewegt sich zackig. Kein Weg, um dieses. In der kleinen Geschwindigkeit, können Sie es bemerken. Sie können verwischen, oder um es schneller zu bewegen, aber nie loswerden...
Ermöglichen, Ihre Objekt - verschieben von Bruchteilen eines pixels. In OpenGL ist, kann dies für dein Beispiel ein Quadrat durch einzeichnen der Platz auf einer textur (also ein ein-pixel oder größer-Grenze), sondern lassen Sie es werden nur die polygon-Kante. Wenn Sie das Rendern von 2D-sprite-Grafik, dann bekommen Sie diese ziemlich viel automatisch (aber wenn man 1:1 pixel-Kunst wird es unscharf/scharf/unscharf, während er über die pixel-Grenzen).
Glätten (Antialiasing) die polygon-Kante (GL_POLYGON_SMOOTH). Das problem bei dieser Technik ist, dass es nicht funktioniert mit Z-buffer-basierte rendering, da es bewirkt, dass Transparenz, aber wenn Sie tun, eine 2D-Szene ist, können Sie stellen Sie sicher, dass Sie immer draw-back-to-front.
Aktivieren Sie multisample/supersample-antialiasing, das teurer ist, aber nicht das oben genannte problem.
Stellen Sie Ihr Objekt auf eine ausreichend animiert Aussehen, dass die pixel-Verschiebungen sind nicht leicht zu bemerken, weil dort ist viel mehr Los am Rand (d.h. er wird sich bewegen auf viel mehr als 1 pixel/frame).
Machen Sie Ihr Spiel ausreichend Komplex und fesselnd, dass die Spieler abgelenkt sind, aus der Betrachtung der Pixel. 🙂