Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node.js+;websocket服务器?_Javascript_Node.js_Sockets_Websocket - Fatal编程技术网

Javascript 在Node.js+;websocket服务器?

Javascript 在Node.js+;websocket服务器?,javascript,node.js,sockets,websocket,Javascript,Node.js,Sockets,Websocket,根据我的研究,WebSocket是在客户端和服务器之间快速发送数据的可靠方式,因为它没有HTTP开销 socket.io示例显示仅在套接字消息传递期间发生的逻辑: 在实时游戏中,逻辑需要发生在套接字连接之外,例如移动怪物、投射物、计时器等 我想,任何一个好的解决方案,对于一个游戏实例,都可以很好地用于多个游戏实例 Node.jsasync.each()和async.parallel()是否可以工作 我想保持一个一致的内部时钟或“帧”速率来更新游戏逻辑 在客户端,我可以使用 loop() {

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

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

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

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

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));
}
loop(){
this.now=Date.now();
var delta=this.now-this.last;
this.last=this.now;
this.dt=this.dt+δ;
如果(本次dt<本次费率){
window.requestAnimationFrame(this.loop.bind(this));
返回;
}否则{
this.game.loop();
这个.draw();
this.dt=this.dt-this.rate;
}
此.game.loopKeyboardInput(此.key_按下了地图);
window.requestAnimationFrame(this.loop.bind(this));
}
用于跟踪增量时间


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

类似的简单操作异步运行游戏循环方法,允许服务器尽可能快地更新游戏状态(目前我们使用setImmediate立即对循环进行排队,如果您愿意,您可能可以放松),更新socket更新时发送的中心状态,我们的服务器将继续在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();
可在此处找到完整的工作示例: