Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 优化某些代码时遇到问题_Javascript_Three.js - Fatal编程技术网

Javascript 优化某些代码时遇到问题

Javascript 优化某些代码时遇到问题,javascript,three.js,Javascript,Three.js,我正在尝试使用three.js更正一个函数。每件事都按预期工作,但在运行该功能20-30秒后,FPS显著下降。该函数设置为移动精灵,然后在到达目的地后销毁精灵。然后它在一个随机的位置产生一个新的精灵。在移动精灵之前,它以每秒30帧的速度移动。当我开始移动精灵时,FPS下降到低20。大约20到30秒后,它在9点左右。如果我停止移动精灵,FPS将恢复到30。但是如果我尝试再次移动精灵,而不是重复前面的过程,它会返回到大约9。现在我知道javascript是一种垃圾收集语言,所以我想它只是需要一些时间

我正在尝试使用three.js更正一个函数。每件事都按预期工作,但在运行该功能20-30秒后,FPS显著下降。该函数设置为移动精灵,然后在到达目的地后销毁精灵。然后它在一个随机的位置产生一个新的精灵。在移动精灵之前,它以每秒30帧的速度移动。当我开始移动精灵时,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;
            }
        }   
函数spriteAI1(){
//console.log(c2Sprite.position.x);
//控制台日志(ranLocX);
//控制台日志(ranTen);
控制台日志(c2Sprite.position);
//var ranTen=数学地板((数学随机()*8)+2);
if(c2Sprite.position.x>30&&c2Sprite.position.x30&&c2Sprite.position.y30&&c2Sprite.position.z=-450){
//var ranTen=数学地板((数学随机()*8)+1);
c2Sprite.translateX(6);
}否则如果(c2Sprite.position.y<-30&&c2Sprite.position.y>=-250){
//var ranTen=数学地板((数学随机()*8)+1);
c2Sprite.translateY(6);
}else if(c2Sprite.position.z<-30&&c2Sprite.position.z>=-350){
//var ranTen=数学地板((数学随机()*8)+1);
c2Sprite.translateZ(6);
}如果(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=数学地板((数学随机()*450)+1);
locX*=数学地板(数学随机()*2)==1?1:-1;
var locY=数学楼层((数学随机()*250)+1);
locY*=数学楼层(数学随机()*2)==1?1:-1;
var locZ=数学地板((数学随机()*350)+1);
locZ*=数学楼层(数学随机()*2)==1?1:-1;
//c2Sprite.delete;
场景。移除(c2Sprite);
//控制台日志(“AI1”);
//geometry.dispose();
//材料。处理();
//texture.dispose();
c2ImgMaterial.dispose();
c2Sprite.position.set(locX、locY、locZ);
场景。添加(c2Sprite);
//c2Sprite.clone;
}
}   

您多久调用一次此函数?周围的代码是什么?您是否使用开发工具检查了框架?测试时不断调用该函数。周围的代码只是创建了一个three.js场景和用户控件。我没有使用任何开发工具。我对编程很陌生。奇怪的是,性能下降了这么多,唯一的解决办法就是重新加载。我使用任务管理器来检查使用了多少内存。当函数运行时,它会上升,但在停止约10秒后会恢复正常。所以我不认为这是内存泄漏。在我看来,每次我移除精灵并添加一个新精灵时,第一个精灵就不可见了。这是一个内存泄漏。如果您想要恒定的fps,那么在运行循环期间内存不应该不断增加。此外,它还将有助于看到周围的环境code@Wyatt我想出来了。这真是个愚蠢的错误。我使用console.log来检查position.x position.y和position.z的值,随着时间的推移,日志变得越来越大,影响了我的FPS,这就是为什么我必须重新加载页面来修复问题。对不起,浪费了你的时间。