Also das du keine Richtungstasten parallel gedrückt halten kannst und ausführst, liegt daran das die Steuerung die erste Richtung die du drückst "einloggt" - danach sind in diesem Frame keine Bewegungen mehr für diesen Frame mehr möglich. Es geht also unterm Strich nichts verloren. Nur war das eine Designentscheidung um zu verhinden das der Spieler panisch seine Richtung korrigiert.
Man könnte es so machen das man den Kopf steuern kann wie will, aber das hätte im Umkehrschluß zur Folge das der Spieler zu schnell steuert und dann in der Schlange landet weil der nächste Frame noch nicht berechnet wurde, man greift also der restlichen Logik einen Schritt vor.
Weiteres Problem dabei, das läuft alles in einem Thread und nicht in zweien.
Nur habe ich auch gemerkt das es sich etwas träge anfühlt wenn man korrigieren will, aber das ist weil die Schlange nicht in Echtzeit kontrolliert wird - was ich mir vorstellen kann, es gibt ein 200 Millisekunden Delay/Verzögerung - das ist quasi ein "toter Winkel" in dem die Anwendung für diesen Millisekunden Bereich pausiert wird, damit das Spiel "normal" ablaufen kann - es ist aktuell keine Begrenzung auf Frames pro Sekunde oder änhliches implementiert.
Im Ablauf sieht das so aus:
1) Abfangen der Tastatur / Fenster Events in einer Schleife, aber nur der erste Input wird für die Steuerung gewertet (SDL2 übernimmt das Event Queueing für die Tasten/Events)
2) Bewegung der Schlange bzw. Erweiterung
3) Puffer für das Rendering von Spielfeld, Schlange, Items
4) Rendering
5) Pause von 200 Millisekungen (minimal 125 ms) (Wie die Steuerung in dieser Pause bearbeitet wird weiß ich nicht, das habe ich nicht getestet, ginge aber einfach das zu Überprüfen)
6) Zurück zu schritt 1)
Zum Screenshot, da hast du völlig recht, ich weiß aber auch schon wo das Problem liegt. Wie du richtig sagst wird hierbei ein Frame berechnet, aber die Reihenfolge ist unlogisch gesetzt...
Im Code ist die Kollisionserkennung in Zeile 516, diese feuert aber schon bevor die Schlange ihre Bewegung abgeschlossen hat. Es wird also zu früh abgefragt ob die Schlange sich beißt, noch bevor die anderen Teile (außer dem Kopf) bewegt/aktualisiert worden sind. Also mit andereren Worten - neue Kopf Position, aber veraltetes Schwanzsegment.
Bezüglich des Memory Leaks, unter Linux kann ich außer das SDL2 Memory leaked leider nichts feststellen, aber das kommt erst beim Shutdown obwohl alle Ressourcen entladen werden die das Spiel verwendet.
Mit was hast du die Memory Leaks unter Windows detektiert?