winsock recv가 느리다는 오류 코드를 통해 전달될 수 있습니다. 이 번거로움을 해결할 수 있는 여러 가지 방법이 계속 있으며 곧 하나를 다룰 것입니다.

안녕하세요 저는 Python을 처음 사용합니다. 나는 파이 게임 모듈이있는 간단한 LAN 스포츠 (나에게는 쉽지 않음)입니다.

여기에 큰 딜레마가 있습니다. 저는 개인용 컴퓨터가 두 대 있습니다(하나는 Intel Atom 넷북, 다른 하나는 Apple i5 NTB). 초당 최소 5프레임을 저장하고 싶습니다(넷북은 NTB 속도를 늦추지 만 그다지 많지는 않습니다. 초당 최대 1.5 프레임이 제공됨). 그러나 나는 recv() 2병을 호출합니다. 0~5초 걸립니다. 개별 유닛. 우리는 강력한 Wi-Fi 신호를 가지고 있으며 라우터는 300Mbps의 요금을 가지고 있으며 이 소년은 거의 500자의 짧은 메시지를 보냅니다. 당신이 경험할 수 있듯이, 당신은 i time.clock()을 사용하고 있습니다.

시간 측정

다음은 실제로 i5 NTB에서 작동하는 “서버측” 코드입니다.

  1 이상:    계속 진행하는 것은 time.clock()과 같습니다.    messagelen은 c.recv(4) 다음 음성 목표의 숫자 길이를 의미합니다(4자 고정).   "" Messagelen을 통해 모든 방법:        Messagelen은 Messagelen.replace("", "")를 의미합니다.    location CPickle = .loads (c.recv (int (messagelen))) number 대부분의 화살 목록, 다른 플레이어의 상태 및 게임 맵과 관련된 진화    arrowmod = 메시지 [0]    모드탱크포산 = 메시지 [1]   Removelistmod = 메시지 [2]    Removelistmod에서 나를 위해 :        노력하다:             하이킹 삭제 (i)        ValueError보다 추가:            무작위를 제거합니다. (그래요)    인쇄 time.clock() 1 시작    tosendlist는 []와 같습니다.    len (화살표) == 0: # 그러나 일반적으로 화살표가 없으면 빈 목록이 추가될 가능성이 큽니다.        tosendlist.append([])    또 다른:       Tosendlist .append(화살표)    tosendlist.append ([zeltankpos, 360-Winkel])    if 아마도 len (removelist) == 0: 숫자 지도에 연결된 버튼이 없으면 일반적으로 빈 목록이 추가될 것입니다.        tosendlist.append([])    또 다른:       Tosendlist .append(목록 삭제)        억제 목록은 []와 같습니다.    tosend는 cPickle.dumps(tosendlist)와 같습니다.    tosendlen은 str(len(보내기))을 의미합니다.    len(tosendlen) <4일 때:        tosendlen + = ""   C .sendall (tosendlen) # 클라이언트가 길이를 알려줍니다.    c.sendall(tosend) 번호 정확한 메시지 보내기(덤프 재생 목록) - 클라이언트   ... NTB에서 0.05초 미만이 소요되는 다양한 기능 

다음은 "클라이언트" 스포츠 규칙입니다(플립 장치만 해당 - 동전 보내기/받기):

1에 대한 <사전> <코드>: tosendlist = [] if ever len (화살표) == 0: # 거의 항상 화살표가 없는 경우, 대략적으로 빈 목록을 추가합니다. tosendlist.append([]) 또 다른: Tosendlist .append(화살표) tosendlist.append ([zeltankpos, 360-Winkel]) 1차 의료 제공자 len(removelist) == 0: 숫자 맵 근처에 변경 사항이 없으면 첨부된 포함만 제거됩니다. tosendlist.append([]) 또 다른: Tosendlist .add(목록 삭제) 억제 목록은 []를 의미합니다. tosend= cPickle.dumps(tosendlist) tosendlen은 str(len(보내기))과 같습니다. 사실 len(tosendlen) <4: tosendlen + = "" s.sendall (tosendlen) # 성공적으로 서버에 길이를 보냅니다. s.sendall(tosend) 번호 서버에 별도의 메시지(덤프 재생 목록)를 보냅니다. 시작 = hour.clock() messagelen = s.recv(4) 다음 이메일과 동일한 길이의 숫자(8자 고정) 그러나 "Messagelen 내부: Messagelen은 Messagelen.replace("", "")와 매우 유사합니다. CPickle 메시지는 .loads(s.recv (int (messagelen)))를 의미합니다. # 화살표 목록, 거의 모든 기타 시스템 위치 및 제목 맵의 변경 사항 arrowmod는 메시지 [0]을 나타내는 것 같습니다 모드탱크포산은 메시지를 의미합니다 [1] Removelistmod = 메시지 [2] Removelistmod에서 i를 만드는 데 도움이 됩니다. 노력하다: 하이킹을 문지르다 (i) ValueError 때문에 제외: 깨끗한 랜덤. (그래요) Time.clock () 세부 정보 1 ) 시작 ... 불필요한 넷북에서의 경쟁 <0.17초
winsock recv slow

예를 들어, 내가 간행물을 따르면 특정 i5 장치의 단 하나의 장치(소켓 모듈 없음)에서 게임의 단일 시스템 버전을 실행할 수 있습니다. 지도의 왼쪽 상단 모서리에는 초당 50피트가 있고 오른쪽 하단 모서리에는 25fps가 있습니다(1000x1000픽셀 거리 지도에는 5x5픽셀 정사각형이 포함되어 있습니다. 실제로는 너무 큰 좌표로 인해 느려지지만 할 수는 없습니다. 그것은 매우 강할 수 있다고 생각합니다. 그건 그렇고, Recv는 우리 맵과 관련이있는 오른쪽 하단의 구조에서 오랜 시간 동안 LAN 게임으로 작동했습니다.이 특정 시간은 거의 동일합니다)Atom 넷북에서 4-8 FPS가 있습니다.

winsock recv slow

고객이 왜 그렇게 느릴 수 있는지 개인적으로 말해 줄 수 있습니까? 프로그램은 동기화 재생 중 하나는 더 빠르고 다른 하나는 더 느리지 만 대부분은 예상 할 수 없으며 최대 지연 시간은 0.17 초가 될 것입니다. 그렇죠? 그리고 어떤 장기 통화가 가장 빠른 컴퓨터와 관련해서만 발생한다는 사실은 말할 것도 없습니다.또한 보내기/받기 기능이 어떻게 작동하는지 잘 모르겠습니다. 메인 센달이 말 그대로 시간만 걸리는 것이 아니라 찾는데 0.5초가 걸린다는 사실이 이상하다. 모든 것을 우편으로 보낼 수 있습니다제공자 세트가 진행되는 동안 현재 독방을 백그라운드로 보내는 테스트.