[英]Looping through game objects on a Node.js + websocket server?
根據我的研究,websockets 是一種在客戶端和服務器之間快速發送數據的可靠方式,因為沒有 HTTP 開銷。
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));
}
用於跟蹤增量時間。
如何在服務器上做類似的事情?
像這樣簡單的事情異步運行游戲循環方法,允許服務器盡快更新游戲狀態(目前我們使用 setImmediate 立即將循環排隊,如果你願意,你可以放松一下),更新中心狀態,將在套接字更新時發送,我們的服務器繼續前進並在套接字 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.