2013-05-29 16 views
1

我建設有多人一個小遊戲,我的問題是,當我發子彈是存在時,它的大約80同時發送大量數據的滯後

我使用UDP類型超過量的滯後,我連接代碼服務器:

udp = socket.udp() 
udp:settimeout(0) 
udp:setpeername(address, port) 

我UDP:子彈發送到服務器:

udp:send('%S03'..startX..','..startY..','..bulletAngleX..','..bulletAngleY) 

服務器:Reteveing子彈並將它們發送回客戶端的休息:

elseif code == '%S03' then 

     local bulleta = string.gmatch(params, "[^,]+") 

     local sX = tonumber(bulleta()) 
     local sY = tonumber(bulleta()) 
     local dX = tonumber(bulleta()) 
     local dY = tonumber(bulleta()) 


     for i,v in ipairs(clients) do 
      udp:sendto('%C01'..math.random(120, 200)..','..sX..','..sY..','..dX..','..dY, v['ip'], tonumber(v['port'])) 
     end 
    end 

客戶:讓子彈數據,並在表中創建它們:

 elseif code == '%C01' then 
     local xy = string.gmatch(re, "[^,]+") 
     local dis = tonumber(xy()) 
     local xStart = tonumber(xy()) 
     local yStart = tonumber(xy()) 
     local xAngle = tonumber(xy()) 
     local yAngle = tonumber(xy()) 
     table.insert(bullets, {distance = dis, sX = xStart, sY = yStart, x = xStart, y = yStart, dx = xAngle, dy = yAngle}) 

x和子彈Y的cordition的更新在客戶端發生時,他得到的子彈X, y,並在子彈距離距離第一個位置超過300像素時移除子彈。

但我的問題仍然存在,當我拍攝滯後..

回答

0

我不是非常熟悉網絡的細節,但它很可能你只是發送數據包太多了,需要捆綁或以其他方式壓縮發送的數據以減少發送的UDP消息的總數。

this Love2d networking tutorial(也使用UDP):

這很容易完全飽和的網絡連接,如果你 不小心與我們發送的數據包,所以我們對衝我們的 (或要求!)限制我們發送(和請求)更新的頻率。

(根據記錄,十倍第二被認爲是適合大多數正常 遊戲(包括許多MMO遊戲),你不應曾經真的需要更多的 超過30更新第二,即使是快節奏遊戲。

我們可以發送更新每一個小舉動,但我們會鞏固 最後一次更新,這裏值得一成一個單一的數據包,大大降低了我們的 帶寬的使用。

我無法確認在沒有看到所有/更多代碼的情況下是否出現此問題。然而,分別發送這些數據每一顆子彈,爲每一個客戶,每很多次,帶寬使用會變得非常高,最明顯的是在發送數據每發子彈分別

我先試試捆綁爲每顆子彈的數據綁定數據發送到每個客戶端,這將大大降低單個數據包的數量之前一起發送出去。另外,如果你不是,請確保你沒有在love.update中發送數據包,這很常見。取而代之的是,通過網絡更新一個獨立的功能,並使用定時器每100ms只調用一次。

讓我知道如果任何這已經被在代碼中佔了,或者告訴我們您的網絡代碼更大的範圍內。