2009-12-31 3 views
1

나는 이것에 대해 갈 방법에 대한 조언과 조언을 주로 찾고 있습니다. 나는 내가 생각할 수있는만큼 자세하게 설명 할 것이고 그럴듯한 가능한 접근법에 주목할 것이다.실시간 브라우저 게임 서버

이 목표는 실시간 브라우저 게임을 만드는 것입니다. 제 요구 사항에서 찾은 가장 좋은 방법은 아약스와 함께 "긴 폴링"을 사용하는 것이고, 기본적으로 서버에 요청을 설치합니다. 거기에 서버가 뭔가를 보낼 때까지, 그런 다음 더 많은 데이터를 받기 위해 연결을 다시 설정하십시오. 나의 목적을 위해 이것은 문자 이동뿐만 아니라 채팅 시스템도 처리 할 것이다. IE : 플레이어가 같은 지역에 입장하면 거기에 정보를 보내고이를 알려주는 브라우저 클라이언트를 업데이트하는 응답을 받는다.

위는 구현하기가 비교적 쉽지만 테스트 케이스를 이미 만들었지 만 서버 측에서는 자동 시간 초과가 발생하기 전에 X 시간 동안 루프를 실행합니다. 그리고 다시 빈 문자열을 보내면 다른 연결을 만들 수 있습니다. 이것은 무한 루프를 방지하고 그렇지 않아야하는 경우 리소스를 사용합니다. 클라이언트에 보내는 메시지를 위해 각 루프 사이클에서 데이터베이스를 검색하는 대신 (클라이언트에서 보내는 마지막 메시지보다 수정 된 타임 스탬프가있는 경우) 플랫 파일을 사용합니다. 뭔가 새로운 것을 보내라. 그러나 이것은 또한 비싸지 만 (mysql 데이터베이스를 사용하는 것만 큼 많이는 아니겠습니까?) 초당 두 번 완료되면 믿습니다.

내 생각에이 프로세스는 (속도) C++ 프로그램을 지속적으로 실행하여 새 메시지를 메모리에서 매우 빠르게 조회하는 것이었고 네 번째로 이것은 나에게 보너스를 줄 수 있다는 것입니다. 게임 내에서 서버가보다 실시간의 느낌/접근 방식을 제어 할 수있는 봇을 가지고 있지만 이것이 가능한지, google에 대한 내 검색이 효과가 없다는 단서가 없습니다.

내가 할 수 있기를 가장 좋아하는 접근 방식은 PHP를 사용하여 페이지 등의 렌더링과 제어를 계속하고 ajax 요청을 C++ 응용 프로그램으로 이동시켜야합니다 (항상 실행됩니다) 모든 실시간 측면을 처리 할 수 ​​있습니다.

CGI는 각 요청에 대해 애플리케이션의 새로운 인스턴스를 생성하기 때문에 위의 접근법의 목적을 무효화합니다. 느리고 정확히 원하지 않는 것은 모두 PHP이며, 전환하고 싶지 않습니다. PHP는 (내 지식으로는) 메모리 (숫양)에 물건을 저장할 수 없으며, 네 번째로는 더 잘 맞는 다른 언어를위한 하나의 완전한 언어를 실행합니다.

내가 생각한 또 다른 접근법은 PHP 소켓을 사용하여 C++ 응용 프로그램에 연결하는 것이 었습니다.하지만이 방법이 얼마나 실현 가능성이 있는지는 알 수 없습니다. C++ 응용 프로그램은 기본적으로 봇 (AI) 및 채팅 시스템 메시지를 제어해야합니다. PHP를 통해 봇을 처리하는 방법에 대해서는 전혀 알지 못합니다.

내 의도와 목표가 무엇인지 충분히 설명해 주시길 바랍니다. 누군가 포인터가 있거나 조언을 보내 주시면 답장하고 도와 주시면 대단히 감사하겠습니다. 추가 정보가 필요하면 (내가 뭔가 또는 어떤 것을 잘 커버하지 못했다면), 나는 더 설명하기 위해 기꺼이 노력할 것입니다.

답변

2

반응 속도는 얼마나 빠릅니까? 실시간 액션 게임에 접근하려는 사람들을 위해, AJAX/Comet은 너무 느릴 것입니다. 오버 헤드도 정말 우울합니다.

그런 종류의 일을 진행하는 방법은 아마도 WebSocket이고, 백엔드에 맞춤 서버가있을 것입니다. 그러나 나는 이것이 당신이 C [++]에 의지 할 필요가 있다는 것을 의미하지 않는다고 생각합니다; 병목 현상은 서버 프로세서 성능이 아닌 네트워크가 될 가능성이 큽니다.

