Du bist nicht angemeldet.

Werbeanzeige

1

11.01.2019, 21:07

Kapitel 12 beim Debuggen flüssig beim Release laggig

Und da habe ich leider schon das nächste Problem, was ich absolut nicht verstehe.
Es geht wie im Kapitel beschrieben um das 12. Kapitel des Buches "C++ für Spieleprogrammierer" beim auführen des "Debug"-, bzw. der "Release"-Funktion.
Es läuft komischerweise bei der "Release"-Funktion nicht flüssig, die Zeit zwischen den frames ist nicht immer annähernd gleichbleiben, wodurch natürlich eine laggende Bildschirmausgabe die Folge ist. Anstatt das die Asteroiden/ Schüsse/ der Spieler flüssig über den bildschirm gleiten, springen sie dahin, wie sie hin sollen. Es wird also alles richtig berechnet, durch die größere Zeit beim erstellen des frames, ist der Abstand auch größer, wo sie wieder gerendert werden. Zumindestens wenn ich das bis dahin soweit alles richtig mitbekommen und verstanden habe.
Wäre die Zeit der erstellten frames kürzer, wäre eine demendsprechende flüssigere bewegung möglich.

Das aber alles richtig funktionieren müsste, zeigt der "Debugger". Wenn ich diesen ausführe, läuft das Spiel aus dem besagten Kapitel flüssig, die Zeit für ein neues Frame ist gering, wodurch die gerenderten Bilder, bzw. die Bewegungen der Objekte flüssig erscheinen.

Die frage die sich mir jetzt stellt, warum ist das so und kann man das irgendwie "beheben"? Weil letztendlich würde man dem Kunden/ den Freunde/ oder wem auch immer, ja die "Release"-Fassung geben und nicht die "Debug"-Fassung.

Die CPU ist ungefähr bei beiden gleich niedrig, schwank ja eh immer etwas hin und her. Und der Prozessspeicher liegt beim "Debug" bei 31 MB und beim "Release" bei 30 MB.
Was beim "Debug" ja daran liegt, das er im Hintergrund noch etwas arbeitet und sich die Arbeitsschritte merkt (oder so), soweit ich weiß.

(Code für dieses Spiel in Kapitel 12 SDL_Game wird mit SDL programmiert)

Falss es da überhaupt eine Lösung gibt, schonmal danke und wenn nicht, trotzdem danke :D

2

12.01.2019, 10:27

Hast du für die Release-Version auch die richtigen Header und Libraries verwendet/gelinkt?
Also für gewöhnlich das Gedöns ohne "D" im Dateinamen?
Desweiteren gibt es in den Projekteinstellungen auch noch Möglichkeiten die Debuginfos einzugrenzen.
fka tm

birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

12.01.2019, 21:49

Was beim "Debug" ja daran liegt, das er im Hintergrund noch etwas arbeitet und sich die Arbeitsschritte merkt (oder so), soweit ich weiß.


Naja der Debugger wird schon Ressourcen verbrauchen, aber das ist nicht das eigentliche Problem. Du kannst ja schließlich auch ein Debug-Build ausführen ohne einen Debugger anzuhängen, genauso wie du ein Release-Build debuggen kannst (was aber dann nicht so gut funktionieren wird). Der Debug-Build enthält einfach viele Debug-Symbole, die der Debugger braucht damit er funktioniert. Außerdem finden bei einem Debug-Build keine Optimierungen statt, die der Compiler sonst ausführen kann.
Zum Beispiel kürzt er ungenutzte Variablen weg, oder ersetzt gewisse Konstrukte mit anderen, die schneller sind, wenn er beweisen kann, dass dann die gleiche Funktionalität entsteht. Deshalb macht es dann auch wenig Sinn auf einem Release-Build einen Debugger zu starten, da der Code in deinem Editor nicht mehr exakt mit dem übereinstimmt was ausgeführt wird.

David Scherfgen

