发送大量数据时出现延迟。

我正在制作一个带有多人游戏的小游戏,我的问题是当我发送子弹数量超过80个时会出现延迟。

我使用的是UDP类型,我的连接代码如下:

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

我的向服务器发送子弹的udp:send:

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时,子弹的更新x和y位置就会发生。当子弹的距离超过300像素时,将删除子弹。

但我的问题仍然是当我射击时会出现延迟。

点赞
用户2245202
用户2245202

我对网络细节不太熟悉,不过很可能您正在发送太多数据包,需要将发送的数据捆绑或压缩,以减少您发送的 UDP 消息的总数。

这个 Love2d 网络教程 中(也使用 UDP):

如果您在发送(或请求)数据包时不小心,很容易完全占满网络连接,因此我们通过限制发送(和请求)更新的频率来保险。

(记录下来,大多数普通游戏(包括许多 MMO 游戏)每秒发送十次数据包已经被认为很好了,您实际上甚至都不需要每秒发送 30 个数据包,即使对于快节奏的游戏也是如此。)

我们可以为每个小移动发送更新,但我们将在这里合并最后一个值得更新的数据为单个数据包,大大减少我们的带宽使用。

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

我首先会尝试将每颗子弹的数据捆绑在一起,然后将捆绑的数据发送给每个客户端,这将大大减少正在发送的单独数据包的数量。此外,在发送数据包时,请确保不要在 love.update 中发送,因为该函数会被非常频繁地调用。相反,创建一个不同的函数用于通过网络更新,并使用定时器仅在大约每 100ms 调用一次该函数。

让我知道代码中是否已经考虑到了这些问题,或者向我们展示更大范围的网络代码。

2014-04-14 01:01:59