-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
感謝使用 Node.js Taiwan AMA,以下附上簡單提問範例供參考,請把內容改成你自己遇到的問題
目的
<<我希望做一個 多人上線的遊戲伺服器 ,達成即時同步的效果>>
使用的工具
<<我在 Windows 下使用 npm 安裝 node.js 10.16 >>
操作流程
<<我下了 node dive_server.js 運行>>
遇到的問題
<<少人連線的時候不會出現延遲,但是在超過24人連線之後她會出現延遲的現象>>
嘗試過的解法
<<我嘗試過把 變數減少,但是在運行超過28台主機的時候便會出現延遲>>
程式碼
data_object.js
this.server_update = function(id,value){
socket.emit('update_data',{
'room_id':self.room_id,
'player_data':id,
'get_value':value,
'get_number':value_object['player_num']});
}
dive_server.js
var express = require("express");
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http,{
pingInterval: 1000,
pingTimeout: 2000
});
var mysql = require('mysql');
var con;
var db_config = {
host: "localhost",
user: "root",
password: "",
post:'3306'
};
app.use(express.static('public'));
socket.on('update_data',function(data){
Object.keys(data).forEach(function(key) { // 逐行列出標頭
switch(key){
case 'join_room':
socket.join(data.room_id); //連線時候4人順便將它設定群組
socket.join(data.join_same_team); //同對1房間
break;
case 'player_data':
var attr_data = { 'id':data['player_data'],
'value':data['get_value']};
io.to(data.room_id).emit('other_player_change', attr_data); //將資訊傳給其他連線者的的IO
break;
case 'player_data_only': //不傳給自己
var attr_data = { 'id':data['player_data_only'],
'value':data['get_value']};
socket.broadcast.to(data.room_id).emit('other_player_change', attr_data); //將資訊傳給其他連線者的的IO
break;
case 'same_team':
var attr_data = { 'id':data['same_team_id'],
'value':data['get_value'],
'another_value':data['another_value']};
io.to(data.same_team).emit('other_player_change', attr_data); //將資訊傳給同隊友
io.to(data.another_team).emit('other_player_change', { 'id':data['same_team_id'],'value':data['another_value']});//將資訊傳給另外一隊同隊友
break;
case 'team_msg':
var attr_data = {'msg':data.msg,
'nickname':data.nickname,
'index':data.index};
io.to(data.team_msg).emit('team_msg', attr_data); //將資訊傳給同隊友
break;
case 'same_team_game_over':
var attr_data = { 'dead':data['dead']};
io.to(data.room_id).emit('game_over_msg', attr_data); //將資訊傳給其他連線者的dive的IO
break;
}
})
});
html js
var pass = player_one_value[1]; // 裡面有十幾個變數
for(var e = 0;e<pass.length;e++){
var value = diveLinker.getAttr(pass[e]);
if(data_array[e] != value){
project_data.server_update_only(pass[e],value);
}else{
data_array[e] = value;
}
}
Metadata
Metadata
Assignees
Labels
No labels