news 2026/3/14 4:41:53

【渲染优化】动态调整虚拟列表刷新率:让代码学会“偷懒“

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【渲染优化】动态调整虚拟列表刷新率:让代码学会“偷懒“

【渲染优化】动态调整虚拟列表刷新那天是周五下午 4 点半,我正打算提交代码下班。

测试小姐姐突然跑过来一句:

“你这个商城列表,在我手机上滑动的时候卡得我想摔手机!”

我一脸懵逼:

“啊?我在 iPhone 14 Pro 上测试很丝滑啊!”

拿过她的红米 Note 9 一滑——

卧槽,真的卡。

再试试快速滑动——

卧槽,更卡了。

我打开 Chrome DevTools 看性能面板,帧率从 60 狂掉到 25,一大片红色警告条刺眼地躺在那里:

OnScrolling() - 35ms ⚠️

UpdateVisibleItems() - 28ms ⚠️

CalculateVisibleRange() - 15ms ⚠️

心里默默地叹了口气:

“完蛋鸟,又是一个不眠的周末。”

🤔 问题的根源

我翻开了以前写的虚拟列表代码:

// 我之前的写法(估计很多人也这么写)

private onScrolling(): void {

this.updateVisibleItems(); // 每次滚动都刷新

}

看起来挺合理的对吧?

滚动更新可见项,天经地义。

但我忽略了一个残酷事实:

Cocos 的 scrolling 事件,在快速滑动时,1 秒能触发 60 次!

也就是说,我的 updateVisibleItems() 每秒执行 60 次,干的事还挺重:

计算可见区间(遍历位置数组)

回收旧节点(遍历 Map)

创建新节点(对象池、设置位置、更新数据)

60 次 × 每次 30ms = 1800ms 的计算量。

一秒钟才 1000ms,非要干 1800ms 的活儿——

不卡才怪。

💡 灵魂拷问:真的需要刷新那么快吗?

我冷静想了想。

当用户快速甩动列表时,他真的能看清里面的内容吗?

答案是:根本看不清。

你可以自己试试,打开淘宝、微信朋友圈,快速滑动时会发现:

内容略模糊(其实没完整渲染)

停下来才变清晰

但完全不会觉得“卡”

原来大厂早就在玩这个骚操作:快速滚动时,故意降低刷新率。

就像拍电影——打斗戏 24 帧就够,定格镜头才用 60 帧。

🎯 我的方案:让列表自己决定要不要刷新

核心思路特别简单,就四句话:

1️⃣ 慢速滑动 → 用户能看清 → 必须刷新 → 60fps

2️⃣ 快速滑动 → 用户看不清 → 少刷几次 → 20fps

3️⃣ 卡顿明显 → 设备吃不消 → 降级模式

4️⃣ 滑动停止 → 强制刷新 → 确保显示完整

听起来挺复杂,其实不到 100 行代码就能搞定。

🧭 第一步:给列表装个“速度计”

export class PerformanceManager {

private lastPos = 0;

private lastTime = 0;

private speed = 0;

shouldUpdate(currentPos: number): boolean {

const now = Date.now();

const timePassed = now - this.lastTime;

if (timePassed < 16) return false; // 每帧间隔16ms

const moved = Math.abs(currentPos - this.lastPos);

this.speed = moved / (timePassed / 1000);

if (this.speed > 2000) {

if (timePassed < 50) return false; // 飞速滑动,20fps

} else if (this.speed > 1000) {

if (timePassed < 33) return false; // 快速滑动,30fps

}

this.lastPos = currentPos;

this.lastTime = now;

return true;

}

}

简单说:

速度越快 → 刷新越少 → 性能越稳。

🧩 第二步:改造滚动逻辑

private onScrolling(): void {

const offset = this.scrollView.getScrollOffset();

const pos = this.scrollView.vertical ? offset.y : offset.x;

if (this.perfManager.shouldUpdate(pos)) {

this.updateVisibleItems(); // 该刷才刷

}

this.onScrollProgress();

}

private onScrollEnded(): void {

this.updateVisibleItems(); // 停下来强制刷新

}

只加了一个判断,改动极小,零侵入。

🛡️ 第三步:加个“低性能模式”

recordFrameTime(time: number): void {

this.frameTimes.push(time);

if (this.frameTimes.length > 5) this.frameTimes.shift();

const slowFrames = this.frameTimes.filter(t => t > 16).length;

this.isLowPerformanceMode = slowFrames >= 3;

if (this.isLowPerformanceMode) {

console.warn('⚠️ 进入低性能模式,降低刷新率保证流畅');

}

}

当连续几帧掉帧,就自动降级刷新频率。

你说是不是很“智能”?😎

