crosFrameData = function(seq, startTime, frameElapsedTime, jsElapsedTime) {
  this.seq = seq;
  this.startTime = startTime;
  this.frameElapsedTime = frameElapsedTime;
  this.jsElapsedTime = jsElapsedTime;
}

crosFpsCounter = function() {
  this.totalElapsedTime = 0.0;
  this.totalRenderTime = 0.0;
  this.totalFrames = 0;
  this.buffer_size = 120;
  this.frameDataBuf = new Array();
}

crosFpsCounter.prototype.update = function(
        startTime, frameElapsedTime, jsElapsedTime) {
  this.totalFrameElapsedTime += frameElapsedTime;
  this.totalJSElapsedTime += jsElapsedTime;
  this.frameDataBuf[this.totalFrames % this.buffer_size] = new crosFrameData(
      this.totalFrames, startTime, frameElapsedTime, jsElapsedTime);
  this.totalFrames += 1;
}

crosFpsCounter.prototype.reset = function() {
  this.totalFrameElapsedTime = 0.0;
  this.totalJSElapsedTime = 0.0;
  this.totalFrames = 0;
  this.frameDataBuf = new Array();
}

crosFpsCounter.prototype.getAvgFps = function() {
  return this.totalFrames / this.totalFrameElapsedTime;
}

crosFpsCounter.prototype.getAvgRenderTime = function() {
  return this.totalJSElapsedTime / this.totalFrames;
}

crosFpsCounter.prototype.getFrameData = function() {
  return this.frameDataBuf;
}