为什么画布动画会卡在ios上?是写作问题吗?

这是js中的代码。请看一看。html代码是

var?num?=?200;

var?w?=?window.innerWidth

var?h?=?window.innerHeight

var?麦克斯。=?100;

var?_x?=?0;

var?_y?=?0;

var?_z?=?150;

var?dtr?=?功能(d)?{

回归?d?*?数学。圆周率?/?180;

};

var?rnd?=?函数()?{

回归?math . sin(math . floor(math . random()?*?360)?*?数学。圆周率?/?180);

};

var?dist?=?函数(p1,?p2,?p3)?{

回归?Math.sqrt(Math.pow(p2.x?-?p1.x,?2)?+?Math.pow(p2.y?-?p1.y,?2)?+?Math.pow(p2.z?-?p1.z,?2));

};

var?小卡。=?{

obj:?{

x:?_x,

y:?_y,

z:?_z

},

dest:?{

x:?0,

y:?0,

z:?1

},

距离:?{

x:?0,

y:?0,

z:?200

},

ang:?{

cplane:?0,

splane:?0,

ctheta:?0,

圣塔:?0

},

缩放:?1,

显示:?{

x:?w?/?2,

y:?h?/?2,

z:?0

},

upd:?函数()?{

cam.dist.x?=?cam.dest.x?-?cam . obj . x;

凸轮区y?=?卡姆.德斯蒂?-?cam . obj . y;

cam.dist.z?=?cam.dest.z?-?cam . obj . z;

cam.ang.cplane?=?-cam.dist.z?/?Math.sqrt(cam.dist.x?*?cam.dist.x?+?cam.dist.z?*?cam . dist . z);

cam.ang.splane?=?cam.dist.x?/?Math.sqrt(cam.dist.x?*?cam.dist.x?+?cam.dist.z?*?cam . dist . z);

cam.ang.ctheta?=?Math.sqrt(cam.dist.x?*?cam.dist.x?+?cam.dist.z?*?cam.dist.z)?/?Math.sqrt(cam.dist.x?*?cam.dist.x?+?凸轮区y?*?凸轮区y?+?cam.dist.z?*?cam . dist . z);

cam.ang.stheta?=?-卡姆.迪什?/?Math.sqrt(cam.dist.x?*?cam.dist.x?+?凸轮区y?*?凸轮区y?+?cam.dist.z?*?cam . dist . z);

}

};

var?trans?=?{

零件:?{

sz:?函数(p,?sz)?{

回归?{

x:?p.x?*?sz.x,

y:?p.y?*?深圳市,

z:?p.z?*?深圳

};

},

腐:?{

x:?函数(p,?腐)?{

回归?{

x:?p.x,

y:?p.y?*?Math.cos(dtr(rot.x))?-?p.z?*?Math.sin(dtr(rot.x)),

z:?p.y?*?Math.sin(dtr(rot.x))?+?p.z?*?Math.cos(dtr(rot.x))

};

},

y:?函数(p,?腐)?{

回归?{

x:?p.x?*?Math.cos(dtr(rot.y))?+?p.z?*?Math.sin(dtr(rot.y)),

y:?p.y,

z:?-p.x?*?Math.sin(dtr(rot.y))?+?p.z?*?Math.cos(dtr(rot.y))

};

},

z:?函数(p,?腐)?{

回归?{

x:?p.x?*?Math.cos(dtr(rot.z))?-?p.y?*?Math.sin(dtr(rot.z)),

y:?p.x?*?Math.sin(dtr(rot.z))?+?p.y?*?Math.cos(dtr(rot.z)),

z:?pz

};

}

},

pos:?函数(p,?pos)?{

回归?{

x:?p.x?+?位置x,

y:?p.y?+?位置y,

z:?p.z?+?位置z

};

}

},

pov:?{

平面:?函数(p)?{

回归?{

x:?p.x?*?cam.ang.cplane?+?p.z?*?cam.ang.splane,

y:?p.y,

z:?p.x?*?-cam.ang.splane?+?p.z?*?cam.ang.cplane

};

},

θ:?函数(p)?{

回归?{

x:?p.x,

y:?p.y?*?cam.ang.ctheta?-?p.z?*?cam.ang.stheta,

z:?p.y?*?cam.ang.stheta?+?p.z?*?cam.ang.ctheta

};

},

设置:?函数(p)?{

回归?{

x:?p.x?-?cam.obj.x,

y:?p.y?-?cam.obj.y,

z:?p.z?-?cam.obj.z

};

}

},

透视:?函数(p)?{

回归?{

x:?p.x?*?cam.dist.z?/?p.z?*?cam.zoom,

y:?p.y?*?cam.dist.z?/?p.z?*?cam.zoom,

z:?p.z?*?cam.zoom,

p:?cam.dist.z?/?pz

};

},

显示:?函数(p,?disp)?{

回归?{

x:?p.x?+?disp.x,

y:?-派伊?+?显示,

z:?p.z?+?显示z,

p:?p.p

};

},

步骤:?函数(_obj_,?sz,?腐,?pos,?disp)?{

var?_args?=?trans.parts.sz(_obj_,?SZ);

_args?=?trans.parts.rot.x(_args,?腐);

_args?=?trans.parts.rot.y(_args,?腐);

_args?=?trans.parts.rot.z(_args,?腐);

_args?=?trans.parts.pos(_args,?pos);

_args?=?trans . POV . plane(_ args);

_args?=?trans . POV . theta(_ args);

_args?=?trans . POV . set(_ args);

_args?=?trans . persp(_ args);

_args?=?trans.disp(_args,?disp);

回归?_ args

}

};

