Kamerarotation Interpolation - unterschiedliche Performance

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

funkmaster5000

Betreff: Kamerarotation Interpolation - unterschiedliche Performance

BeitragMi, Nov 19, 2014 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragMi, Nov 19, 2014 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

TimBo

BeitragDo, Nov 20, 2014 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
vorallem macht man keine zweite RenderLoop in eine Funktion.. es ist zwar einfach aber doch sehr dirty Wink
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

BeitragDi, Nov 25, 2014 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

user posted image

In absehbarer Zeit versuche ich auch das RenderWorld aus den Functions zu nehmen. Vorher möchte ich aber dieses Problem lösen.

TimBo

BeitragDi, Nov 25, 2014 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 25, 2014 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider immernoch hakelig.

user posted image

TimBo

BeitragDi, Nov 25, 2014 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 25, 2014 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 26, 2014 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragMi, Nov 26, 2014 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
*Gnihihi* Die Performance bricht sicher immer Mittwochs ein wenn Windows seine neuen Schadpake... äh.. updates saugt.

*scnr*

Wink
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

BeitragDo, Nov 27, 2014 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
pöser mod Razz

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

BeitragDo, Dez 04, 2014 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Spiel läuft im Vollbildmodus.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group