온라인 게임 서버 개발을 10년 이상하다 보니 여러 네트웍 라이브러리를 직접 개발하거나 동료가 만든 것을 사용해 보았지만 아직도 부족함이 느껴져서 계속 공부 중인데 '고기도 먹어본 놈이 잘 먹는다'라는 말처럼 좋은 네트웍 라이브러리를 만들려면 좋은 걸 만져봐야 어떤 것이 좋은지 쉽게 알 수 있기 때문에 요즘 넷텐션의 'ProudNet' 이라는 한국산 네트웍 엔진을 조금씩 보고 있습니다(평가판이라 길게 볼 수 없는데 요즘 시간이 부족하네요^^;).

 

온라인 게임 업계의 프로그래머라면 아마 넷텐션의 'ProudNet'은 익히 들어봐서 새롭지는 않으리라 생각합니다. 보통은 막강한 P2P 통신으로 많이 알려져 있죠.

이전 회사에서 캐주얼 P2P 게임을 만들 때 조언을 얻기 위해 다른 회사의 P2P 게임을 만드는 분들에게 물어 보면 적지 않은 분들이 직접 만드느라 시간 낭비하지 말고 ProudNet을 사서 사용하는 것이 더 좋다는 말을 자주 들었습니다. 특히 이미 직접 P2P 네트웍을 구현해서 게임을 서비스해 본 분들일 수록 강력하게 추천을 하였습니다.

 

P2P 게임을 만들어 보지 않은 분들은 아마 P2P 통신이 어떻게 되는지 좀 아리송한 분들이 많으리라 생각합니다. 예전에 저도 P2P 게임을 만들어 보기 전까지는 관련 문서를 봐도 특별한 것이 없고, P2P 게임을 개발하는 분들에게 물어보면 별 다른 것 없다고만 하고, 관련 기술을 소개하는 책도 거의 없어서 저에게는 꽤나 궁금한 기술이었습니다.

그런데 직접 P2P 게임을 개발하면서 부딪혀보니 왜 그런지 좀 이해할 수 있었습니다.

 

P2P 통신 프로그래밍을 아주 간단하게 말하면 유저의 컴퓨터끼리 UDP라는 프로토콜을 사용하여 서로 통신을 하는 것으로, 보통 유저의 컴퓨터는 공유기에 물려 있는 경우가 많아서 4가지 타입의 공유기에 맞추어 서로 UDP 통신을 할 수 있도록 하는 것(홀펀칭)이라고 말 할 수 있습니다.

그래서 네트웍 기술측면을 보면 UDP 통신과 4가지 공유기 타입에 따른 홀펀칭이 거의 대부분입니다.

 

 

 

P2P 게임을 만들어 보면 현실의 네트웍이 이론에 맞게 동작하지 않는 것과 게임과의 연동 부분 때문에 여러 문제를 겪게 됩니다. 제가 P2P 게임을 개발하면서 알게 된 문제는 다음과 같습니다.

 

1. 정해진 규약과 다른 동작을 하는 공유기(특히 해외).  

분명 공유기의 NAT 타입이 Address-Restricted인데 Stmmetric 처럼 동작하는 경우, 공유기 자체적으로 바이러스 방어 기능을 가지고 있어서 우리가 하는 UDP 통신을 바이러스로 판단하고 막아버리기는 경우.

 

2. 릴레이 구현

필연적으로 P2P는 일부 NAT 타입의 공유기에 물려 있는 유저들은 직접 통신을 할 수 없어서 서버를 통한 릴레이 통신이 필요합니다. 그래서 유저 컴퓨터끼리 통신을 못하는 경우 서버를 통한 릴레이가 자연스럽게 이루어져야 합니다.

 

3. 게임 로직에 좌우되는 P2P 통신

제가 P2P 통신을 구현할 때 가장 실수한 부분이 이 부분입니다. 경험이 없다 보니 최대한 릴레이를 통하지 않고 직접 통신이 되게 하는 부분에 집중하다 보니 게임 로직과 P2P 통신이 서로 연결되게 구현을 하여 개발 도중 여러 번 게임 로직을 구현하는 사람이 P2P 통신을 위한 준비 단계를 무시하고 구현하여 잘 되고 있다고 생각했던 P2P 통신이 안되던가 게임 시작이 실패하는 경우가 발생했습니다. 최소한 게임 로직과 P2P 통신을 완전하게 알고 있지 않는 이상 게임 로직에 독립적이지 않는 P2P 통신은 언제나 문제가 발생해서 괴롭힙니다.

 

 

위의 문제에서 가장 골치 아프고 해결하기 까다로운 것이 1번이라고 생각합니다. 게임 개발에는 많은 시간이 필요하고 언제나 개발 시간이 부족합니다. 그래서 많은 공유기를 가져와서 테스트 하고 각 공유기에 맞게 홀펀칭이 되도록 구현할 할 수 없습니다(공유기 구하기도 어렵죠). 그에 비해 ProudNet은 공유기 타입뿐만이 아닌 공유기 기계 자체를 조사하여 각 공유기에 맞게 최적화된 홀펀칭을 한다고 들었습니다. 이것 때문에 저처럼 게임 개발을 하고 있으면 ProudNet과 같은 품질을 내기가 어렵습니다. 현실적으로 ProudNet과 비슷한 품질의 P2P 통신을 하려면 ProudNet을 사서 사용하는 것이 가장 현실적이라고 생각합니다(경험과 시간적인 측면을 보면).

 

ProudNet을 보니 범용 네트웍 엔진에 맞게 P2P 통신은 게임 로직과 독립적으로 구현되어 있어서 제가 격은 문제를 처음부터 피할 수 있더군요.

 

 

지금은 P2P 게임을 만들지 않고 있는데 다음에 다시 만들게 된다면 저는 가능한 ProudNet을 사용하여 P2P 개발에 소요되는 시간을 절약하고, 개발할 때나 게임이 서비스 될 때에 발생하는 문제를 피하고 싶습니다.

ProudNet을 사용하면 최소한 내가 만든 것 이상의 P2P 통신을 할 수 있다면 신뢰가 있고, 혹 문제가 생기더라도 ProudNet을 만든 넷텐션에 문제를 넘겨서 빠르게 문제를 해결하고 저는 게임적인 부분에 더 집중하고 싶습니다.

 

 

 

ProudNet 평가판을 받아서 도움말을 보니 P2P로 유명하지만 P2P 이외의 기능들 중 흥미로운 부분들이 많아서 P2P보다는 다른 기능들을 전체적으로 흩어 보았습니다(사실 P2P 부분은 제가 경험이 있어서 그런지 필요하다고 생각하는 부분들이 다 있어서 더 특별히 볼 것이 없더군요^^).

 

그냥 문서나 코드를 보기만 하면 제대로 남는 것이 없을 것 같아서 다음에는 제가 본 ProudNet의 기능들 중 눈에 띄는 것을 간단하게 정리하여 공유하도록 하겠습니다^^

 

저작자 표시
신고
by 흥배 2013.01.25 08:00
| 1 |