@atlaskit/editor-plugin-breakout
Version:
Breakout plugin for @atlaskit/editor-core
122 lines (117 loc) • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.reduceResizeFrameRateSamples = exports.measureFramerate = void 0;
/**
* Measure the FPS of a resizing component.
*
* This is a simplified version of the `useMeasureFramerate` hook from `editor-plugin-table`.
* (packages/editor/editor-plugin-table/src/pm-plugins/utils/analytics.ts)
*/
var reduceResizeFrameRateSamples = exports.reduceResizeFrameRateSamples = function reduceResizeFrameRateSamples(frameRateSamples) {
if (frameRateSamples.length > 1) {
var frameRateSum = frameRateSamples.reduce(function (sum, frameRate, index) {
if (index === 0) {
return sum;
} else {
return sum + frameRate;
}
}, 0);
var averageFrameRate = Math.round(frameRateSum / (frameRateSamples.length - 1));
return [frameRateSamples[0], averageFrameRate];
} else {
return frameRateSamples;
}
};
/**
* Measures the framerate of a component over a given time period.
* @param {object} [config] - Configuration options for framerate measurement.
* @returns {object} An object containing startMeasure, endMeasure, and countFrames methods.
* @example
* const { startMeasure, endMeasure, countFrames } = measureFramerate();
* startMeasure();
* // ... animation loop with countFrames() calls
* const samples = endMeasure(); // [60, 58, 62]
*/
var measureFramerate = exports.measureFramerate = function measureFramerate(config) {
var _ref = config || {},
_ref$maxSamples = _ref.maxSamples,
maxSamples = _ref$maxSamples === void 0 ? 10 : _ref$maxSamples,
_ref$minFrames = _ref.minFrames,
minFrames = _ref$minFrames === void 0 ? 5 : _ref$minFrames,
_ref$minTimeMs = _ref.minTimeMs,
minTimeMs = _ref$minTimeMs === void 0 ? 500 : _ref$minTimeMs,
_ref$sampleRateMs = _ref.sampleRateMs,
sampleRateMs = _ref$sampleRateMs === void 0 ? 1000 : _ref$sampleRateMs,
_ref$timeoutMs = _ref.timeoutMs,
timeoutMs = _ref$timeoutMs === void 0 ? 200 : _ref$timeoutMs;
var frameCount = 0;
var lastTime = 0;
var timeoutId;
var frameRateSamples = [];
var startMeasure = function startMeasure() {
frameCount = 0;
lastTime = performance.now();
};
/**
* Returns an array of frame rate samples as integers.
* @returns {number[]} An array of frame rate samples as integers.
* @example
* const samples = endMeasure(); // [60, 58, 62]
*/
var endMeasure = function endMeasure() {
var samples = frameRateSamples;
frameRateSamples = [];
return samples;
};
var sampleFrameRate = function sampleFrameRate() {
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var currentTime = performance.now();
var deltaTime = currentTime - lastTime - delay;
var isValidSample = deltaTime > minTimeMs && frameCount >= minFrames;
if (isValidSample) {
var frameRate = Math.round(frameCount / (deltaTime / 1000));
frameRateSamples.push(frameRate);
}
frameCount = 0;
lastTime = 0;
};
/**
* Counts the number of frames that occur within a given time period. Intended to be called
* inside a `requestAnimationFrame` callback.
* @example
* const animate = () => {
* countFrames();
* requestAnimationFrame(animate);
* };
*/
var countFrames = function countFrames() {
if (frameRateSamples.length >= maxSamples && timeoutId) {
clearTimeout(timeoutId);
return;
}
/**
* Allows us to keep counting frames even if `startMeasure` is not called
*/
if (lastTime === 0) {
lastTime = performance.now();
}
frameCount++;
if (timeoutId) {
clearTimeout(timeoutId);
}
if (performance.now() - lastTime > sampleRateMs) {
sampleFrameRate();
} else {
timeoutId = setTimeout(function () {
return sampleFrameRate(timeoutMs);
}, timeoutMs);
}
};
return {
startMeasure: startMeasure,
endMeasure: endMeasure,
countFrames: countFrames
};
};