通过Node.js + websocket服务器上的游戏对象循环播放?

根据我的研究,websockets是在客户端和服务器之间快速发送数据的可靠方法,因为没有HTTP开销。

socket.io示例显示了仅在套接字消息传递期间发生的逻辑:

https://github.com/socketio/socket.io/blob/master/examples/chat/index.js

在实时游戏中,逻辑需要在套接字连接之外发生,例如, 移动怪物,抛射物,计时器等

我想像一个游戏实例的任何好的解决scheme对于多个游戏实例都能很好地工作。

也许Node.js async.each()async.parallel()将工作?

我想保持一致的内部时钟或“帧”比率来更新游戏逻辑。

在客户端,我可以使用

 loop() { this.now = Date.now(); var delta = this.now - this.last; this.last = this.now; this.dt = this.dt + delta; if (this.dt < this.rate) { window.requestAnimationFrame(this.loop.bind(this)); return; } else { this.game.loop(); this.draw(); this.dt = this.dt - this.rate; } this.game.loopKeyboardInput(this.key_pressed_map); window.requestAnimationFrame(this.loop.bind(this)); } 

跟踪时差。

我如何在服务器上做类似的事情?

像这样简单的运行游戏循环方法是asynchronous的,允许服务器尽可能快地更新游戏状态(目前我们使用setImmediate来立即排队,如果你愿意的话可以放松一下),更新中心状态将在套接字更新上发送,我们的服务器继续前进,并在套接字I / O请求之外更新“游戏状态”(在这种情况下,它只是一个循环股票代码)。

 var express = require('express'); var path = require('path'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); app.use(express.static(path.join(__dirname, 'public'))); server.listen(3000, function() { console.log('listening'); }); io.on('connection', function(socket) { console.log('connected'); socket.on('update', function(data) { console.log(data); socket.emit('update', state); }); }); var loopAsync = function() { setImmediate(loop); } function loop() { gameLoops++; var delta = Date.now() - last; last = Date.now(); var currentState = { time: Date.now(), loopDelta: delta, loops: gameLoops }; state = currentState; loopAsync(); } var last = Date.now(); var gameLoops = 0; var state = { time: Date.now(), loopDelta: 0, loops: gameLoops }; loopAsync(); 

完整的工作示例可以在这里find: https : //github.com/StrangeWill/qpexamplecode