Administrator

Beiträge: 10 198

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

12.01.2019, 22:05

Vielleicht läuft der Release-Build so schnell, dass die Zeitmessung nicht richtig funktioniert und es deshalb ruckelt? Hast du mal V-Sync eingeschaltet?

5

13.01.2019, 19:36

Schonmal danke für die Antworten^^
Ich hab zwischendurch einfach schonmal mit dem Spielebeispiel herumexperimentiert und das Fenster generell höher eingestellt (1920/ 1080), das Bild in die Mitte geschoben und die Asteroiden und den Spieler demendsprechend angepasst. Eine Lebensanzeige (Grüner Balken, der immer kleiner wird :D) habe ich auch mit eingebaut. Und als nächstes soll noch eine Anzeige für die Punkte kommen, auch wenn ich noch keine Ahnung habe, wie ich das so richtig hinbekommen soll. Weiß noch nicht, wie man einfach irgendwas auf dem Bildschirm anzeigen lassen kann (Variblen / Werte), bzw. wie ich die Zahlen dann als Bilder rauf bekomme, das sie dann auch richtig angezeigt werden. Spricht, Abfrage der Zahl und dann ein Bild für die erste Stelle, ein Bild für die 2. Stelle und so weiter. Aber da lass ich mir schon noch etwas einfallen und muss bissl die SDL mal durchschnuppern^^ (noch keine Ahnung, was die SDL so alles kann^^)

