[MSW] 메이플스토리 월드 네트워크의 이해

2022. 11. 10. 22:32MSW

※ 본 포스팅은 MSW 공식 디스코드 채널에 있는 개발 가이드 영상의 내용을 정리한 글입니다.

 

 

  • 메이플스토리 월드는 서버 <=> 클라이언트 구조.
  • 메이플스토리 월드는 전통적인 구조에서의 서버 클라 동기화의 과정을
    개발자 입장에서 편리하게 만듦. 프라퍼티의 [Sync]옵션이 그것. (내부적으론 비슷)
    몇몇 프라퍼티 타입은 이 Sync를 지원하지 않는다. (ex. any, table...)
  • 서버 클라 간 오류를 방지하기 위해 메월드의 주요 함수들은 server only이다.
  • client only 함수인 OnSyncProperty을 이용해 서버로부터 변경된 프라퍼티들을 가지고
    클라이언트 상에서 무언가 변화되게 할 수 있다.
  • 모든 함수에 메서드 세팅을 통해 실행 제어를 설정할 수 있다. (서버 온리, 클라 온리...)
  • 실행 제어 옵션 중 server는 어디에서 불리든 서버에서 실행이 된다.
  • client는 어디에서 불리든 클라에서 실행이 된다.
  • multicast는 서버와 클라 양 단에서 실행이 된다.
  • 클라에서 동작하는 메서드, 서버에서 동작하는 메서드가 구분되어 있음에 유의하기.
  • 게임이 실행되면 첫번째로 서버가 생성되고, 그 직후 클라이언트에 뭔가 요청을 하면,
    일단 서버는 클라이언트에 해당 요청을 보낸 후 바로 그 다음 문장을 실행한다.
    클라이언트는 게임이 실행된 후 생성되고 받은 요청을 실행하기까지의 시간이 조금 더
    걸리기 때문에 타이밍 오차가 생겨서 실제로는 코드 순서대로 동작하지 않을 때가 있다.
  • 서버가 구동이 되고 클라이언트가 열린다. 서버에 엔티티가 생성되고 클라에도 생성된다.
    클라가 생성 도중에 클라에 패킷을 보내면 클라가 존재하지 않거나,
    목표하는 엔티티가 클라에 존재하지 않으면 정상적인 패킷의 처리가 이루어지지 않는다.
    때문에 타이밍 이슈가 생길 수 있다. 
  • 서버에서 메인 플로우를 담당하고 클라이언트는 서버에서 받은 것들을 표시해준다.
  • 예외적으로 단일 클라만을 위한 정보 (ex. UI, 입력)는 클라이언트에서 관리, 처리를 한다.
    서버에 없음. 클라이언트에서 제어를 하므로 로컬 엔티티를 쓴다.
    클라이언트 로직을 쓰는 경우는 단일 클라만을 위한 정보를 처리할 때 쓴다.

키가 눌렸을 때 서버에 특정함수를 전달하여 실행시키게 하는 모습.

그리고 서버는 Sync프라퍼티의 값에 변화를 줌으로써 모든 클라의 power값이 변하게 되고

그로 인해 OnSyncProperty가 실행이 된다.

서버와 클라를 넘나들면서 동작하는 예시이다.