Grundsätzlich sollte die Bewegung unabhängig von der Framerate sein. Dein Charakter hat eine bestimmte Geschwindigkeit (bspw. 10 m/s) und das Spiel läuft mit einer bestimmten Framerate (bspw. 60 F/s) Dividiert man nun die Geschwindigkeit v (m/s) durch die Framerate FPS, erhält man einen Wert, mit dem man weiterrechnen kann (in diesem Beispiel ~ 0,1667 m/F). Alternativ zur Division (v/FPS) kann man auch eine Multiplikation mit dem multiplikativ Inversem der Framerate (v * 1/FPS = 10 m/s * 1/(60 F/s) ~= 10 m/s * 0,01667 s/F = 0,1667 m/F) durchführen und kommt zum gleichen Ergebnis. Letzteres ist dabei die Zeit, die "in einem Frame" vergangen ist, also der zeitliche Abstand zwischen 2 Frames.
In Spielen multipliziert man also seine Geschwindigkeiten mit der seit dem letzten Frame vergangenen Zeit (in Sekunden), um die Geschwindigkeit für den Aktuellen Frame zu erhalten, also die Distanz, die in diesem Frame zurückgelegt werden muss.
Und VSYNC anzuschalten ist nur ein Workaround, da das Problem wieder auftreten kann, wenn das Spiel zu langsam läuft.