[英]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.