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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions