计算函数 fps 的函数

function to calculate function fps

好的,我相信我可以通过代码最好地描述问题,所以这里开始

var clicks = 0;

//function to calculate
function clicking(){
  clicks += 1;
}

//function to calculate fps where fn is the name of the function
function FPS(fn){
  //do stuff
}

好吧,澄清一下我不想向实际函数添加变量clicking我希望能够调用类似 FPS(clicking) 并具有函数 return 一个值,例如

var fps = FPS(clicking);

然后我可以这样显示 returned 号码 element.innerHTML = fps

编辑: 我知道当前的代码看起来很愚蠢,但这只是示例编码,而不是我实际使用的代码

回答原问题:

Okay so to clarify I dont want to add a variable to the actual function clicking I would like to be able to call something like FPS(clicking) and have the function return a value for example

首先,您需要 return 来自 clicking 函数的值,或您计划传递给 FPS 方法的任何函数。

var clicks = 0;

//function to calculate
function clicking(){
    clicks += 1;
    return clicks;
}

然后在您的 FPS 函数中,您还需要 return 该值。

//function to calculate fps where fn is the name of the function
function FPS(fn){
    //do stuff
    return fn();
}

这不是很实际,因为 Date.now() 也使用时间。

function FPS(fn) {
  var startTime = Date.now();
  fn();
  var endTime = Date.now();

  return endTime - startTime;
}

function longClick() {
  var abc = 0;
  for (var i = 0; i < 100000000; i++) {
    abc++;
  }
}

var fps = FPS(longClick);
console.log((fps / 1000) + ' seconds');


FPS通常指的是Frames Per Second也就是刷新屏幕图像的频率。

为队友取一个更全面的名称,关键字如 Elapsed

如果你想知道"how fast the functions runs":

/**
 * Return the execution time of a function
 * @param {Function} fn The function to execute
 */
function FPS(fn) {
  var start = new Date().getTime();
  fn();
  var end = new Date().getTime();
  return end - start;
}

这里是一些伪代码,可以得到我认为您正在寻找的东西 - 假设您有一个游戏循环并且您在游戏循环中调用 FPS。正如我所说 - 有关游戏细节(例如组件)的更多详细信息会有所帮助。

var clicks = 0;
var fps = 0;
var elapsedTime;

//function to calculate
function clicking(){
  clicks += 1;
}

//function to calculate fps where fn is the name of the function
function FPS(fn){
  // Get start time
  //call fn
  // Get stop time
  // var delta = stop time - start time
  // elapsedTime += delta;
  // fps++;
  // If elapsedTime > 1 second 
  // then while elapsedTime > 1 second... elapsedTime -= 1 second and fps = 0;
  // We use the while loop here in the event that it took more than 1 second in the call
  // But you could just reset elapsedTime back to 0
}

这个 FPS(fn) 将在游戏中的任何位置被调用以代替原始函数,以查看该函数每秒被调用了多少次。

您可以将 FPS return 设为 DOMHighResTimeStamp(适用于 IE 10+、Firefox 15+、Chrome 20+、Safari 8+),这将 return时间以毫秒为单位。如果你想让它在旧的浏览器中工作,你可以用 Date (new Date()) 对象替换精确计时,但 Date 对象只会以秒为单位(而不是毫秒):

var clicks = 0;

//function to calculate
function clicking(){
  clicks += 1;
}

//function to calculate fps where fn is the name of the function
function FPS(fn){
  var start = performance.now();
  fn();
  return performance.now() - start;
}

console.log("Function took " + FPS(clicking) + " milliseconds!");