1

だから、私はこの単純な 4dof ボクセル アルゴリズムを JavaScript で作成しました。私は自分自身を非常に誇りに思っていますが、デバッグするのに十分な時間がなく、数日分の睡眠を失いましたが、実行が比較的遅いことに気付きました。 .

現在、明らかな %-scaling と setInterval ループが速度を低下させていますが、わずか 100 個のボクセルで 20 FPS 未満しか得られず、そのほとんどは画面に表示されていません。

次のコードは申し訳ありませんが、これは私の原始的な小さなゲーム エンジンに適合しているため、独自のページでは実行されませんが、この URL (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

明らかなことの 1 つは、放射値の値を事前に計算しておくことです。つまり、最大 2 x pi (完全な円) まで、0.02 刻みで正弦波と余弦波を含む 2 つの配列が得られます。

これらの計算は、エンジンに非常に負担がかかります。

また、アニメーションに 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 に答える