Skip to content

刷新率 useFps ​

赞助

实时监测浏览器刷新率 FPS 的组合式函数

Show Source Code
ts
/**
 * 组合式函数:实时统计浏览器 FPS
 *
 * 每累计 10 帧计算一次平均帧率;帧循环在挂载后启动(SSR 无 requestAnimationFrame)、
 * 卸载时取消,避免循环永久自我续期。
 *
 * @returns 当前 FPS(初始 0)
 */
import { ref, onMounted, onUnmounted } from 'vue'
import type { Ref } from 'vue'
export function useFps(): { fps: Ref<number> } {
  const fps = ref<number>(0)
  const frameCount = ref<number>(0)
  let lastTime = performance.now()
  let rafId: number | null = null // 当前帧请求 ID,用于卸载时取消帧回调
  const every = 10 // 每 10 帧统计一次,避免逐帧计算带来的抖动
  const calculateFrameRate = (currentTime: number) => {
    frameCount.value++
    if (frameCount.value >= every) {
      // 每 every 帧进行一次 FPS 计算
      const timeDiff = currentTime - lastTime
      fps.value = Math.round(1000 / (timeDiff / every))
      lastTime = currentTime
      frameCount.value = 0
    }
    rafId = requestAnimationFrame(calculateFrameRate)
  }
  // SSR(Node)环境无 requestAnimationFrame,帧循环放到挂载后启动,浏览器端行为不变
  onMounted(() => {
    rafId = requestAnimationFrame(calculateFrameRate)
  })
  // 卸载时取消帧回调,否则该循环会永久自我续期,并持续持有 fps / frameCount 等状态
  onUnmounted(() => {
    if (rafId !== null) {
      cancelAnimationFrame(rafId)
      rafId = null
    }
  })
  // 返回帧率状态
  return { fps }
}

基本使用 ​

帧率:0

vue
<script setup lang="ts">
import { useFps } from 'vue-amazing-ui'
const { fps } = useFps()
</script>
<template>
  <h3>帧率:{{ fps }}</h3>
</template>

Return ​

名称说明类型
fps实时监测的浏览器刷新率Ref<number>

Released under the MIT License.