다른 답변에 연결된 기사 외에도 Arianne Project 의 경험에 대해 조금 이야기 할 수 있습니다 .
동기화 된 상태를 유지하는 방법?
우리는 행동과 인식의 개념을 중심으로 “ Marauroa ” 프레임 워크를 구축했습니다 . 액션은 클라이언트에서 서버로 보내져 (왼쪽 도보, 공격 몬스터 # 47, '안녕하세요'와 같은) 사용자 입력을 전달합니다. 그리고 인식은 서버에서 클라이언트로 전송되어 주변의 세계 상태에 대해 알려줍니다. 이러한 인식은 매 차례마다 전송됩니다. 게임에 따라 30ms에서 300ms의 턴 타임을 사용합니다.
우리는 두 가지 유형의 인식을 가지고 있습니다 : 로그인과 플레이어가 새로운 영역 (구역)에 들어갈 때 완전한 인식이 전송됩니다. 그 후, 수정 된 객체의 수정 된 속성 (예를 들어 위치) 및 물론 신규 및 제거 된 객체만을 포함하는 차등 인식이 전송된다.
대기 시간 문제를 해결하는 방법?
우리는 "서버가 항상 옳다"고 확신합니다. 클라이언트는 부드러운 보행, 충돌 확인 등과 같은 일부 예측을 수행합니다. 그러나 클라이언트와 서버가 무언가에 대해 동의하지 않으면 서버가 승리합니다. 하위 프로젝트 Stendhal (2D RPG)는 기본적으로 300ms의 회전 시간을 사용합니다 (클라이언트 측에서 많은 스무딩이 수행됨). 이로 인해 Stendhal은 지연에 대해 매우 저항력이 있습니다.
참고 : 일부 다른 게임은 클라이언트를 네트워크 지연의 영향을 최소화하기 위해 확장하는 것으로 신뢰합니다. WoW에서는 종종 "Warsong Gulch"라는 전장 중 하나에서 악용되었습니다. 깃발을 가진 플레이어가 선택할 수있는 두 가지 방법이 있습니다. 따라서 부정 행위의 플레이어가 터널을 향해 달려가 자신을 위해 지연을 일으 킵니다. 서버와 다른 클라이언트는 계속해서 그를 향해 달려갑니다. 그러나 잠시 후이 클라이언트는 서버에게 언덕쪽으로 갔다고 말할 수 있습니다. WoW는 마지막 전송 좌표와 현재 좌표 사이의 거리가 시간 세그먼트 내에 맞는지 확인하고 수락합니다.
UDP 대 TCP 사용
초기 버전에서는 UDP를 사용하여 TCP의 오버 헤드를 줄였습니다. 우리는 손실 된 패킷을 스스로 처리했습니다. 이것은 프로젝트 초기에 완벽하게 작동했습니다. 그러나 몇 년 전에 서버가 가정용 DSL 연결에서 실제 데이터 센터로 이동했을 때 큰 문제가 발생했습니다. UDP는 방화벽 하드웨어의 CPU 성능을 극도로 요구합니다 (또는 적어도 5 년 전). 규칙 세트는 모든 단일 UDP 패킷에 적용되어야합니다. 그러나 TCP의 경우 규칙 세트는 처음 3 개의 패킷에만 적용됩니다. 그 후 연결이 설정됩니다. 다음의 모든 패킷은 연결 추적 테이블에 있거나 SYN 플래그가 없기 때문에 일반 규칙 세트를 무시합니다.
리버스 엔지니어링으로부터 커뮤니케이션과 클라이언트를 보호하는 방법은 무엇입니까?
Arianne은 완전히 오픈 소스이며 여기에는 클라이언트, 서버, 그래픽, 음악이 포함됩니다. 물론 여기에는 프로토콜 문서 와 디버깅에 사용되는 분석기도 포함됩니다.
SSL을 사용하는 타사의 무단 스니핑으로부터 통신을 쉽게 보호 할 수 있습니다.
그러나 리버스 엔지니어링으로부터 보호하는 것은 불가능합니다. 물론 난독 화하고 안티 디버깅 기술을 사용할 수 있습니다. 그러나 결국에는 사용자에게 제공하는 소프트웨어의 리버스 엔지니어링을 막을 수 없습니다. 개발자가 안티 디버깅 기술에 많은 노력을 기울이고 있음에도 불구하고 Skype가 리버스 엔지니어링 된 방법에 대한 흥미로운 프레젠테이션이 있습니다 . http://recon.cx/en/f/vskype-part1.pdf
참고 : 리버스 엔지니어링이 불법이거나 리버스 엔지니어링을 금지하는 라이센스 또는 ToS에 단락을 넣을 수있는 국가가 있습니다. 그러나 호환 가능한 데이터 스토리지 형식 또는 전송 프로토콜, 라이센스의 단락 또는 무효화하려는 ToS를 개발하는 맥락에서 리버스 엔지니어링을 명시 적으로 허용하는 다른 국가 (예 : 내가 살고있는 국가)가 있습니다. (이 섹션의 모든 내용은 내가 아는 한 변호사가 아닙니다)
어떤 것을 로컬에서 계산해야하고 어떤 것을 서버에서 계산해야합니까?
우리는 서버의 게임 로직과 관련된 모든 것을 계산합니다. 클라이언트는 게임이 원활하게 진행되도록 특정 이벤트를 예측합니다. 그러나 결국 서버는 항상 옳습니다.
예측 된 이벤트는 예를 들어 충돌이 발생했을 때 움직임이 중지되는 것입니다. Stendhal은 그리드를 사용하여 요소를 배치합니다. 그리고 서버 관점에서 모든 엔티티의 왼쪽 상단 모서리는 정확히 하나의 사각형에 있습니다. 그러나 클라이언트는 타일 사이를 부드럽게 이동합니다. 의사 3d 효과도 그립니다. 따라서 클라이언트에서 기본이 1x1 인 엔터티가 더 높을 수 있습니다.
로드 문제의 균형을 맞추는 방법?
유지 보수를 쉽게하기 위해 가능한 한 간단하게 유지하십시오.
정적 컨텐츠의로드 밸런싱은 http 서버 클러스터 및 컨텐츠 분배 네트워크 영역에서 잘 알려져 있습니다.
게임 서비스의로드 밸런싱에 대한 다소 간단한 개념은 여러 지역 / 지역으로 서버를 분할하는 것입니다. 따라서 영역 AC는 한 서버에 있고 영역 DF는 다른 서버에 있습니다. 한 세트의 구역에서 다른 세트의 구역으로 볼 수없는 경우 특히 쉽습니다. 클라이언트가 플레이어가있는 영역을 담당하는 영역 서버에만 연결할 수 있도록 몇 가지 점검을해야합니다.
한 서버에서 다른 서버로 플레이어를 전송하는 가장 쉬운 방법은 데이터베이스에 기록하고 클라이언트에게 다른 영역 서버에 연결하도록 지시하고 현재 서버에서 연결을 끊는 것입니다. 그런 다음 클라이언트는 새 영역 서버에 연결하여 데이터베이스에서로드합니다. (어쨌든 / 상점에서 데이터베이스 코드로의로드가 필요하므로 핸드 오버를 위해 서버 간의 직접 통신을 나중에 구현할 수 있습니다).
일부 추가 글로벌 서비스는 다음을 통해 필요합니다. 로그인시 클라이언트에게 올바른 영역 서버에 연결하도록 지시해야합니다. 그리고 당신은 세계적인 대화 시스템을 원할 것입니다.
MMO에서로드 밸런싱은 어떻게 수행됩니까? 에서이 주제에 대해 자세히 설명했습니다 .