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