Ваш код FPS определенно неверен
setInterval(checkFps, 1000);
Никто не гарантирует, что эта функция будет вызываться ровно каждую секунду (это может быть больше 1000 мс или меньше - но, вероятно, больше), поэтому
function checkFps() {
$("#fps").html(fps);
fps = 0;
}
неверно (если fps равен 32, то возможно, что у вас есть 32 кадра за 1,5 с (экстремальный случай))
, чтобы увидеть, что было в реальном времени с моментаПоследнее обновление и вычисление в реальном времени / кадров (я уверен, что JavaScript имеет функцию, чтобы получить время, но я не уверен, будет ли оно достаточно точным = мс или лучше)
fps, кстати, не очень хорошоимя, оно содержит количество кадров (с момента последнего обновления), а не количество кадров в секунду, поэтому кадры будут более подходящим именем.
Таким же образом
setInterval(draw, 1000/30);
неправильно, так как вы хотите получить FPS равным 30, но так как setInterval не очень точен (и, вероятно, будет ждать дольше, чем вы говорите, вы получите более низкий FPS, даже если процессор способен справиться с нагрузкой)