楼主,你好,我也是在用小程序绘制实时波形,画到后面也会卡顿,请用你解决了你的问题吗?
用小程序画波形图内存飙升和帧率下降的问题最近要在小程序里实现波形图的效果,我就使用了 setInterval和ctx.draw(),但是我发现,如果setinterval的频率过高,或者画布上画的东西过多,系统的内存就会飙升,帧率也会大幅度下降,然而我之前用js在html上这样画是没有问题的,作为一名菜鸟,真心的请教下是不是我哪里代码写的不对,具体代码如下 wxml [代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]'canvaDiv'[代码][代码]>[代码] [代码]<[代码][代码]canvas[代码] [代码]class[代码][代码]=[代码][代码]'canvas'[代码] [代码]canvas-id[代码][代码]=[代码][代码]"canvas"[代码][代码]></[代码][代码]canvas[代码][代码]>[代码] [代码]</[代码][代码]view[代码][代码]>[代码] [代码]<[代码][代码]button[代码] [代码]bindtap[代码][代码]=[代码][代码]'start'[代码][代码]>开始测试</[代码][代码]button[代码][代码]>[代码]wxss [代码].canvaDiv {[代码][代码] [代码][代码]margin-bottom[代码][代码]: [代码][代码]5[代码][代码]rpx;[代码][代码]}[代码] [代码].canvas {[代码][代码] [代码][代码]width[代码][代码]: [代码][代码]100%[代码][代码];[代码][代码] [代码][代码]height[代码][代码]: [代码][代码]400px[代码][代码];[代码][代码] [代码][代码]border[代码][代码]: [代码][代码]1[代码][代码]rpx [代码][代码]solid[代码] [代码]#dadada[代码][代码];[代码][代码] [代码][代码]border-bottom[代码][代码]: [代码][代码]1[代码][代码]rpx;[代码][代码]}[代码]js [代码]start: [代码][代码]function[代码][代码](e) {[代码][代码] [代码][代码]console.log([代码][代码]"start"[代码][代码]);[代码][代码] [代码][代码]var[代码] [代码]that = [代码][代码]this[代码][代码];[代码][代码] [代码][代码]var[代码] [代码]size = wx.getSystemInfoSync().windowWidth; [代码][代码]//屏幕宽度,波形图的宽度 [代码][代码] [代码][代码]var[代码] [代码]space = size / 1024; [代码][代码]//x坐标每次移动的长度[代码][代码] [代码][代码]var[代码] [代码]offset = 4; [代码][代码]//每次跨越的数据长度,offset越小interval越小,画面就越流畅,性能消耗就越高[代码][代码] [代码][代码]var[代码] [代码]interval = 1000 / 128 * offset; [代码][代码]//隔几毫秒画一次[代码][代码] [代码][代码]var[代码] [代码]obj = {[代码][代码] [代码][代码]buffer: [代码][代码]new[代码] [代码]Array(),[代码][代码] [代码][代码]index: 0[代码][代码] [代码][代码]}[代码][代码] [代码][代码]for[代码] [代码]([代码][代码]var[代码] [代码]i = 0; i < 2048; i++) {[代码][代码] [代码][代码]obj.buffer.push(Math.random() * 128);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]let ctx = wx.createCanvasContext([代码][代码]"canvas"[代码][代码]);[代码][代码] [代码][代码]setInterval([代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]that.drawWave(space, offset, obj, ctx, 0);[代码][代码] [代码][代码]that.drawWave(space, offset, obj, ctx, 128);[代码][代码] [代码][代码]that.drawWave(space, offset, obj, ctx, 256);[代码][代码] [代码][代码]ctx.stroke();[代码][代码] [代码][代码]ctx.draw();[代码][代码] [代码][代码]if[代码] [代码](obj.buffer.length >= 1024) { [代码][代码]//如果铺满画布了,就移动 [代码][代码] [代码][代码]obj.index += offset; [代码][代码]//计时器每执行一次,索引就偏移一定量 [代码][代码] [代码][代码]}[代码][代码] [代码][代码]if[代码] [代码](obj.buffer.length <= obj.index) {[代码][代码] [代码][代码]obj.index = 0;[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}, interval);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]drawWave: [代码][代码]function[代码][代码](space, offset, obj, ctx, heightOffset) {[代码][代码] [代码][代码]var[代码] [代码]x = 0; [代码][代码]//x开始的位置[代码][代码] [代码][代码]if[代码] [代码](obj.buffer.length > obj.index) {[代码][代码] [代码][代码]ctx.moveTo(x, obj.buffer[obj.index]); [代码][代码]//线的起点 [代码][代码] [代码][代码]for[代码] [代码]([代码][代码]var[代码] [代码]i = 0; i < 1024; i++) { [代码][代码]//1屏8秒128*8=1024个数据[代码][代码] [代码][代码]if[代码] [代码](obj.buffer.length > obj.index + i) {[代码][代码] [代码][代码]ctx.lineTo(x += space, obj.buffer[obj.index + i] + heightOffset);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码] 是我哪里写的不对吗,求指点
2019-11-13