摒弃传统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 ...
随机推荐
- JVM学习笔记之类装载器-ClassLoader
JVM学习笔记之类装载器-ClassLoader 本文字数:2300,阅读耗时7分钟 JVM体系结构概览 类装载器ClassLoader: 负责加载class文件,class文件在文件开头有特定的文件 ...
- 各种好用的免费快递物流API 接口分享
全国快递物流查询:1.提供包括申通.顺丰.圆通.韵达.中通.汇通等 600+快递公司在内的快递物流单号查询.2.与官网实时同步更新.3.自动识别快递公司. 全国快递物流地图轨迹查询:[H5 物流轨迹. ...
- iOS 屏幕旋转的实践解析
摘要:如何更灵活便捷的实现自定义屏幕旋转场景,本文带你揭秘! 文|即构 iOS 应用开发团队 屏幕旋转是在视频直播类 APP 中常见的场景,在即构科技之前发布的 Roomkit SDK 中也有屏幕 ...
- ASP.NET Core – Upload and Download Files (上传和下载文件)
前言 以前得文章 Asp.net core 学习笔记 ( upload/download files 文件上传与下载 ), 这篇是修订版. Handle Upload File (处理上传文件) 我的 ...
- 消毒 url 和 html (url encode and sanitizer html )
更新: 2020-06-24 FromRoute vs FromQuery decode FromRoute 是不会 auto decode 的, query string 就会 这个是微软默认的设置 ...
- namenode rpc 请求队列调优
当 datanode 上新写完一个块,默认会立即汇报给 namenode.在一个大规模 Hadoop 集群上,每时每刻都在写数据,datanode 上随时都会有写完数据块然后汇报给 namenode ...
- Windows系统无法打开‘’网络发现‘’功能
Windows10无法开启网络发现 解决办法: 1. services.msc 2. 开启 SSDP Discovery ,设置 启动类型为 自动 ,服务状态为 启动 Windows7 无法开启网络发 ...
- SpringBoot项目使用yml文件链接数据库异常
SpringBoot使用properties连接数据库时没有出现问题 SpringBoot使用yml连接数据库时出现:Unable to connect to Redis 并在报错信息中出现: 发现是 ...
- AMBA总线架构简介
于是乎,我们想到了总线,用一个统一的接口协议,设计出一个符合要求的总线,然后将ARM核和各种外设模块挂载在总线上,这样,命令和数据似乎便可以在CPU和外设之间自由穿梭. 1 AMBA总线 AMBA,英 ...
- package.json文件干什么的 ?
package.json 是项目描述文件,记录了当前项目的信息,比如项目的名字,版本,作者,还有所依赖的第三方模块 : dependencies 是项目依赖,是项目上线时要依赖的第三方包 : devd ...