根据我的研究,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