반응형

편리한 PIDL 컴파일을 위한 PIDL 애드온 사용하기


넷텐션의 공식 문서에도 설명되어 있다시피 프라우드넷에서는 네트워크 프로그램을 제작시 개발자를 힘들게 하는 프로그래밍 작업 (메시지 구조체 정의, 송신 함수, 수신 함수 작성)을 함수 호출의 형태로 간소화시키고 작업자의 실수를 줄이기 위해서 RMI(Remote Method Invacation, 원격 메서드 호출)를 사용한다. 프라우드넷에서 RMI를 사용하기 위해서는 PIDL 파일을 작성하고 컴파일해야 한다. 그리고 이 PIDL을 컴파일하기 위해서는 우선 몇 가지 설정을 해주어야 하는데 이 과정이 상당히 복잡하고, 새로운 프로젝트를 생성할 때마다 설정을 하기는 매우 번거롭고 귀찮은 작업이 된다.



위의 보기처럼 작성한 PIDL 파일의 속성을 열고 복잡한 커맨드를 입력해주어야 한다. 그리고 새로 만들어지는 PIDL 파일에도 일일이 입력해주어야 한다. 하지만 넷텐션에서는 이미 이 귀찮은 작업을 해결해줄 애드온을 만들어두었다.


경로 :: ...\Nettention\ProudNet\util



위의 경로를 찾아보면 다음과 같이 PIDL-addon.vsix라는 파일이 존재하는데, 이것을 실행하면 다음과 같이 PIDL 애드온을 설치할 수 있다 :





이 애드온을 설치하고 나면 위의 그림과 같이 비주얼 스튜디오에서 PIDL의 파일의 아이콘이 PIDL 글자가 박힌 아이콘이 변경되고, 달리 PIDL 파일의 속성에서 PIDL 컴파일 설정을 해주지 않아도 PIDL 파일을 컴파일할 수 있게 된다.


반응형
반응형

ProudNet 다운로드 및 설치하기

프라우드넷을 설치하기 위해서는 우선 프라우드넷의 라이선스를 받아야한다.


http://proudnet.com/proud-net


위 주소에서 라이선스를 받을 수 있다.



퍼스널 라이선스의 경우는 20명의 접속자 제한을 제외하고는 다른 제한 없이 공부용으로 충분히 사용할 수 있다.



퍼스널 라이선스에 대한 약관에 동의하고 정보를 채워서 신청을 끝내면 입력한 이메일 주소로 라이선스의 키와 프라우드넷 게임 엔진을 다운로드 받을 수 있는 링크가 포함된 메일이 날아온다.




위의 링크를 클릭하면 프라우드넷을 다운로드 받을 수 있는 넷텐션 개발자 네트워크에 접속할 수 있다.


https://ndn.nettention.com/login/



라이선스를 받을 때 입력했던 아이디와 비밀번호를 입력하면 접속할 수 있다.




접속하면 다운로드 가능한 프라우드넷 각 버전들의 목록을 볼 수 있다. 이 중에 원하는 버전을 선택해서 다운로드받아서 설치하면 된다.



설치 과정 중에는 다음과 같이 라이선스 키를 입력하는 것이 있는데, 이것은 제일 처음 라이선스 신청을 하고 받은 메일에서 복사해와서 붙여넣어주면 된다.


그렇게 하면 프라우드넷의 설치를 마칠 수 있다.


반응형
반응형

P2P 게임 네트워크 구현시 슈퍼 피어 선정하기



게임 네트워크를 제작할 때, 대다수의 게임이 서버와 통신을 하지만 몇몇 게임의 경우 로그인이나 게임의 데이터 송수신은 서버와 하지만 네트워크 게임 플레이 자체는 클라이언트 간의 통신, 즉 peer-to-peer(이하 P2P) 방식으로 처리하는 경우가 있다. 일반적으로 소규모 멀티 플레이 게임이나 데이터 전송량이 많은 FPS 같은 게임의 멀티 플레이에서 P2P 방식을 사용할 것을 권장한다.


이러한 소규모 온라인 게임(Multi Online, MO)에서 사용하는 P2P 통신 방법의 하나로, P2P 그룹 내에 있는 멤버 중 하나가 게임 플레이를 위한 메시지의 송수신을 담당하는 Super peer(슈퍼 피어 혹은 호스트) 중심의 P2P 네트워킹이 있다.


