Лаги при отправке большого количества данных

Я создаю небольшую игру с мультиплеером, моя проблема заключается в том, что когда я отправляю пули, возникает задержка, когда она превышает количество около 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 пуль происходит в клиенте, когда он получает пули x, y, и удаляет пули, когда они находятся на расстоянии более 300 пикселей от первой позиции.

Но моя проблема все еще в том, что есть лаги, когда я снимаю..


person user2418051    schedule 29.05.2013    source источник


Ответы (1)


Я не очень хорошо знаком с сетевыми деталями, однако вполне вероятно, что вы просто отправляете слишком много пакетов, и вам нужно объединять или иным образом сжимать отправляемые данные, чтобы уменьшить общее количество отправляемых вами сообщений UDP.

Из этого руководства по работе с сетью Love2d (также с использованием UDP):

Очень легко полностью перегрузить сетевое соединение, если вы не будете осторожны с пакетами, которые мы отправляем (или запрашиваем!), поэтому мы ограничиваем наши шансы, ограничивая частоту отправки (и запроса) обновлений.

(Кстати, десять раз в секунду считается хорошим показателем для большинства обычных игр (включая многие MMO), и вам на самом деле никогда не требуется более 30 обновлений в секунду, даже для быстрых игры с темпом.)

Мы могли бы отправлять обновления для каждого маленького шага, но мы объединим последнее обновление в один пакет, что резко сократит использование полосы пропускания.

Я не могу подтвердить, является ли это проблемой, не видя весь/больше вашего кода. Однако при отправке данных для каждой пули отдельно каждому клиенту много раз в секунду использование полосы пропускания может стать очень высоким, особенно при отправке данных для каждой пули отдельно.

Я бы сначала попытался объединить данные для каждой пули, прежде чем отправлять объединенные данные каждому клиенту, что значительно уменьшит количество отправляемых отдельных пакетов. Кроме того, если это не так, убедитесь, что вы не отправляете пакеты в love.update, который вызывается очень и очень часто. Вместо этого создайте отдельную функцию для обновления по сети и используйте таймеры, чтобы вызывать ее примерно раз в 100 мс.

Дайте мне знать, если что-то из этого уже учитывается в коде, или покажите нам более широкий контекст вашего сетевого кода.

person PiGuy    schedule 14.04.2014