2010-08-17 2 views
2

iOS GameKit을 사용하여 서버 응용 프로그램을 구현하는 가장 좋은 방법은 무엇입니까? 어떻게 든 위임 된 모든 이벤트 (데이터 수신 등)에 응답하는 별도의 서버 스레드를 만들어야합니까? NSRunLoops를 사용 하시겠습니까?iPhone GameKit 비동기 서버 패턴

답변

1

필요한 경우가 아니면 스레드를 사용하지 마십시오.

거의 모든 것이 기본적으로 주 스레드의 실행 루프를 사용합니다. 다른 스레드를 사용하지 않고 다른 실행 루프를 (쉽게) 사용할 수 없습니다. — 각 스레드는 최대 하나의 실행 루프를가집니다.

는 (엄밀히 말하면, 대부분의 일들이 일반적으로 메인 스레드가 될 것입니다 현재 실행중인 스레드의 실행 루프 "현재"실행 루프를 사용합니다.)

과거에는 대부분의 PC 게임을 다른 스레드에서 네트워킹 코드를 실행하지 않았습니다. 느린 그래픽 카드로 인해 네트워킹 코드의 성능이 저하되었습니다. 요즘 FPS는 기본적으로 별도의 스레드에서 네트워크 코드를 실행하거나 그렇게 할 수있는 옵션이 있습니다 (Quake 3는 "순수 서버"모드를 가짐). 이렇게하면 게임 물리학이 호스트의 렌더링 성능과 분리되어 일반적으로 좋은 결과를 얻게됩니다.

는 (어떻게 든, 텍스처의 원인 아무것도/등 다시로드 퀘이크 3는 여전히 서버 스레드를 지연.) 별도의 스레드에서 서버를 실행하기 위하여려고하는 경우에, 나는 현지와 통신 제안

" 클라이언트 "를 통해"네트워크 ". 어쨌든 어떤 종류의 네트워크 코드를 작성해야하므로 socketpair(AF_UNIX, SOCK_DGRAM, 0, &sockets)과 같은 것을 사용하십시오 (작동하지 않으면 AF_INET을 시도하고 UDP 소켓처럼 처리하십시오).

GameKit을 사용하여 Bluetooth를 통해 통신 할 필요가 없습니다. Bonjour 서비스 (NSNetService 참조)를 게시하면 GameKit에 사용되는 것과 동일한 Bluetooth PAN을 통해 자동으로 보급됩니다 (GameKit은 Bluetooth를 통해 Bonjour를 통해 실행됩니다). Bonjour와 UDP 만 사용한다면 Bluetooth를 통해 GameKit을 사용하지 않는 이전 장치를 지원하고 크로스 플랫폼으로 만드는 것이 더 쉽습니다.

(GameKit에는 추가 메쉬 네트워킹 기능이있어서 A와 B는 C와 릴레이를 사용하여 통신 할 수 있다고 생각합니다.이 테스트를 거치지 않았습니다.) 몹시 중요하지 않습니다.