• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

심리스서버관련 추천자료있으실까요?

21.05.04 13:55 작성 조회수 832

0

안녕하세요

올려주신 강의를 수강하고있는 수강생입니다.

강의덕분에 많은 궁금한 부분들이 해소되고있는데요.  기술적 호기심으로 이제는 나아가서 도전적으로 지금까지 만들엇던 2d게임의 맵을 나누고 각각 서버로 분산하여 심리스 형태로 처리해보고자 합니다.  그런데 서적등의 자료를 찾아보면 대부분 심리스 형태가 아니고포탈등을 이용한 분산 서버환경에 대한 내용이더라고요.  혹시 추천할만한 자료(도서나 사이트)가 있으실까요? 

답변 1

답변을 작성해보세요.

0

우선 심리스를 만든다고 해서, 분산 서버를 사용해야 하는 것은 아닙니다.
서버가 분산되면 그 서버들끼리 동기화를 하는 것이 몇 배로 어렵기 때문이죠.
따라서 대부분 1개의 서버는 1개의 머신에서 실행되는 경우가 많습니다.

심리스를 만들 때는 크게 두 가지 방식이 있는데,
1)
지금처럼 하는 것과 유사하게 맵을 Zone 단위로 나눈 다음,
인접한 Zone 끼리도 통신할 수 있게 만들거나.
2)
아니면 Zone의 개념을 없애고 모든 유닛 단위로 Job을 직렬화 하는 방법이 있습니다.

장단점이 있는데 양쪽 모두 매우 어렵고
당연히 이쯤 되면 자료나 도서는 딱히 기대하시면 안 되고
각 회사의 노하우 및 헤딩의 영역으로 넘어갑니다.

bs Jeon님의 프로필

bs Jeon

질문자

2021.05.04

답변감사합니다.

답변주신 내용중  1개의 서버가 1개의 머신위에서 구동하는 경우가 많다고 하셨는데 그 의미는 결국 하나의 머신에서 구분하는 방식(존 별/ 객체별)에따라 스레드를 나누거나 프로세스를 나누어 처리하는 것을 의미하신다고 이해하였는데 맞을까요?

말씀해주신것처럼 머신을 나누어 처리하는 분산서버의 경우 동기화하기는 훨씬어려울것 같다고 생각이드는데요. 그럼애도 이렇게 분산서버를 활용할 경우의 이점은 맵의 확장성이라고 생각해 볼수 있을까요?(머신한대로 돌릴경우 물리적 처리한계가 존재하므로)

답변주신 내용중  1개의 서버가 1개의 머신위에서 구동하는 경우가 많다고 하셨는데 그 의미는 결국 하나의 머신에서 구분하는 방식(존 별/ 객체별)에따라 스레드를 나누거나 프로세스를 나누어 처리하는 것을 의미하신다고 이해하였는데 맞을까요?

-> 네 맞습니다. 
프로세스를 나누는 것은 아니고, 무조건 단일 프로세스에 멀티 쓰레드 환경입니다.
1존 당 1쓰레드까진 아니고, 적절히 분배해서 모든 쓰레드가 열심히 일하도록 유도를 해야겠죠.

그럼애도 이렇게 분산서버를 활용할 경우의 이점은 맵의 확장성이라고 생각해 볼수 있을까요?(머신한대로 돌릴경우 물리적 처리한계가 존재하므로)

-> 뮤, 블소같은 방 단위 게임이라면 어차피 방끼리 서로 영향이 없으니 
물리적으로 머신을 분리해서, 클라들이 그쪽으로 붙게해서 분산하면 편리합니다.
혹은 심리스 MMO라고 해도 전쟁, 던전 같은 외딴 공간은 독립적으로 실행되니
그 또한 별도의 머신에서 돌리고 그쪽으로 접속하게 하면 좋습니다.
하지만 오픈 필드의 심리스 월드라면,
분산 서버를 활용해도 서버들끼리 데이터를 동기화하고,
로직을 동기화 하는데 많은 비용이 듭니다.

차라리 단일 머신에서 쓰레드를 통해 다수의 지역을 관리하는게 훨 낫습니다.
어차피 CPU뿐 아니라 네트워크 트래픽이나 DB 쪽 이슈도 같이 신경 써야 해서
머신만 분산한다고 만능은 아니기에, 어느 정도 유저 제한을 두고
서버마다 1개의 머신으로 처리하는 것이죠.

bs Jeon님의 프로필

bs Jeon

질문자

2021.05.04

답변감사합니다~

bs Jeon님의 프로필

bs Jeon

질문자

2021.06.25

안녕하세요.

답변주신 내용을 참조하여 아주 단순하게

구조를 변경해보았는데요.

제가 구현한 방법은 아래와같습니다

아주 단순하지만  아래 방식이 씸리스구조에 부합하다고 생각할수 있을까요?

1.전체 맵 좌표를 x좌표기준으로 반나누어서  두개의 게임룸(thread)으로 나눠두고 이동하는 게임오브젝트들의 위치에따라 해당 룸으로 이동하도록하였습니다( 공유되는 map과 zone 코드대해서는 lock처리되도록 하였습니다)  

이렇게되어 게임 쓰레드구조가 룸관리 쓰레드1. 게임룸 쓰레드2 개로 처리되도록 하였습니다

2.게임오브젝트의  경우 jobserialize를 상속받도록해서 이동 공격등의 처리순서를 보장하도록 하였습니다.(데드락이슈등을 피하기위해서)

3.그리고 룸 쓰레드간에 업데이트싱크를 맞추기위해 각 룸별로 업데이트 카운터를 추가해서 업데이트 횟수에대한 싱크를 맞출수있도록했구요.

크게 위의 방식으로 단순하지만 지역을 분리해서 처리한뒤에 테스트를 하였고 성능이 더 잘나오는것을 확인하였습니다. 다만 말씀해주신것처럼 변경하는 과정에서 쓰레드를 나누는게 위험하고 고려해야할게 많다는것을 느꼈습니다.

구조는 합리적으로 보이긴 하지만
어차피 컨텐츠 개발을 해봐야 버그가 없는지 정확히 판별할 수 있습니다.
결국 어려운 부분은 두 영역 경계선에 있는 오브젝트들의 처리인데요.
왼쪽 영역에 있던 오브젝트가 이리 저리 이동하면서
0.1 단위로 계속 경계선을 오간다거나,
오른쪽 영역에 있는 오브젝트를 공격한다거나 하는 등의 케이스에 대해
무사히 통과가 된다면 어느 정도 합리적이라 볼 수 있겠습니다.

bs Jeon님의 프로필

bs Jeon

질문자

2021.06.25

답변감사합니다.

실제 테스트를하여 정상적으로 룸간이동이 되엇고

화살공격이나 몬스터공격이 정상적으로 룸 경계에서 수행되는것을 확인하였습니다.