Kamerarotation Interpolation - unterschiedliche Performance
Übersicht

funkmaster5000Betreff: Kamerarotation Interpolation - unterschiedliche Performance |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi Community,
ich arbeite schon längere Zeit an einem First Person Dungeon Crawler. Die Bewegung ist dementsprechend tilebasiert und die Zeit rundenbasiert. Gesteuert wird mit den Pfeiltasten und bei meinen ersten Versuchen wurde die Eingaben direkt umgesetzt, Rotationen wie auch Bewegungen (d.h. Spielerposition + Tilesize und Spielerrotation + 90 etc.). Das war zu aprubt und, obwohl die ganz alten Vertreter des Genres es so handhaben, zu verwirrend für den Spieler. Deswegen wollte ich die Bewegungen etwas dämpfen und zwar per Interpolation über einen Zeitwert. Beim Testen ist mir dann aufgefallen, dass bei manchen Runden die Bewegungen schön glatt ausgeführt werden und bei manchen ruckeln. Die FPS sind dabei konstant geblieben. Ich habe also alles, was eventuell doch auf die Performace gehen könnte (Level, Beleuchtung etc.) entfernt und nur einen Cube als Orientierung sowie meinen Code für die Bewegung und die Kamera im Spiel gelassen. Trotzdem sporadische Ruckler. Ich bewege den Spieler Sprite, die Kamera ist Child Objekt. Der Grund, warum es überhaupt noch einen Spieler Sprite gibt, ist die ursprüngliche 3rd Person Ansicht. Ich habe den Sprite auch schon ganz aus dem Code geschrieben, ohne Auswirkungen. Habt ihr eine Idee? Danke euch im Voraus! Code: [AUSKLAPPEN] Function MoveEast()
player.tplayer = First tplayer Local movement_complete = 0 Local maxtime# = MilliSecs() Local actualtime# Local passedtime# Local passedsecs# Local startpos% = player\x Local maxpos% = startpos + 2 Local distance% = maxpos - startpos Local eventduration# = 0.4 Local movement# While movement_complete = 0 actualtime = MilliSecs() passedtime = actualtime - maxtime passedsecs = passedtime / 1000 movement = (passedsecs / eventduration) * distance + startpos If movement >= maxpos Then movement = maxpos PositionEntity player\sprite,movement,EntityY(player\sprite),EntityZ(player\sprite) If movement >= maxpos Then movement_complete = 1 End If UpdateWorld RenderWorld Flip Wend player\x = EntityX(player\sprite) End Function Sicher könnte ich eventduration halbieren, dann fällt die "ruckelige" Bewegung nicht mehr so auf. Aber 0,4 ist ein perfekter Wert. Geprüft, dass die entsprechenden Variabeln auch Floats sind, habe ich soweit auch. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du schon mal die Werte von movement und EntityX geloggt und in einem Diagramm dargestellt? Wenn es Unregelmäßigkeiten gibt, läuft was mit der Berechnung schief, ansonsten liegt es allein an der Darstellung.
Mir ist nicht klar, warum du die verstrichene Zeit in Sekunden umrechnest - das wird höchstens ungenauer. An der Stelle würde ich unbedingt ein float a la 1000.0 benutzen, um BB keine Gelegenheit zu geben, was falsch zu machen. Das Rendering in jeder einzelnen Bewegungsfunktion nochmal zu machen, halte ich auch für suboptimal. Du benutzt einen type für den Spieler - da kannst du alle Informationen unter bringen, ohne den Code für eine optische Spielerei verdoppeln zu müssen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
vorallem macht man keine zweite RenderLoop in eine Funktion.. es ist zwar einfach aber doch sehr dirty ![]() |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heute ist die Bewegung wieder extrem ruckelig, deswegen habe ich die Daten geloggt und mit einem Tag, an dem es weich lief verglichen. Es hat sich herausgestellt, dass nur ca. halb so viele Zwischenwerte erzeugt werden. Den Rat von Xeres habe ich befolgt und die MilliSecs nicht mehr in Sekunden umgerechnet. Sonst ist es der gleiche Code. An einem Tag performant, am nächsten Tag lahm. Das ist doch verrückt!
In absehbarer Zeit versuche ich auch das RenderWorld aus den Functions zu nehmen. Vorher möchte ich aber dieses Problem lösen. |
||
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
mach mal flip(0), das deaktiviert den V-Sync und erstelle deine Messreihe erneut. | ||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Leider immernoch hakelig.
|
||
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wow okay, das ist krass. Vielleicht mal auf einer anderen Hardware ausführen. Vielleicht blockiert ein komischer Prozess im Hintergrund ? | ||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schlimmstenfalls muss ich eine Tabelle mit Werten anlegen und lasse die Bewegungen nicht mehr mit der Formel errechnen. Das wäre aber äußerst unflexibel. Alle 16ms muss die Position mit der Position aus meiner Tabelle upgedatet werden. Werde das mal versuchen und berichten.
Wegen anderem System: also an der Darstellung kann es nicht liegen, habe wie gesagt Wände und Boden schon rausgenommen und nur einen einzigen Würfel zur Orientierung drin gelassen. Selbst wenn ein Prozess stört, sollte der Rechner das doch gebacken bekommen, oder? |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da muss irgendwas mit deinem Code nicht stimmen. Hab grad ned die Zeit den durchzuchecken, aber sowas kommt üblicherweise von schlechtem Code. Kann mir nicht vorstellen, dass so große Unterschiede konsistent auf verschiedener Hardware solche unterschiedlichen Ergebnisse liefert. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
*Gnihihi* Die Performance bricht sicher immer Mittwochs ein wenn Windows seine neuen Schadpake... äh.. updates saugt.
*scnr* ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
pöser mod ![]() Läuft das Spiel im Fenstermodus oder Vollbild? Unter DX7 in Vollbild hab ich solche Probleme schon öfter mal "gefühlt" auf heutigen Grafikkarten. |
||
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Spiel läuft im Vollbildmodus. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group