0

クライアントがデータをプッシュ/プルできる単純なx/yワールドを実行しているnodejsサーバーを作成しようとしています。このような世界シミュレーションをクライアント側で box2d か何かだけで行う場合は、ステップ関数を呼び出す setTimeout 関数を使用します。nodejsで試してみると、これは機能しません。サーバーが「RangeError: 最大コール スタック サイズを超えました」というエラーでクラッシュします。

これは私のserver.jsです。world パラメータは、ルーターが操作できるワールド オブジェクトのインスタンスです。

var http = require("http");

function start(world, router, handlers) {

function onRequest(request, response) {
    router(world, handlers, request, response);

}

http.createServer(onRequest).listen(8888);
console.log("ServerStarted. Listens to 8888.");

step_world(world,0);
}

function step_world(world,step) {
world.update();
step++;
console.log("updating world: " + step);
step_world(world,step);
//setTimeout(step_world(world,step),1000/30);
}

exports.start = start;

では、nodejsでシミュレーションを実行するにはどうすればよいですか?

4

2 に答える 2

1

あなたがやろうとしているように setTimeout をループで呼び出すことができない理由は、何千ものタイマーを非常に迅速に (そして再帰的に) 作成しているためです。setTimeout を使用する場合は、step_world関数内ではなく関数の外に配置してください。

このようなものがうまくいくはずです。スタック オーバーフローを引き起こすことなく、1000/30 ミリ秒ごとに step_world 関数を呼び出します。

function step_world(world,step) {
world.update();
step++;
console.log("updating world: " + step);
}

setTimeout(step_world(world,step),1000/30);
// or setInterval(...)

Node をテストするもう 1 つの方法は、サーバーにリクエストを送信することです。これは、 http://visionmedia.github.com/mocha/curlのような単体テスト フレームワークを使用して手動で行うことができます。

于 2012-05-06T18:12:03.973 に答える
0

他の回答に対するコメントを読みましたが、元のアイデアは正しかったと思います。問題は、 setTimeout 呼び出しで関数を呼び出すと、すぐに無限再帰が発生することです。

これは、次のように step_world を呼び出すために発生します。

step_world(world, step)

setTimeout を呼び出すたびに。代わりにこれを試してください

setTimeout(step_world, 1000/30, world, step)

パラメータ world を指定して step_world を呼び出し、ディールの後にステップします。同じ結果を得る別の方法:

setTimeout(function() {
    step_world(world, step);
}, 1000/30);
于 2012-05-06T23:42:46.217 に答える