간단한 예를 들자면 FPS 게임에서 P2P 네트워킹을 사용하는데 게임의 종료 조건 중의 하나가 타임 오버일 때, 그 P2P 그룹에 속하는 모든 클라이언트가 각자의 시간을 가지고 계산한다면 상황에 따라서 게임이 종료되는 시간이 각 클라이언트마다 제각각인 상황이 발생할 수도 있다. 이러한 상황을 방지하기 위해 P2P 그룹의 멤버들 중에서 하나의 슈퍼 피어를 선정하고 그 슈퍼 피어인 멤버의 클라이언트가 게임의 시간을 관리하게 하는 것이다. 그렇게 함으로써 모든 클라이언트의 종료 시점은 동일해질 수 있다.


이런 슈퍼 피어를 선정할 때에도 고려해야할 조건들이 있는데, 그것은 바로 P2P 그룹의 멤버 중에서 가장 네트워크 접속 상태가 좋고 전송 속도가 빠른 멤버를 슈퍼 피어로 삼아야 한다는 것이다. 만약에 통신 품질이 좋지 않은 클라이언트를 슈퍼 피어로 선정하게 되면 게이밍 품질이 하락할 수 있다. 예를 들자면 FPS 게임에서 캐릭터의 이동을 슈퍼 피어의 기준으로 동기화하였는데, 슈퍼 피어의 상태가 좋지 않다면 캐릭터의 이동이 뚝뚝 끊어져 보일 것이다.


슈퍼 피어를 선택하는 방법은 다음과 같다 :


1. 인터넷 공유기 뒤에 있지 않고 직접 회선에 물려있는 경우 슈퍼 피어로서의 자격이 상승한다.

2. 클라이언트의 송신 속도가 높을 수록 슈퍼 피어로서의 자격이 상승한다.

3. 클라이언트의 성능이 좋아서 초당 실행 프레임레이트(framerate)가 높은 경우 슈퍼 피어로서의 자격이 상승한다. 가령, 물리 시뮬레이션을 수퍼피어가 전담하는 게임 개발의 경우 이것이 중요해진다. 자세한 것은 Proud.CNetClient.SetApplicationHint 도움말을 참고하라.


직접 개발하게 된 네트워크 API의 경우엔 위의 조건을 계산해내는 기능을 직접 구현해야 하겠지만, 프라우드넷에서는 그와 관련된 함수가 이미 존재한다. Proud.CNetServer.GetMostSuitableSuperPeerInGroup() 함수와 Proud.CNetServer.GetSuitalbeSuperPeerRankListInGroup() 함수가 바로 그것이다.


이 함수들의 설명은 다음과 같다 :


virtual HostID Proud::CNetServer::GetMostSuitableSuperPeerInGroup(

HostID groupID,

const CSuperPeerSelectionPolicy & policy = CSuperPeerSelectionPolicy::GetOrdinary(),

const HostID * excludees = NULL,

intptr_t excludeesLength = 0

)


이 메서드는 groupID가 가리키는 P2P 그룹에 있는 멤버들 중 가장 최적의 슈퍼 피어를 찾아서 알려주는데, P2P 그룹을 생성하거나 변경한 직후에는 슈퍼 피어 후보자를 제대로 얻지 못할 수도 있다. 처음 이 메서드를 호출한 이후 2-5초 후에 다시 호출해주면 더 정확한 슈퍼 피어를 찾을 수 있다.


매개변수

groupID :: 슈퍼 피어를 찾고자하는 P2P 그룹의 ID

policy :: 슈퍼 피어를 선정하는 정책. 자세한 설명은 CSuperPeerSelectionPolicy 를 참고.

excludees :: groupID가 가리키는 P2P 그룹의 멤버 중 excludees에 들어있는 멤버들은 제외하고 선별한다. 예를 들어 이미 사용하던 슈퍼 피어가 자격을 박탈당한 경우 다시 재선발되는 것을 막고자할 때 유용하다.


반환값

슈퍼 피어로서 가장 적격인 클라이언트의 HostID. P2P 그룹이 찾지 못했거나 excludees에 의해 모든 멤버가 필터링되면 HostID_None을 리턴한다.


virtual int Proud::CNetServer::GetSuitableSuperPeerRankListInGroup(

HostID groupID,

SuperPeerRating * ratings,

int ratingsBufferCount,
const CSuperPeerSelectionPolicy & policy = CSuperPeerSelectionPolicy::GetOrdinary(),

CFastArray<HostID> & excludees = CFastArray<HostID>

)


