파이썬 게임 서버를 실행 중입니다. 게임은 턴 기반입니다. 플레이어는 지속 시간이 여러 번인 짧은 지연 스파이크에 대해 불평합니다 (즉, 클라이언트가 잠시 대기하고 갑자기 여러 차례 업데이트를 한 번에 받음). 네트워킹 일관성을 향상시킬 수있는 방법을 찾기를 희망하지만, 남겨 둘 것이 확실하지 않습니다.파이썬 게임 서버 - 네트워킹 최적화
- 비동기 소켓
- TCP_NODELAY 플래그 여기
내가 연극받을 방법은 폴링
for (fileno, event) in events:
if fileno == self.server_socket.fileno():
self.add_new_client()
elif event & select.EPOLLIN:
c = self.clients[fileno]
c.read() # reads and processes all input and generates all output
...
을 여기 내가 뭘하는지입니다 그리고 내가 보내는 방법은 다음과 같습니다. 업데이트 :
if turn_finished:
for user in self.clients.itervalues():
for msg in user.queued_messages:
msg = self.encode(msg)
bytes_sent = user.socket.send(msg)
...
때마다, 나는 모든 바이트가 전송 된 것을 확인하고 소켓 오류 로그에 나 소켓에서 읽을 내가 작성합니다. 이러한 것들은 거의 로그에 나타나지 않습니다.
하나의 socket.send() 호출 만 수행하면 더 좋을까요?
Linux (Ubuntu) 호스트에서 확인하거나 조정할 수있는 것이 있습니까?
고객에게 늦게 도착하는 데이터에 문제가있는 것으로 보입니다. 누구든지이 문제를 디버깅하기위한 제안을 할 수 있습니까? 전송 된 메시지에 대한
: 플레이어가 유휴 상태 인 경우
, 그들은 일반적으로 0-3 차례를 업데이트받을받을 수 있습니다. 플레이어가 다른 플레이어와 행동 중일 경우 일반적으로 다른 플레이어 당 2-3 개의 업데이트가 화면에 표시됩니다. 업데이트는 일반적으로 약 < 길이가 20 바이트입니다. 256 및 500-600 바이트 크기의 업데이트 (한 번에 한 명의 플레이어에게만 전송)가 있습니다.
일반적으로 한 번에 약 10-50 명이 활동하며 한 화면에서 10 명을 넘지 않습니다.
P. - 나는 PyPy로 달린다. 나는 윤곽을 잡았고 모든 것이 좋아 보인다. 모든 플레이어의 이동은 < 3ms로 처리되며 서버가 대다수의 시간을 유휴 상태로 만듭니다.
TCP_NODELAY는 이것에 대해 과잉입니다. 실제로는 TCP가 더 큰 패킷을 덜 자주 전송할 수 있기 때문에 성능을 향상시킬 수 있습니다 (패킷 검사 대기 시간 감소, 패킷 손실 가능성 감소, 오버 헤드 감소). – Serdalis
피드백 Serdalis에 감사드립니다. – graw