

子玥酱 (掘金 / 知乎 / CSDN / 简书 同名)
大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。
我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括 前端工程化、小程序、React / RN、Flutter、跨端方案,
在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。
技术方向: 前端 / 跨端 / 小程序 / 移动端工程化 内容平台: 掘金、知乎、CSDN、简书 创作特点: 实战导向、源码拆解、少空谈多落地 **文章状态:**长期稳定更新,大量原创输出
我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在"API 怎么用",而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍,希望能帮你在实际工作中少走弯路。
子玥酱 · 前端成长记录官 ✨
👋 如果你正在做前端,或准备长期走前端这条路
📚 关注我,第一时间获取前端行业趋势与实践总结
🎁 可领取 11 类前端进阶学习资源 (工程化 / 框架 / 跨端 / 面试 / 架构)
💡 一起把技术学"明白",也用"到位"
持续写作,持续进阶。
愿我们都能在代码和生活里,走得更稳一点 🌱
文章目录
-
- 引言
- 一个很容易被忽略的事实
- [游戏帧率 ≠ 渲染速度](#游戏帧率 ≠ 渲染速度)
- 高频坑:逻辑跑在了错误的"节奏"上
- 常见误区:把"调度逻辑"写进渲染路径
- [最隐蔽的坑:逻辑帧率 > 渲染帧率](#最隐蔽的坑:逻辑帧率 > 渲染帧率)
- 被忽视的点:输入与逻辑抢主线程
- 为什么你"感觉"是渲染慢了?
- 一个快速自检清单
- 总结
引言
如果你做过一段时间 HarmonyOS 游戏,大概率都遇到过这种场景:
帧率不稳
画面一卡一顿
第一反应:是不是渲染太慢了?
于是你开始:
- 降低特效
- 减少粒子
- 调低分辨率
- 怀疑 GPU
但调了一圈之后发现------好像并没有本质改善。
问题并不在渲染。
一个很容易被忽略的事实
在大多数 HarmonyOS 游戏里:
GPU 并不是瓶颈,
CPU 的"调度方式"才是。
尤其是当你用 ArkTS / JS 写逻辑时,这个问题会被无限放大。
游戏帧率 ≠ 渲染速度
先把一个常被混淆的概念拆开:
一帧顺利渲染,需要同时满足三件事:
- 逻辑更新完成
- 渲染指令准备完成
- 帧调度准时提交
哪怕 GPU 只用了 40%,只要前两步卡住,整帧都会延迟。
高频坑:逻辑跑在了错误的"节奏"上
很多 HarmonyOS 游戏,逻辑代码长这样:
ts
setInterval(() => {
updateGame()
render()
}, 16)
看起来很合理,对吧?问题在于:
setInterval不对齐系统帧- 执行时间不可控
- 堆积时会"连环补帧"
结果就是:
逻辑在抢时间片,而不是跟着帧走。
一旦某一帧 update 稍慢,后面的调度就开始抖。
正确思路:帧驱动,而不是定时器驱动
ts
function gameLoop(timestamp: number) {
const delta = timestamp - lastTime
update(delta)
render()
lastTime = timestamp
requestNextFrame(gameLoop)
}
让系统决定什么时候给你一帧。
常见误区:把"调度逻辑"写进渲染路径
很多项目为了"简单",会在每帧里做这些事:
ts
function update() {
checkNetwork()
syncState()
saveTempData()
updatePlayer()
}
这里的问题不在"做了多少事",而在于:
你把不该参与帧节奏的事情,塞进了帧循环。
这些操作的特点是:
- 耗时不稳定
- 与画面无关
- 不要求每帧执行
但它们却:
每帧都在抢主线程时间。
正确的拆分方式
ts
function update(delta: number) {
updatePlayer(delta)
updatePhysics(delta)
}
scheduleBackground(() => {
syncState()
saveTempData()
})
帧循环,只做"必须在帧内完成"的事。
最隐蔽的坑:逻辑帧率 > 渲染帧率
有些项目为了"手感",会把逻辑更新跑得很快:
ts
setInterval(update, 5) // 200 FPS 逻辑
而渲染却只有 60 FPS。
结果是:
- 状态更新堆积
- 渲染永远在追赶
- 主线程被逻辑淹没
最终表现出来的就是:
画面一卡一卡,但 GPU 明明很闲。
正确模型:逻辑对齐渲染节奏
ts
accumulator += delta
while (accumulator >= step) {
update(step)
accumulator -= step
}
render()
逻辑不会跑在渲染前面。
被忽视的点:输入与逻辑抢主线程
在 HarmonyOS 上,触控、传感器、键盘事件,都可能和逻辑跑在同一调度通道。
如果你这样写:
ts
onTouch(event) {
handleInput(event)
updateState()
}
高频输入时:
- 输入处理
- 状态更新
- 帧调度
全部挤在一起,表现出来的,就是:
操作越激烈,越容易掉帧。
正确方式:输入只记录,不计算
ts
onTouch(event) {
inputQueue.push(event)
}
ts
function update(delta) {
processInput(inputQueue)
}
为什么你"感觉"是渲染慢了?
因为:
- 卡顿发生在画面上
- FPS 数字下降
- GPU 指标最直观
但实际上:
GPU 在等 CPU 把事情安排好。
一个快速自检清单
如果你的游戏:
- 用
setInterval驱动主循环 - 每帧做网络 / 存储
- 逻辑频率高于渲染
- 输入直接触发状态修改
- 主线程职责模糊
那基本可以确定:
问题不在渲染。
总结
在 HarmonyOS 游戏里,
卡顿往往不是画得慢,
而是你让该"走路"的逻辑,去抢"跑步"的时间。