2013-10-31 8 views
2

파이썬 게임 서버를 실행 중입니다. 게임은 턴 기반입니다. 플레이어는 지속 시간이 여러 번인 짧은 지연 스파이크에 대해 불평합니다 (즉, 클라이언트가 잠시 대기하고 갑자기 여러 차례 업데이트를 한 번에 받음). 네트워킹 일관성을 향상시킬 수있는 방법을 찾기를 희망하지만, 남겨 둘 것이 확실하지 않습니다.파이썬 게임 서버 - 네트워킹 최적화

  • 비동기 소켓
  • TCP_NODELAY 플래그
  • 여기

내가 연극받을 방법은 폴링

  • 는 epoll을 설정됩니다 :

    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로 처리되며 서버가 대다수의 시간을 유휴 상태로 만듭니다.

  • +1

    TCP_NODELAY는 이것에 대해 과잉입니다. 실제로는 TCP가 더 큰 패킷을 덜 자주 전송할 수 있기 때문에 성능을 향상시킬 수 있습니다 (패킷 검사 대기 시간 감소, 패킷 손실 가능성 감소, 오버 헤드 감소). – Serdalis

    +0

    피드백 Serdalis에 감사드립니다. – graw

    답변

    0

    "멈춤"하는 동안 클라이언트를 디버그하고 무엇을하는지 알아야하는 것처럼 들립니다.

    원인을 이해 한 후에 만 ​​해결책을 찾을 수 있습니다.