如何在p5.js中实现对象随时间缩短出现间隔、越来越快生成的效果
实现数组元素间隔逐渐缩短的依次展示方案
问题原因
- 同步遍历的执行速度远快于定时器的触发时机,所有定时器会在几毫秒内全部注册完成,无法实现动态调整间隔的效果
- 固定参数的
setInterval本身不支持动态修改间隔时长,需要手动销毁重建,反而会增加实现复杂度
推荐实现方案:递归定时器
该方案仅维护单个定时器,每次展示完当前元素后再动态计算下一次的间隔,性能更优,也方便扩展暂停、重置等功能。
// 待展示的元素数组,可替换为你自己的业务数据 const elements = ['元素1', '元素2', '元素3', '元素4', '元素5', '元素6'] // 配置参数,可根据需求调整 let currentIndex = 0 let currentDelay = 1000 // 初始展示间隔,单位ms const delayDecay = 0.8 // 间隔衰减系数,0.8代表每次间隔缩短20% const minDelay = 100 // 最小间隔阈值,避免展示速度过快 function showNextElement() { // 所有元素展示完成后终止执行 if (currentIndex >= elements.length) return // 此处替换为你自己的元素渲染逻辑 console.log('当前展示元素:', elements[currentIndex]) // 计算下一次的展示间隔 currentDelay = Math.max(currentDelay * delayDecay, minDelay) currentIndex++ // 注册下一次定时器 setTimeout(showNextElement, currentDelay) } // 启动展示逻辑 setTimeout(showNextElement, currentDelay)
遍历写法的修正方案
如果你坚持要使用数组遍历实现,可以通过累加总延时的方式批量注册定时器,实现效果如下:
const elements = ['元素1', '元素2', '元素3', '元素4', '元素5', '元素6'] let totalDelay = 0 let currentDelay = 1000 const delayDecay = 0.8 const minDelay = 100 elements.forEach(item => { totalDelay += currentDelay setTimeout(() => { // 此处替换为你自己的元素渲染逻辑 console.log('当前展示元素:', item) }, totalDelay) currentDelay = Math.max(currentDelay * delayDecay, minDelay) })
注意:该方案会一次性注册和数组长度相等的定时器,数组过长时会有性能损耗,且不支持中途暂停展示,更推荐使用递归定时器方案。
内容的提问来源于stack exchange,提问作者iosalome
相关产品推荐
相关产品推荐