(函数()?{

“用吗?严格”;

var?三个d?=?函数(参数)?{

这个. transIn?=?{};

这个. transOut?=?{};

this.transIn.vtx?=?(param . vtx);

this.transIn.sz?=?(param . SZ);

this.transIn.rot?=?(param . rot);

this.transIn.pos?=?(param . pos);

};

threeD.prototype.vupd?=?函数()?{

这个. transOut?=?交易步骤(

this.transIn.vtx,

this.transIn.sz,

this.transIn.rot,

this.transIn.pos,

凸轮显示

);

};

var?建造?=?函数()?{

这个.维尔?=?0.04;

这个,林?=?360;

this.diff?=?200;

this.initPos?=?100;

这个。毒理?=?_ x;

这个玩具?=?_ y;

this . go();

};

Build.prototype.go?=?函数()?{

这个.画布?=?document . getelementbyid(" canv ");

这个.画布.宽度?=?window.innerWidth

这个.画布.高度?=?window.innerHeight

这个。$?=?canv . get context(" 2d ");

这个。$.globalCompositeOperation?=?“源-结束”;

这个. varr?=?[];

this.dist?=?[];

this.calc?=?[];

为了什么?(var?我?=?0,?莱恩。=?num?我?& lt?len?i++)?{

this . add();

}

这个. rotObj?=?{

x:?0,

y:?0,

z:?0

};

this.objSz?=?{

x:?w?/?5,

y:?h?/?5,

z:?w?/?五

};

};

Build.prototype.add?=?函数()?{

this.varr.push(新?threeD({

vtx:?{

x:?rnd(),

y:?rnd(),

z:?rnd()

},

sz:?{

x:?0,

y:?0,

z:?0

},

腐:?{

x:?20,

y:?-20,

z:?0

},

pos:?{

x:?this.diff?*?Math.sin(360?*?Math.random()?*?数学。圆周率?/?180),

y:?this.diff?*?Math.sin(360?*?Math.random()?*?数学。圆周率?/?180),

z:?this.diff?*?Math.sin(360?*?Math.random()?*?数学。圆周率?/?180)

}

}));

this.calc.push({

x:?360?*?Math.random(),

y:?360?*?Math.random(),

z:?360?*?Math.random()

});

};

Build.prototype.upd?=?函数()?{

cam.obj.x?+=?(this.toX?-?cam.obj.x)?*?0.05;

cam.obj.y?+=?(this.toY?-?cam.obj.y)?*?0.05;

};

Build.prototype.draw?=?函数()?{

这个。$.clearRect(0,0,?this.canvas.width,?this . canvas . height);

cam . upd();

this.rotObj.x?+=?0.1;

this.rotObj.y?+=?0.1;

this.rotObj.z?+=?0.1;

为了什么?(var?我?=?0;?我?& lt?this . varr . length;?i++)?{

为了什么?(var?瓦尔。在?this.calc[i])?{

如果?(this.calc[i]。hasOwnProperty(val))?{

this.calc[i][val]?+=?this.vel

如果?(this.calc[i][val)?& gt?this.lim)?this.calc[i][val]?=?0;

}

}

this.varr[i].transIn.pos?=?{

x:?this.diff?*?Math.cos(this.calc[i])。x?*?数学。圆周率?/?180),

y:?this.diff?*?Math.sin(this.calc[i])。y?*?数学。圆周率?/?180),

z:?this.diff?*?Math.sin(this.calc[i])。z?*?数学。圆周率?/?180)

};

this.varr[i].transIn.rot?=?this.rotObj

this.varr[i].transIn.sz?=?this.objSz

this.varr[i]。vupd();

如果?(this.varr[i].transOut.p?& lt?0)?继续;

var?g?=?这个。$.createaradialgradient(this . varr[I]. transout . x,?this.varr[i].transOut.y?this.varr[i].transOut.p,?this.varr[i].transOut.x,?this.varr[i].transOut.y?this.varr[i].transOut.p?*?2);

这个。$.globalCompositeOperation?=?打火机';

g.addColorStop(0,hsla(255,?255%,?255%,?1)');

g.addColorStop(.5,?HSLA(’?+?(我?+?2)?+?',85%,?40%,1)');

g.addColorStop(1,?HSLA(’?+?(一)?+?',85%,?40%,.5)');

这个。$.fillStyle?=?g;

这个。$.begin path();

这个。$.arc(this.varr[i].transOut.x,?this.varr[i].transOut.y?this.varr[i].transOut.p?*?2,?0,?数学。圆周率?*?2,?假);

这个。$.fill();

这个。$.close path();

}

};

Build.prototype.anim?=?函数()?{

window.requestAnimationFrame?=?(函数()?{

回归?window.requestAnimationFrame?||

函数(回调,?元素)?{

window.setTimeout(回调,?1000?/?60);

};

})();

var?动漫?=?函数()?{

this . upd();

this . draw();

window . requestanimationframe(anim);

}.绑定(这个);

window . requestanimationframe(anim);

};

Build.prototype.run?=?函数()?{

this . anim();

window . addevent listener(' mousemove ',?功能(e)?{

这个。毒理?=?(e.clientX?-?这个.画布.宽度?/?2)?*?-0.8;

这个玩具?=?(e.clientY?-?这个.画布.高度?/?2)?*?0.8;

}.绑定(这个));

window . addevent listener(' touch move ',?功能(e)?{

如果?(event.cancelable)?{

如果?(!event.defaultPrevented)?{

event . prevent default();

}

}

这个。毒理?=?(e.touches[0])。clientX?-?这个.画布.宽度?/?2)?*?-0.8;

这个玩具?=?(e.touches[0])。客户?-?这个.画布.高度?/?2)?*?0.8;

}.绑定(这个));

window . addevent listener(' mousedown ',?功能(e)?{

为了什么?(var?我?=?0;?我?& lt?100;?i++)?{

this . add();

}

}.绑定(这个));

window . addevent listener(' touch start ',?功能(e)?{

如果?(event.cancelable)?{

如果?(!event.defaultPrevented)?{

event . prevent default();

}

}

为了什么?(var?我?=?0;?我?& lt?100;?i++)?{

this . add();

}

}.绑定(这个));

};

var?app?=?新的?build();

app . run();

})();

window . addevent listener(' resize ',?函数()?{

画布宽度?=?w?=?window.innerWidth

帆布。高度?=?h?=?window.innerHeight

},?假);