A tick based script I created that took months to get it ultra smooth on any fps with vsync on/off. The problem I discover was that delta time in openfl is not 'consistent or move the numbers up and down smoothly"
private var currentTime:Float = Lib.getTimer();
private var cacheTime:Float = Lib.getTimer();
private var deltaTime:Float = 0;
private var timeRemainder:Float = 0;
private var timePassed:Float = 0;
private var gameSpeed:Float = (1.0 / 60) * 1000; // formula to convert to ms (frame / 60 FRAME PER Seconds) * 1000 ms
private var maxGameSpeedSkip:Float = (3.0 / 60) * 1000;
public function update(e:Event){
var display = Lib.application.window.displayMode;
var refreshRate = display.refreshRate;
stage.frameRate = refreshRate;//set the framerate to the screen hertz speed
currentTime = Lib.getTimer();
deltaTime = lerp(deltaTime,Math.min((1/stage.frameRate) * 1000,currentTime - cacheTime),.5);//cap the delta time to hertz refresh rate so the delta is smooth. Also lerp 50% for ultra smoothness
cacheTime = currentTime;
timePassed += deltaTime;
if (timePassed > maxGameSpeedSkip) timePassed = maxGameSpeedSkip;
while (timePassed >= gameSpeed){
updateGame();//update your game code here
timePassed -= gameSpeed;
}
timeRemainder = timePassed / gameSpeed;// use this for movement interpolation
dispatchEvent(new Event("RENDER_UPDATE", true));
stopAllMovieClips();
}
function lerp(a:Float, b:Float, f:Float)
{
return a * (1.0 - f) + (b * f);
}
Have fun!