📊 实测结果

手机型号 优化前 优化后 提升幅度 刷新次数/秒

iPhone 14 Pro 54 fps 60 fps ↑ 11% 60 → 35

小米 12 38 fps 55 fps ↑ 45% 60 → 28

红米 Note 9 23 fps 42 fps ↑ 83% 60 → 18

没看错,低端机性能提升了 83%!

而代码改动量,不到 100 行。

🧠 进阶优化:动态缓冲区

再来一个锦上添花的小优化——

private getBufferSize(): number {

const speed = this.perfManager.getSpeed();

if (speed > 2000) return 3; // 飞速滑动:3屏缓冲

if (speed > 1000) return 2; // 快速滑动:2屏缓冲

return 1; // 慢速滑动:1屏缓冲

}

滑得越快,就多加载几屏内容,防止白屏。

🧩 核心总结

1️⃣ 不要盲目追求高刷新率。

2️⃣ 用数据说话,不凭感觉。

3️⃣ 性能优化要有取舍,不是一味地“更快”。

🌙 写在最后

虚拟列表的性能优化,说到底是一场“感知”与“取舍”的平衡。

一句话总结:

好的性能优化,不是让程序跑得更快,而是让程序知道什么时候该偷懒。

就像武侠小说里的高手,不是每一招都用尽全力,而是知道——

何时发力,何时卸力。

查看源码

👉 《高性能实用虚拟列表》

核心特性:

支持垂直/水平/网格布局

动态高度 / 宽度

自适应性能优化

对象池自动管理

插入 / 删除动画

🙋 常见问题

Q:会看到空白吗?

A:不会。快速滑动时自动扩展缓冲区。

Q:兼容性如何?

A:Cocos Creator 2.x / 3.x 通吃,原生、小游戏、H5 全支持。

Q:老项目能用吗?

A:能,只需在 onScrolling 里加一句判断。

:让代码学会"偷懒"

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 12:10:06

me_cleaner 终极指南:简单快速禁用Intel管理引擎保护系统安全

me_cleaner 终极指南&#xff1a;简单快速禁用Intel管理引擎保护系统安全 【免费下载链接】me_cleaner Tool for partial deblobbing of Intel ME/TXE firmware images 项目地址: https://gitcode.com/gh_mirrors/me/me_cleaner Intel Management Engine&#xff08;Int…

作者头像 李华
网站建设 2026/3/13 13:35:33

行业痛点逐个击破!九大行业AI革新,亚马逊云科技见!

全球云计算年度必看盛会 re:Invent 2025即将如期启幕&#xff01;聚焦汽车、制造业、金融服务、游戏、医疗保健和生命科学等9大核心行业共探Agentic AI时代下各大行业的新增长极与未来机遇&#xff01;汽车 ▼ re:Invent 2025专为汽车领域专业人士精心打造的内容合集&#x…

作者头像 李华
网站建设 2026/3/8 23:06:24

亚马逊云科技护航中国创新,链接全球商机!让AI创造更大价值!

re:Invent 2025不仅有前沿Agentic AI洞察标杆企业实战落地干货更专为大中华区的伙伴们定制了专属技术专场与深度交流活动邀您一同解锁“全球视野 本地落地”的双重机遇&#xff01;re:Invent 2025大中华区主题演讲 专题研讨Breakout Session ▼ AI实战应用&#xff1a;企业…

作者头像 李华
网站建设 2026/3/12 14:31:16

24个实战项目带你从零掌握物联网核心技术

24个实战项目带你从零掌握物联网核心技术 【免费下载链接】IoT-For-Beginners 12 Weeks, 24 Lessons, IoT for All! 项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners 还在为物联网技术门槛高而苦恼&#xff1f;本文将用24个真实项目案例&#xff0…

作者头像 李华
网站建设 2026/3/12 17:33:06

5、计算机文档编写:键名规范与写作风格指南

计算机文档编写:键名规范与写作风格指南 在计算机文档编写中,键名规范和写作风格是两个重要的方面。键名规范确保用户能够准确理解操作所需按下的按键,而良好的写作风格则有助于有效传达信息,提高文档的可读性和实用性。 键名规范 键名用于指示在键盘上按下哪个键以获得…

作者头像 李华
网站建设 2026/3/13 8:47:05

学术作品相似度过高?五个专业技巧帮你突破合格门槛

论文重复率超30%&#xff1f;5个降重技巧&#xff0c;一次降到合格线 嘿&#xff0c;大家好&#xff01;我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题&#xff1a;论文重复率飙到30%以上怎么办&#xff1f;别慌&#xff0c;我这就分享5个实用降重技巧&#xff0c;帮你一次…

作者头像 李华