摒弃传统setInterval, 自己封装一个
传统的setInterval在某种情况下会导致内存泄漏,每次调用都会占用一部分内存空间,既然threejs的更新都是基于# requestAnimationFrame的循环调用,那么我们就可以利用这个api,自己封装一个interval循环调用的方法,至于这个api具体怎么用,可以去看一下官网,源码中封装了一个IntervalTime方法,原理就是通过第一次调用时获取高精度时间,和第二次调用的时间相比,如果符合传入的第二个参数“间隔”判断当前是需要执行callback的,方法如下:
export class IntervalTime {
private intervals: { callback: () => void, time: number, lastTime: number, remainingIterations: number }[] = [];
constructor() {}
interval(callback: () => void, time: number, iterations: number = Infinity) {
this.intervals.push({ callback, time, lastTime: 0, remainingIterations: iterations });
}
update() {
let now = performance.now(); // 使用 performance.now() 获取高精度时间
for (let i = 0; i < this.intervals.length; i++) {
const { callback, time, lastTime, remainingIterations } = this.intervals[i];
let deltaTime = now - lastTime;
if (deltaTime > time) {
// 执行一秒内需要做的事情
callback();
// 更新剩余执行次数
this.intervals[i].remainingIterations--;
if (this.intervals[i].remainingIterations === 0) {
// 移除该interval
this.intervals.splice(i, 1);
i--; // 调整索引以正确处理移除元素后的下一个元素
} else {
// 重置时间
this.intervals[i].lastTime = now;
}
}
}
}
clearIntervals() {
this.intervals = [];
}
}
使用方法如下:
const intervalTime = new IntervalTime();
// 更新时间
intervalTime.interval(() => {
upDateTime()
}, 1000)
// 更新图表
intervalTime.interval(() => {
echarts2Draw()
}, 1000 * 5)
// 更新所有序列
intervalTime.update()
摒弃传统setInterval, 自己封装一个的更多相关文章
- 使用vue.js封装一个包含图片的跑马灯组件
初衷: 学习完Vuejs后,来准备练习仿写一下老东家的门户页面,主要是为了熟悉一下常用插件的使用,比如video.js,wow.js,swiper等等:而其中涉及到一个包含图片跑马灯组件,大概长这样( ...
- 拥有自助式BI要摒弃传统BI?
简单来说BI就是从data中提取知识和信息的一套软件解决方案.商业智能 (BI,Business Intelligence) 也就是BI,是为企业把数据转换为信息.知识 ,相应蕴育而出的IT技术.企业 ...
- 自己封装一个Log模块
Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...
- PHP封装一个通用好用的文件上传处理类
封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...
- Swift - 简单封装一个工具类模板
创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...
- 使用xib封装一个自定义view的步骤
使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...
- yii2封装一个类控制div宽度,高度
1.首先,封装一个类,放在文件夹vendor下,命名为articls.php. <?phpclass Articles{ //测试 function add() { r ...
- C 封装一个简单二叉树基库
引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而 没有遭受到冷 ...
- IOS中封装一个View的思路
一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...
- 使用libzplay库封装一个音频类
装载请说明原地址,谢谢~~ 前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV ...
随机推荐
- Java常用类——包装类 小白版个人推荐
包装类及自动装箱/拆箱 包装类是将Java中的八种基本数据类型封装成的类,所有数据类型都能很方便地与对应的包装类相互转换,以解决应用中要求使用数据类型,而不能使用基本数据类型的情况. int a = ...
- Terraform管理云资源实践
背景 Terraform是一款开源的Cli工具,网上的很多文章都是单机安装一个然后创建个目录就去操作云资源:如果在高可用的前提,如何将Terraform cli变成一个嵌入运维流程的一个组件?不仅仅是 ...
- LaTeX 编译中文文档
介绍 LaTeX 原生不支持中文.为了添加中文的功能,我们需要引入宏包.XeLaTeX 原生支持中文.不过由于默认使用的字体是英文字体,我们需要设置中文字体之后才能用.不过由于一些原因,在使用 LaT ...
- 【Python后端开发】Flask之ORM数据库操作
一.前言 ORM 对象映射关系程序. 通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直 ...
- 全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法
全网最适合入门的面向对象编程教程:44 Python 内置函数与魔法方法-重写内置类型的魔法方法 摘要: 在 Python 中,内置类型的行为是通过一组特殊的"魔法方法"来实现的, ...
- vlan 技术
Ref: VLAN及Trunk,重要!看瑞哥如何讲的明明白白! 图文并茂VLAN以及Trunk详解,超级详细
- 3. 无重复字符的最长子串 Golang实现
题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度. 注意区分子串和子序列. 示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复 ...
- SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用
SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用.主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能 ...
- [CL-FOOL] CLOI 愚人赛的部分官方题解与小杂谈
小细节 谁会拿 Rank 奖励? 头图里有写哦. 发现没有,这里的问号是蓝色的,点进去可以进到彩蛋界面. 当然彩蛋界面也什么都没有,提交界面藏在下面的源码里. 那么交什么呢. CLOI 的文件里有一团 ...
- 下载 Youtube 上的视频的方法
事件起因: 某项目组同事需要下载 Youtube 上的视频作为参考视频 解决办法: https://www.converto.io/ -= 实测有效 =- 我个人一直在用该网站可以下载,非常好用,下 ...