繁体   English   中英

nodejs服务器端仿真

[英]nodejs server-side simulation

我正在尝试创建一个nodejs服务器,在其中运行一个简单的x / y世界,客户端可以从中推送/拉取数据。 如果仅在box2d之类的客户端上进行这样的世界模拟,则将使用setTimeout函数,该函数将调用step函数。 当我在nodejs中尝试时,这不起作用。 服务器因错误“ RangeError:超出最大调用堆栈大小”而崩溃。

这是我的server.js。 world参数是路由器可以操纵的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运行仿真?

您不能像尝试执行的那样在循环中调用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的另一种方法是只向服务器发出请求。 您可以使用curl或使用单元测试框架(例如http://visionmedia.github.com/mocha/)手动完成此操作。

我在其他答案上读了评论,但我相信您的最初想法是正确的。 问题是您正在setTimeout调用中立即调用该函数,从而导致无限递归。

发生这种情况是因为您这样调用step_world:

step_world(world, step)

每次调用setTimeout时。 试试这个

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

它用参数world和step之后的step调用step_world。 获得相同结果的另一种方法:

setTimeout(function() {
    step_world(world, step);
}, 1000/30);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM