我正在尝试使用three.js 纠正一个函数。每件事都按预期工作,但在运行该功能 20-30 秒后,FPS 会大幅下降。该函数设置为移动精灵,然后在精灵到达目的地后将其销毁。然后它在随机位置生成一个新的精灵。在移动精灵之前,它以大约 30 FPS 的速度移动。当我开始移动精灵时,FPS 下降到 20 的低点。大约 20 到 30 秒后,它大约是 9。如果我停止移动精灵,FPS 会恢复到 30。但是如果我尝试再次移动精灵而不是重复之前的过程,它就会马上回到大约 9。现在我知道 javascript 是一种垃圾收集语言,所以我认为它只需要一些时间来清理。但即使我让它静置 10 分钟,它仍然会立即回到 9 FPS。另一方面,如果我重新加载页面,整个过程就会重新开始。我还尝试只移动精灵而不是破坏它并重新生成,但我遇到了同样的问题。我也尝试使用 .dispose 方法,但没有运气。这是代码。
function spriteAI1() {
//console.log(c2Sprite.position.x);
//console.log(ranLocX);
//console.log(ranTen);
console.log(c2Sprite.position);
//var ranTen = Math.floor((Math.random()*8)+2);
if (c2Sprite.position.x > 30 && c2Sprite.position.x <= 450) {
//var ranTen = Math.floor((Math.random()*8)+1);
c2Sprite.translateX( -6 );
} else if (c2Sprite.position.y > 30 && c2Sprite.position.y <= 250) {
//var ranTen = Math.floor((Math.random()*8)+1);
c2Sprite.translateY( -6 );
} else if (c2Sprite.position.z > 30 && c2Sprite.position.z <= 350) {
//var ranTen = Math.floor((Math.random()*8)+1);
c2Sprite.translateZ( -6 );
} else if (c2Sprite.position.x < -30 && c2Sprite.position.x >= -450) {
//var ranTen = Math.floor((Math.random()*8)+1);
c2Sprite.translateX( 6 );
} else if (c2Sprite.position.y < -30 && c2Sprite.position.y >= -250) {
//var ranTen = Math.floor((Math.random()*8)+1);
c2Sprite.translateY( 6 );
} else if (c2Sprite.position.z < -30 && c2Sprite.position.z >= -350) {
//var ranTen = Math.floor((Math.random()*8)+1);
c2Sprite.translateZ( 6 );
} else if (c2Sprite.position.x < 31 && c2Sprite.position.y < 31 && c2Sprite.position.z < 31 && c2Sprite.position.x > -31 && c2Sprite.position.y > -31 && c2Sprite.position.z > -31) {
var locX = Math.floor((Math.random()*450)+1);
locX *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
var locY = Math.floor((Math.random()*250)+1);
locY *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
var locZ = Math.floor((Math.random()*350)+1);
locZ *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
//c2Sprite.delete;
scene.remove(c2Sprite);
//console.log("AI1");
//geometry.dispose();
//material.dispose();
//texture.dispose();
c2ImgMaterial.dispose();
c2Sprite.position.set( locX, locY, locZ );
scene.add( c2Sprite );
//c2Sprite.clone;
}
}