发送大量数据时滞后

时间:2013-05-29 12:08:57

标签: tcp lua udp multiplayer love2d

我用多人游戏构建了一个小游戏,我的问题是当我发送子弹时,当它超过80的数量时会出现延迟。

我使用UDP类型,我的连接代码到服务器:

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

我的udp:将子弹发送到服务器:

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

服务器:检索项目符号并将其发送回其他客户端:

    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并在距离第一个位置超过300像素时移除子弹时,客户端会发生子弹的x和y波形更新。

但我的问题仍然是我拍摄时有滞后现象..

1 个答案:

答案 0 :(得分:0)

我对网络详细信息并不十分熟悉,但很可能您只是发送了太多数据包,并且需要捆绑或以其他方式压缩您发送的数据,以减少您发送的UDP消息的总数

来自this Love2d networking tutorial(也使用UDP):

  

如果你这样,很容易让网络连接完全饱和   我们发送(或请求!)的数据包并不小心,所以我们对冲我们的   限制我们发送(和请求)更新的频率的机会。

     

(对于记录,每秒十次被认为对大多数正常人来说是好的   游戏(包括许多MMO),你不应该真的需要更多   即使对于快节奏的游戏,也会超过30秒更新。

     

我们可以为每一个小动作发送更新,但我们会整合   最后更新 - 值得在一个数据包,大大减少我们的   带宽使用。

如果没有看到您的所有/更多代码,我无法确认这是否是问题。但是,每个子弹的数据单独发送给每个客户端,每秒多次,带宽使用率可能会变得非常高,最明显的是发送每个子弹的数据

在将捆绑数据发送到每个客户端之前,我首先尝试将每个项目符号的数据捆绑在一起,这将大大减少发送的单个数据包的数量。另外,如果你不是,请确保你没有发送love.update中的数据包,这种情况非常频繁。相反,建立一个单独的功能来通过网络进行更新,并使用计时器每隔100毫秒调用一次。

如果代码中已经考虑到了这些内容,或者向我们展示网络代码的更大背景,请告诉我。