Skip to content

nodejs作為server在超過24人連線時同步會產生延遲 #35

@z20818z

Description

@z20818z

感謝使用 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions