1

我用多人游戏构建了一个小游戏,我的问题是当我发送子弹时,当它超过大约 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 坐标的更新发生在客户端中。

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

4

1 回答 1

0

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

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

如果您对我们发送(或请求!)的数据包不小心,很容易使网络连接完全饱和,因此我们通过限制发送(和请求)更新的频率来对冲我们的机会。

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

我们可以为每一个小动作发送更新,但我们会将最后的更新价值合并到一个数据包中,从而大大减少我们的带宽使用。

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

在将捆绑的数据发送到每个客户端之前,我会首先尝试将每个子弹的数据捆绑在一起,这将大大减少发送出去的单个数据包的数量。此外,如果您不是,请确保您没有在 love.update 中发送数据包,这会被非常非常频繁地调用。相反,创建一个单独的函数来通过网络进行更新,并使用计时器大约每 100 毫秒调用一次。

让我知道是否已经在代码中考虑了这些,或者向我们展示您的网络代码的更大上下文。

于 2014-04-14T01:01:59.933 回答