Irgendann zwischendurch ist mir letztendlich aufgefallen, das die Wiedergabe dabei (bis zu dem Punkt des erstellten Lebensbalken) nicht ruckelt, obwohl ich am eigentlichen Ablauf ja nur sehr wenig geändert habe (Größe und Positionen halt. Weshalb es für mich jetzt noch unverständlicher ist, das das Spiel in einem kleinem Fenster ruckelt.

Zu euren Antworten:

Michael
Die angegebenen SDL2 Dateien habe ich soweit für die Includeverzeichnisse/ Bibliotheksverzeichnisse und für den linker (SDL2main.lib;SDL2.lib;...) eingestellt, vorsichtshalber für beide Versionen, also x64 und x86.
Versteh da jetzt bloß nicht was gemeint ist mit dem

Zitat

Also für gewöhnlich das Gedöns ohne "D" im Dateinamen?

Ich musste übrigens auch festellen, das es sich mit x86 auch nicht Kompilieren lässt. Bekomme eine fehlermeldung: "Die Anwendung konnte nicht korrekt gestartet werden (0xc000007b)." und in der konsole steht dann, das es mit dem code beendet wurde "-1073741701".

birdfreeyahoo

Versteh ich das jetzt richtig, das die "Release"-Funktion den von mir geschriebenen Code, unter umständen noch verändert?

David Scherfgen

Kann man die V-Sync für das Releasen, bzw. Debuggen irgendwo Ein-, oder Ausschalten? Oder meinst du über die SDL Funktionen (gerade entdeckt, das man das mit einer SDL Funktion machen kann), wie z.b. "SDL_HINT_RENDER_VSYNC" bzw. mit dem Flag "SDL_RENDERER_PRESENTVSYNC" (muss noch gucken, wo das Flag eingesetzt wird)?
Und zum besseren verständnis, V-Sync war doch dafür zuständig, das die Bildwiederholungsrate (fps) an den Monitor angepasst wird, oder? (bevor ich hier wieder irgendwas durcheinander bringe :D)

birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

6

14.01.2019, 00:26

Versteh ich das jetzt richtig, das die "Release"-Funktion den von mir geschriebenen Code, unter umständen noch verändert?


Ja, also der Code wird ja in Maschinencode umgewandelt, also Prozessorinstruktionen. Das sieht schonmal komplett anders aus als C++-Code. Da gibt es auch immer mehrere Wege, wie der Compiler das machen kann. Im Debug-Modus macht er es so, dass es logisch mit deinem Code übereinstimmt. Das bedeutet dass alle Variablen existieren und der Ablauf gleich bleibt etc, damit du diese Werte überprüfen kannst usw. mit der Logik die du auch geschrieben hast.

Bei einem Release-Build optimiert er noch einiges. Ein einfaches Beispiel ist, wenn du 10 Additionen mit 1 hinereinander ausführst. Bei einem Release-Build kompiliert er wahrscheinlich eine Instruktion, die direkt 10 addiert. Bei einem Debug-Build wohl eher nicht, da du die einzelnen Inkrementierungen und ihre Auswirkungen ja Schritt für Schritt im Debugger sehen können solltest.

7

14.01.2019, 01:59

Ok, das macht schon etwas Sinn :D
Dadurch würden ja, in dem fall den du beschrieben hast, dann unnötige Schritte wegfallen, bzw. kompakter gestaltet.

Könnte es denn sein, das in der Release-Version etwas "Optimiert" wird, wodurch es dann hier und da mal anfängt zu ruckeln? Weil halt der selbstgeschriebene Code dem Release-Compiler zu blöd war und meinte es besser machen zu können/müssen?
Und dadurch es dann in der Debug-Version flüssig läuft und in der Release-Version dann nicht mehr.?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Crasher« (14.01.2019, 02:07)


birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

8

14.01.2019, 02:03

Glaube ich kaum. Der Compiler muss so optimieren, dass die Semantik des Codes erhalten bleibt (Ausnahme Return Value Optimization). Es passiert also was du geschrieben hast.

9

14.01.2019, 02:24

Ach Fehler können doch überall auftauchen :D
Hab allerdings 20 Seiten zurück in diesem Forum geguckt, ob jemand auch so einen Fehler/ Poroblem hatte. Hab aber nichts gefunden, oder anhand der Überschrifft nicht darauf schließen können^^
Ist halt nur komisch, nachdem ich die Fenstergröße auf die Auflösung angepasst habe (1920/ 1080), das es dann nicht mehr ruckel, oder vielleicht auch nur so minimal, das es jetzt nicht mehr auffällt, das könnte natürlich auch sein. Weil wenn ich das Fenster wieder kleiner mache fängt es wieder an zu ruckeln. An meinem Projekt, das ich verändere, scheint es allerdings nicht mehr so schlimm zu sein, wie bei dem Originalcode vom Buch 8| . Habe es eben allerdings auch nur paar Sekunden getestet^^

BlueCobold

Community-Fossil

Beiträge: 10 890

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

14.01.2019, 06:33

Ach Fehler können doch überall auftauchen
Können schon. Und es gibt hier auch ein paar Leute, die tatsächlich über Compiler-Bugs gestolpert sind. Aber du bist keiner davon. Ganz sicher. Das Problem liegt wohl eher darin, dass der Release so schnell läuft, dass gewisse Fortschrittsberechnungen und Zeitmessungen intern nicht mehr sauber sind, wie David schon sagte. Das sind logische Fehler in deinem Code (numerisch bedingt) und keine vom Compiler. Machst du das Fenster größer, muss natürlich auch mehr gerendert werden und dadurch wird dein Programm gebremst. Vielleicht bist du dabei dann auch einfach näher an der Frequenz des Monitors als vorher, das macht auch einen großen Unterschied. Wie auch schon gesagt wurde, solltest du V-Sync aktivieren. Machst du das nicht, hast du eventuell in deinem Programm z.B. 90 FPS. Da dein Monitor aber nur 60 zeigen kann, heißt das effektiv, dass bei jedem zweiten Monitor-Frame ein Frame deines Spiels nicht angezeigt werden kann. Das Ergebnis ist das, was du als Ruckeln wahrnimmst (und eventuell auch noch Tearing oben drauf). Wären Monitor und Spiel synchron, wäre das nicht existent.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (14.01.2019, 06:39)


Werbeanzeige