이 메서드 역시 Proud.CNetServer.GetMostSuitableSuperPeerInGroup() 와 마찬가지로 최적의 슈퍼 피어 후보자를 찾아주지만 이전 메서드와 다른 점은 최고 순위의 후보자 뿐만 아니라 차순위의 후보자 역시 찾아서 준다.


매개변수

groupID :: 슈퍼 피어를 찾고자하는 P2P 그룹의 ID

ratings :: 여기에 적합한 슈퍼 피어 후보자 목록이 채워져서 반환된다. 가장 적합한 후보자 순으로 정렬되어 채워진다.

ratingsBufferCount :: rating의 배열 항목 갯수이다. 이 함수가 리턴하는 배열의 크기는 이 크기 이상은 채우지 않는다.

policy :: 이전 메서드의 설명과 같다.

excludees :: 이전 메서드의 설명과 같다.


반환값

ratings에 채워진 항목의 갯수를 반환한다. P2P 그룹을 찾지 못했거나 excludees에 의해 모든 멤버가 필터링되면 0을 반환한다.



위의 함수들을 적절하게 이용하면 적합한 클라이언트를 슈퍼 피어로 선정할 수 있을 것이고, 게이밍의 질을 향상시킬 수 있을 것이다.


참고

http://guide.nettention.com/cpp_ko#super_peer

http://help.nettention.com/cpp/1.7.31494-master/class_proud_1_1_c_net_client.ndn/

반응형
반응형

ProudNet 소개


일반적인 싱글 플레이 게임을 개발할 때는 상관없는 이야기이지만, 멀티 플레이 요소가 조금이라도 들어가거나 멀티 플레이 위주의 게임에서는 항상 고민해야할 것이 있다. 그것을 바로 네트워크를 어떻게 개발할 것인가? 라는 부분이다. 이에 대한 해답은 여러가지가 있을 수 있는데, 대표적인 두 가지 방법으로는 직접 구현하기와 다른 회사의 API를 사용하는 것이 있다.


하지만 직접 구현하는 방법의 경우에는 굉장한 시간과 노력이 들기 마련이다. 그리고 팀 내에 아직 네트워크 개발의 인력이나 노하우가 없다면 연구 개발하는데 걸리는 시간과 비용은 기하급수적으로 늘어나게 될 것이다. 이렇듯이 직접 개발하는 것이 어려운 상태라면 개발자의 눈은 자연스레 다른 회사의 API로 돌아갈 수 밖에 없다. 이미 시중에는 여러 종류의 네트워크 API들이 나와있다. 서버 구축 비용을 절감할 수 있는 클라우드 방식의 Photon Cloud라던가 구글에서 얼마전 서비스를 시작한 Firebase라던가 하는 것들이 있다. 하지만 이번에 소개할 것은 Nettention사의 ProudNet이라는 게임 네트워크 엔진이다.


공식 홈페이지 :: http://proudnet.com/



이 프라우드넷은 위의 이미지에서 보이듯이 이미 여러 게임에서 많이 사용된 게임 네트워크 API로서 캡콤의 스트리트 파이터 5나 넥슨의 마비노기 마영전 같은 대형 프로젝트에서도 사용되었고 그로 인해 게임 네트워크 엔진으로서 필요한 기능 역시 확실하게 갖추고 있다.


일반적인 게임 회사가 아닌 공부하려는 학생과 개인 개발자나 인디 게임팀 혹은 인디 게임 회사의 경우, 이런 API를 사용하는데 드는 비용이 무엇보다 중요할 것이다.



이에 대한 정책도 확실한데 공부를 위한 퍼스널 라이센스 같은 경우 영리목적 프로젝트에는 사용이 불가능하고 동시 접속자 수 역시 20명으로 제한되지만 API의 기능 자체는 제한없이 확실하게 사용해서 공부를 할 수 있고, 소규모 개발팀을 위한 인디 라이센스 역시 무료로 제공되고 있다.


그리고 또 하나의 장점은, 넷텐션은 국내 개발사로서 프라우드넷 공식 문서가 완벽한 한글로 지원된다는 점이다. 외국의 API나 게임 엔진을 사용할 때는 최신 기능에 대한 공식 문서 번역은 항상 한 발 느리기 때문에 구글링을 해서 찾아야하는 번거로움이 없기 때문에 개발 속도가 한층 더 빨라질 수 있다.


프라우드넷 공식 문서 :: http://guide.nettention.com/cpp_ko#intro

반응형

+ Recent posts