2015-12-08 6 views
2

Основываясь на моих исследованиях, websockets - это надежный способ быстрой передачи данных между клиентом и сервером, поскольку нет накладных расходов HTTP.Цитирование объектов игры на сервере Node.js + websocket?

socket.io пример показывает логика происходит только в сокет сообщений:

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

В режиме реального времени игры, логика должна произойти за пределами сокетов соединений, например. для перемещения монстров, снарядов, таймеров выключения и т. д.

Я предполагаю, что любое хорошее решение для 1 игрового экземпляра будет хорошо работать для нескольких игровых экземпляров.

Возможно, 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)); 
} 

для отслеживания времени дельты.

Как я могу сделать что-то подобное на сервере?

ответ

2

Что-то простое, как это происходит, асинхронно запускает игровой цикл, позволяя серверу как можно быстрее обновлять состояние игры (в настоящее время мы используем setImmediate для немедленной постановки в очередь на цикл, вы, возможно, можете расслабиться, если хотите), обновление центральное состояние, которое будет отправлено на обновление сокета, наш сервер идет вперед и вспахивает обновление «игрового состояния» (которое в этом случае является типом цикла) за пределами запросов ввода-вывода сокета.

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