avatar🌧️
雨眠雨眠碎碎念

Own the moment.

欢迎来到雨眠碎碎念~

给博客添加 FPS 监测

具体操作 ​

第一步:创建自定义 JS ​

在 source/js/ 下创建 custom.js,写入 FPS 监测代码:

javascript
// ===== FPS 监测 =====

// 默认开启:只有显式存过 "false" 才关闭
var FPS_STORAGE_KEY = "anzhiyuFPSToggle";
var anzhiyu_FPS = localStorage.getItem(FPS_STORAGE_KEY) !== "false";

// 同步显示状态(开关点击 / PJAX 切页后都会调用)
function syncFPSState() {
  var fpsGroup = document.getElementById("fps-group");
  var consoleFPS = document.getElementById("consoleFPS");
  if (fpsGroup) fpsGroup.classList.toggle("show", anzhiyu_FPS);
  if (consoleFPS) consoleFPS.classList.toggle("on", anzhiyu_FPS);
}

// 初始化 + 启动帧率计数循环(只启动一次,避免 PJAX 切页重复累加)
function initFPSMonitor() {
  syncFPSState();
  if (window.__anzhiyuFPSLoopStarted) return;
  window.__anzhiyuFPSLoopStarted = true;

  var raf = window.requestAnimationFrame || function (cb) {
    window.setTimeout(cb, 1000 / 60);
  };
  var fps = 0, last = Date.now();

  function step() {
    var fpsEl = document.getElementById("fps");
    var offset = Date.now() - last;
    fps += 1;
    if (offset >= 1000) {
      last += offset;
      if (fpsEl) fpsEl.textContent = fps;
      fps = 0;
    }
    raf(step);
  }
  step();
}

// 页面加载完就初始化(兼容 PJAX 不重新执行脚本的情况)
if (document.readyState === "loading") {
  document.addEventListener("DOMContentLoaded", initFPSMonitor);
} else {
  initFPSMonitor();
}

// 切页后重新同步开关状态
document.addEventListener("pjax:complete", syncFPSState);

原理其实很简单——用 requestAnimationFrame 来数每秒执行了多少次,一般 60 帧流畅,低于 30 帧就会觉得卡了。

第二步:创建自定义 CSS ​

在 source/css/ 下创建 custom.css:

css
/* ===== FPS 监测 ===== */
#fps-group {
  opacity: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  /* 固定到页面右下角角落 */
  position: fixed;
  right: 20px;
  bottom: 24px;
  z-index: 9999;
  min-width: 52px;
  padding: 8px 10px;
  border-radius: 14px;
  background: rgba(20, 20, 20, 0.72);
  color: #fff;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  pointer-events: none; /* 不挡鼠标操作 */
  transform: translateY(8px);
  transition:
    opacity 0.3s ease,
    transform 0.3s ease;
}

#fps-group.show {
  opacity: 1;
  transform: translateY(0);
}

/* 亮色主题适配 */
html[data-theme="light"] #fps-group {
  background: rgba(255, 255, 255, 0.88);
  color: var(--anzhiyu-fontcolor);
}

#fps {
  font-size: 16px;
  font-weight: bold;
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
}

.fps-text {
  font-size: 11px;
  line-height: 1;
  opacity: 0.72;
  letter-spacing: 0.8px;
}

/* 中控台 FPS 按钮点亮状态 */
#consoleFPS.on {
  color: var(--anzhiyu-main);
}

#consoleFPS.on .FPS-switch i {
  color: var(--anzhiyu-main) !important;
}

/* 移动端隐藏 */
@media screen and (max-width: 768px) {
  #fps-group.show {
    display: none;
  }
}

第三步:注入到页面 ​

在 _config.anzhiyu.yml 中找到 inject 配置,取消注释并添加:

yaml
inject:
  head:
    - <link rel="stylesheet" href="/css/custom.css">

  bottom:
    - <script src="/js/custom.js"></script>

第四步:挂到页面 body ​

pug
    include ./rightside.pug

    //- FPS 监测角标(固定显示在页面右下角)
    //- 必须挂在 body 直接子级
    #fps-group
      #fps 0
      span.fps-text FPS

第五步:添加中控台开关 ​

在 console.pug 中添加 FPS 开关按钮:

pug
.console-btn-item#consoleFPS(onclick='anzhiyu.FPSToggle()', title='FPS监测')
  a.FPS-switch
    i.anzhiyufont.anzhiyu-icon-gauge-high

第六步:添加开关逻辑 ​

在 main.js 中声明变量:

javascript
var anzhiyu_FPS = false;

在 utils.js 的 anzhiyu 对象中添加函数:

javascript
FPSToggle: function () {
  const isFPSOn = anzhiyu_FPS;
  const fpsGroup = document.querySelector("#fps-group");
  const consoleFPS = document.querySelector("#consoleFPS");
  if (isFPSOn) {
    fpsGroup?.classList.remove("show");
    consoleFPS?.classList.remove("on");
    anzhiyu_FPS = false;
  } else {
    fpsGroup?.classList.add("show");
    consoleFPS?.classList.add("on");
    anzhiyu_FPS = true;
  }
  localStorage.setItem("anzhiyuFPSToggle", isFPSOn ? "false" : "true");
},

怎么用 ​

装好之后:

  1. 打开博客,右下角角落默认就会显示实时 FPS 数字
  2. 想关掉的话,点开右下角的中控台按钮
  3. 找到 FPS 监测 图标(一个仪表盘样子的)点一下即可关闭
  4. 开/关状态会存在浏览器里,下次打开沿用

愿君安康,平安同乐!

博客魔改记录
MaixCamera 学习笔记一
由 Valaxy v1.0.0-rc.3 驱动|主题-Yunv1.0.0-rc.3