{"version":3,"file":"index.mjs","sources":["../../../src/stats/index.ts"],"sourcesContent":["import { cancelFrame, frame, frameData } from \"../frameloop\"\nimport { activeAnimations } from \"./animation-count\"\nimport { ActiveStatsBuffer, statsBuffer } from \"./buffer\"\nimport { StatsSummary, Summary } from \"./types\"\n\nfunction record() {\n    const { value } = statsBuffer\n\n    if (value === null) {\n        cancelFrame(record)\n        return\n    }\n\n    value.frameloop.rate.push(frameData.delta)\n    value.animations.mainThread.push(activeAnimations.mainThread)\n    value.animations.waapi.push(activeAnimations.waapi)\n    value.animations.layout.push(activeAnimations.layout)\n}\n\nfunction mean(values: number[]) {\n    return values.reduce((acc, value) => acc + value, 0) / values.length\n}\n\nfunction summarise(\n    values: number[],\n    calcAverage: (allValues: number[]) => number = mean\n): Summary {\n    if (values.length === 0) {\n        return {\n            min: 0,\n            max: 0,\n            avg: 0,\n        }\n    }\n\n    return {\n        min: Math.min(...values),\n        max: Math.max(...values),\n        avg: calcAverage(values),\n    }\n}\n\nconst msToFps = (ms: number) => Math.round(1000 / ms)\n\nfunction clearStatsBuffer() {\n    statsBuffer.value = null\n    statsBuffer.addProjectionMetrics = null\n}\n\nfunction reportStats(): StatsSummary {\n    const { value } = statsBuffer\n\n    if (!value) {\n        throw new Error(\"Stats are not being measured\")\n    }\n\n    clearStatsBuffer()\n    cancelFrame(record)\n\n    const summary = {\n        frameloop: {\n            setup: summarise(value.frameloop.setup),\n            rate: summarise(value.frameloop.rate),\n            read: summarise(value.frameloop.read),\n            resolveKeyframes: summarise(value.frameloop.resolveKeyframes),\n            preUpdate: summarise(value.frameloop.preUpdate),\n            update: summarise(value.frameloop.update),\n            preRender: summarise(value.frameloop.preRender),\n            render: summarise(value.frameloop.render),\n            postRender: summarise(value.frameloop.postRender),\n        },\n        animations: {\n            mainThread: summarise(value.animations.mainThread),\n            waapi: summarise(value.animations.waapi),\n            layout: summarise(value.animations.layout),\n        },\n        layoutProjection: {\n            nodes: summarise(value.layoutProjection.nodes),\n            calculatedTargetDeltas: summarise(\n                value.layoutProjection.calculatedTargetDeltas\n            ),\n            calculatedProjections: summarise(\n                value.layoutProjection.calculatedProjections\n            ),\n        },\n    }\n\n    /**\n     * Convert the rate to FPS\n     */\n    const { rate } = summary.frameloop\n    rate.min = msToFps(rate.min)\n    rate.max = msToFps(rate.max)\n    rate.avg = msToFps(rate.avg)\n    // Swap these as the min and max are inverted when converted to FPS\n    ;[rate.min, rate.max] = [rate.max, rate.min]\n\n    return summary\n}\n\nexport function recordStats() {\n    if (statsBuffer.value) {\n        clearStatsBuffer()\n        throw new Error(\"Stats are already being measured\")\n    }\n\n    const newStatsBuffer = statsBuffer as unknown as ActiveStatsBuffer\n\n    newStatsBuffer.value = {\n        frameloop: {\n            setup: [],\n            rate: [],\n            read: [],\n            resolveKeyframes: [],\n            preUpdate: [],\n            update: [],\n            preRender: [],\n            render: [],\n            postRender: [],\n        },\n        animations: {\n            mainThread: [],\n            waapi: [],\n            layout: [],\n        },\n        layoutProjection: {\n            nodes: [],\n            calculatedTargetDeltas: [],\n            calculatedProjections: [],\n        },\n    }\n\n    newStatsBuffer.addProjectionMetrics = (metrics) => {\n        const { layoutProjection } = newStatsBuffer.value\n        layoutProjection.nodes.push(metrics.nodes)\n        layoutProjection.calculatedTargetDeltas.push(\n            metrics.calculatedTargetDeltas\n        )\n        layoutProjection.calculatedProjections.push(\n            metrics.calculatedProjections\n        )\n    }\n\n    frame.postRender(record, true)\n\n    return reportStats\n}\n"],"names":[],"mappings":"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"}