Python Pygame Клиент / Сервер работает медленно - PullRequest
3 голосов
/ 27 апреля 2020

На Youtube я нашел базовую c пробел «invaders space pygame», и я хочу изменить его так, чтобы на данный момент сервер выполнял всю обработку и рисование, а клиент отправлял только ввод с клавиатуры (все выполняются на локальном хосте). Проблема в том, что игра перестала отвечать на запросы после того, как я реализовал этот механизм. Похоже, что задержка составляет около 1 секунды после того, как я нажимаю клавишу, когда корабль действительно движется (при запуске игры из pycharm, когда он запускается из cmd, это намного хуже).

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

Я также наблюдал за Ethe rnet traffi c в wireshark, и, кажется, было отправлено о 60-70 пакетов в секунду.

Вот ссылка на github со всеми необходимыми вещами: https://github.com/PaaulFarcas/C-S-Game

1 Ответ

2 голосов
/ 29 апреля 2020

Я ожидаю, что этот код в основном l oop является проблемой:

    recv = conn.recv(661)
    keys = pickle.loads(recv)

Функция сокета conn.recv() будет блокировать до получения 661 байта, или там это некоторое событие сокета (например, закрытие). Таким образом, ваша программа блокирует каждую итерацию основного l oop в ожидании поступления данных.

Вы можете попробовать использовать socket.setblocking( False ) согласно руководству,

Однако я предпочитаю использовать модуль select ( ручная ссылка ), так как мне нравится лучший уровень контроля, который он дает. В основном вы можете использовать его, чтобы узнать, поступили ли какие-либо данные в сокет (или если есть ошибка). Это дает вам простой select-read-buffer type logi c l oop:

procedure receiveSocketData
    Use select on the socket, with an immediate timeout.
    Did select indicate any data arrived on my socket?
        Read the data, appending it to a Rx-buffer
        Does the Rx-buffer contain enough for a whole packet?
            take the packet-chunk from the head of the Rx-buffer
            decode & return it
        Else
            Keep the Rx-Buffer somewhere safe
            return None
    Did any errors happen on my socket
        clear Rx-Buffer
        close socket
        return error

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...