필자는 사소한 메시지 복제 시스템을 사용하여 Python SocketServer를 사용하고 있습니다. 필자의 경우 모든 게임 논리는 클라이언트 측에 있으며, 지연에 직면하여 일관된 게임 세계를 유지하는 몇 가지 복잡한 JavaScript가 있습니다. 좀 더 복잡한 서버 측에서는 스크립팅 언어가 아마도 괜찮을 것이라고 생각합니다.

WebSocket이 아직 준비되지 않았습니다. 주류 브라우저 구현은 없습니다. 그동안 WebSocket 인터페이스를 에뮬레이트하는 Flash Socket 백업을 사용하고 있습니다. 플래시 소켓은 프록시를 협상하지 못한다는 점에서 그들 자신의 문제를 가지고 있습니다. 그러나 그들은 빠르며, WebSocket이 적절하게 도착하면 그것들에 대한 필요성이 줄어들 것입니다.

+0

나는 혜성을 들여다 보았고 너무 제한적이라고 생각했다. Travians (포트 8010의 IP 주소에 연결됨)라는 RPG 게임의 긴 폴링 작업을 보았다. 스크립팅 언어의 문제는 지속성이 없다는 것입니다 (올바른 단어라고 생각합니까? 끊임없이 실행되지 않으므로 로봇 상태를 처리하는 것이 문제가됩니까?) travians 접근 방식에 대해 자세히 설명하려면 그들의 긴 폴링은 클라이언트의 JS가 더 처리하는 명령 문자열을 수신합니다. 예를 들어 "MoveChar Steve

+0

스크립팅 언어는 단순히 웹 서버 백엔드가 아닌 지속적인 방법으로 사용할 수 있습니다. 그게 내가 파이썬으로하고있는 일이고, 스크립팅 언어로도 할 수 있습니다 (특히 PHP는 적합하지 않을지라도). 나는 한 줄에 하나의 명령 문자열을 사용한다. 비록 나의 경우에는 '.1 f'와 같은 하위 명령이다. (게임 프레임 15에서 왼쪽 버튼을 누른다.) – bobince

+0

파이썬에 대한 경험이 없기 때문에 처음에는 C++을 선택했습니다. PHP 소켓을 사용하고 각 아약스 요청에서 C++ 응용 프로그램에 연결해야합니까? – Steve

2

게시물을 읽으면 경보 벨이 울립니다.

멀티 스레드 코드에 얼마나 익숙합니까? C++로? 대답이 "매우 좋지 않다"면, 당신이 꽤 큰 덩어리를 씹을 까봐 두려워합니다. 왜 barebones 방식이 아닌 기존의 (시험 및 테스트 된) COMET 서버 구현을 활용하지 않을까요? 어떤 응용 프로그램을 염두에두고 있든, 그것은 comms 구현과는 완전히 분리되어 있어야합니다.

그런 서버를 구현 한 사람으로서, 나는 많은 디자인 반복과 오랜 시간이 걸릴 것이라고 말할 수 있습니다. 그러한 제품을 현실적으로 테스트하는 것은 또한 매우 까다로운 과정입니다.

+0

솔직히 말해서 완전히 멀티 스레드가되는 필요성을 알지 못했습니다.이 이유는 머드 게임 (플레이어가 텔넷을 통해 연결하는 플레이어)에 대한 나의 경험이기 때문에 서버가 멀티 스레드되지 않았습니다 (DNS 조회 만 수행됨). Bobince (아래)가 내 주요 병목 현상이 네트워크가 될 것이라는 점을 언급하면서 자신이 상상 한 자신의 실을 가진 플레이어가 과잉 행동하고 성과를 저해 할 것이라고 상상했다. – Steve

+0

게임 서버를 C++로 작성했다면 속도가 빠르기 때문에 네트워크 IO 처리 측면에서 멀티 스레딩/동시 처리에 익숙해 져야합니다. 공유 상태는 예측할 수없는 시간에 네트워크 IO로 인해/구동되는 방식으로 액세스됩니다. 스레드가 아닌 접근 방식은 ... 가난합니다. 스레드 당 플레이어를지지하지 않지만 IO가 동시에 발생한다는 것은 피할 수 없으며 속도가 중요한 경우 주소 지정이 필요합니다. – spender

+0

스레딩없이 비동기 IO를 완벽하게 수행 할 수 있습니다. 코드 작성이 가장 적합하거나 가장 쉬운 방법인지는 논쟁의 여지가 있지만 이러한 접근 방식을 취하는 주요 네트워크 프레임 워크와 서버가 있습니다. – bobince

관련 문제