在Node.js+websocket服务器上循环浏览游戏对象



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

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

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

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

我想,任何一个好的解决方案,对于一个游戏实例,都可以很好地用于多个游戏实例。

也许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));
}

用于跟踪增量时间。

如何在服务器上执行类似操作?

像这样简单的东西异步运行游戏循环方法,允许服务器尽可能快地更新游戏状态(目前我们使用setImmediate来立即排队循环,如果你愿意,你可能可以放松),更新将在套接字更新时发送的中心状态,我们的服务器继续前进,在socket 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();

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

相关内容

  • 没有找到相关文章

最新更新