1

所以,我用 JavaScript 做了这个简单的 4dof 体素算法,我为自己感到很自豪,但是我没有足够的时间来调试,我已经失去了几天的睡眠,但是我注意到它运行得相对缓慢.

现在,有明显的 %-scaling 和 setInterval 循环减慢了它的速度,但我只在 100 个体素上获得了不到 20 FPS,其中大部分甚至不在屏幕上。

请原谅下面的代码,它是为我原始的小游戏引擎改编的,所以它不会在自己的页面上运行,但你可以在这个网址(http://nextgengame.webs.com/fun/sandbox. .htm)。

world=new Array();

for(i=0;i<100;i++){
world[i]=[Math.random()*50-25,-3,Math.random()*50-25,['#FFFFFF','#FF0000','#00FF00','#0000FF','#FFFF33'][Math.round(Math.random()*4)]];
}

r=0;
camx=0;
camy=0;
camz=0;

fps=0;
frames=0;

window.setInterval(function(){
fps=frames;
frames=0;
},1000);

window.setInterval(function(){;
r+=0.02;
if(r>Math.PI*2)r=0;

points=[];

for(i=0;i<world.length;i++){;
u=world[i];
x1=u[0]-camx;
z1=u[2]-camz;
z2=x1*Math.sin(r)+z1*Math.cos(r);
z3=Math.round(z2);
if(!points[z3])points[z3]=[];
points[z3][points[z3].length]=[x1*Math.cos(r)-z1*Math.sin(r),u[1]-camy,z2,u[3]];
};

for(z=points.length-1;z>=0;z--){;
t=points[z];
if(t){;
for(i=0;i<t.length;i++){;
u=t[i];
z1=u[2];
z2=0-z1;
s=69/z1;
h=s*-0.5+50;
drawBox(u[0]/z1*50+h,u[1]/z2*50+h,s,s,u[3]);
};
};
};
frames+=1;
centertext(50,0,String(fps),'#FFFFFF');
sync();
},33);

这几乎不足以制作风景或任何东西,我希望获得至少 10 FPS 的提升。

这是没有旋转的样子:

world=[];
points=[];
for(i=0;i<100;i++){
world[i]=[Math.random()*50-25,-3,Math.random()*50-25,['#FFFFFF','#FF0000','#00FF00','#0000FF','#FFFF33'][Math.round(Math.random()*4)]];
}

r=0;
camx=0;
camy=0;
camz=0;

fps=0;
frames=0;

window.setInterval(function(){
fps=frames;
frames=0;
},1000);


for(i=0;i<world.length;i++){;
u=world[i];
z3=Math.round(u[2]);
if(!points[z3])points[z3]=[];
points[z3][points[z3].length]=u;
};

window.setInterval(function(){;

for(z=points.length-1;z>=0;z--){;
t=points[z];
if(t){;
for(i=0;i<t.length;i++){;
u=t[i];
z1=u[2];
z2=0-z1;
s=69/z1;
h=s*-0.5+50;
drawBox(u[0]/z1*50+h,u[1]/z2*50+h,s,s,u[3]);
};
};
};
frames+=1;
centertext(50,0,String(fps),'#FFFFFF');
sync();
},33);

你会相信吗,它仍然以大致相同的速度运行!最多增加4 FPS!

如果有人能更快地运行它,那真的会让我很开心。

4

2 回答 2

3

一件显而易见的事情是为您的辐射值预先计算值,这意味着您将拥有两个具有正弦和余弦的数组,增量为 0.02,最大为 2 x pi(这是一个完整的圆)。

这些计算对引擎来说真的很重。

此外,您正在为动画使用 setInterval,但是以 33 毫秒的间隔,这使您的最大帧率为 30 fps。setInterval 的时间也不是一个精确的测量值,因为它可能会被其他因素(其他计时器等)延迟,所以也许你最好尽快运行它们并将动画调整为 fps反而?

并使用一个低值的 setTimeout 来释放引擎以执行帧之间的其他任务,而不是耗尽 CPU。

于 2011-07-21T08:04:04.177 回答
0

正如上面的 ThiefMaster 所写,使用局部变量(参见http://www.webreference.com/programming/javascript/jkm3)。循环中有很多计算。其中一些可以预先计算吗?您真的需要所有这些变量,还是可以通过编写稍微复杂的表达式来省略临时变量?

于 2011-07-21T08:02:49.547 回答