Canvas引起定时器不准的问题?
发布于 4 年前 作者 ming37 12532 次浏览 来自 问答

我用一个定时器time = setInterval(animation, animation_interval);绘图:

// 动画函数
				function animation() {
					console.log(`间隔时间:${Date.now()-that.startTime}`)
					if (step <= n) {
						end = end + 2 * Math.PI / n;
						ringMove(start, end);
						step++;
						
					} else {
						clearInterval(time);
					}
				};
				// 画布绘画函数
				function ringMove(s, e) {
					let stTime = Date.now();
					
					var context = wx.createCanvasContext('secondCanvas')

					var gradient = context.createLinearGradient(200, 100, 100, 200);
					gradient.addColorStop("0", "#2661DD");
					gradient.addColorStop("0.5", "#40ED94");
					gradient.addColorStop("1.0", "#5956CC");

					// 绘制圆环
					context.setStrokeStyle('#f6cbf4')
					context.beginPath()
					context.setLineWidth(10)
					context.arc(42, 42, 30, s, e, true)
					context.stroke()
					context.closePath()

					// 绘制倒计时文本
					context.beginPath()
					context.setLineWidth(1)
					context.setFontSize(30)
					context.setFillStyle('#ffffff')
					context.setTextAlign('center')
					context.setTextBaseline('middle')
					context.fillText(n - num + '', 42, 42, 30)
					context.fill()
					context.closePath()

					context.draw()

					// 每完成一次全程绘制就+1
					num++;
					
					console.log(`绘制时间:${Date.now()-stTime}`)
				}

var animation_interval = 500 //500毫秒

console输出:

绘制时间:76

canvasDemo.js:184 间隔时间:3307

canvasDemo.js:229 绘制时间:1

canvasDemo.js:184 间隔时间:4219

canvasDemo.js:229 绘制时间:2

canvasDemo.js:184 间隔时间:5212

canvasDemo.js:229 绘制时间:5

canvasDemo.js:184 间隔时间:6237

在真机调试时,虽然绘制时间很短,但定时器设置为500ms时,定时器定时间隔超出500毫秒,近1秒,微信集成环境下调试正常(定时器间隔500ms),啥情况??

2 回复

上面同样代码在小程序原生的程序中试了一下,结果在真机下,定时器完全不对:

第三次启动定时器时,有两个间隔是100毫秒,但总的间隔是对的(每3个定时,1500ms),但前面两次启停定时器,间隔多是1秒。

基础库版本信息:

附代码:

//wxml
    
      <button bindtap="onStart"> 启动定时器 
      <button bindtap="onStop"> 关闭定时器 
    </button bindtap=</button bindtap=

//js
onStart(){
    let time = setInterval(this.timerCallback, 500);
    let beginTime = Date.now();
    this.setData({
      time:time,
      beginTime:beginTime
    })
  },
  onStop(){
    clearInterval(this.data.time);
  },
  timerCallback(){
    console.log(`timerCallback:${Date.now()-this.data.beginTime}`)
  }

谢邀:

目测clearInterval(time);执行了,重新清理了定时器
回到顶部