자주 바뀌는 게임을 위해 레코드 / 재생 시스템을 어떻게 설계합니까?


10

무료 MMORPG에서 일하고 있는데 문제가 있습니다.

나는 (다른 사람들과) 게임을위한 비디오 녹화 시스템을 개발하고 있습니다. 아이디어는 기본적으로 : 타임 스탬프와 함께 송수신 된 모든 패키지와 클라이언트의 일부 로컬 데이터를 기록한 다음 파일로 덤프합니다. 비디오를 재생하기 위해 파일에있는 모든 것을 에뮬레이션합니다. ffmpeg를 사용하여 비디오를 avi로 내보내는 옵션도 있습니다.

문제는 게임 버전을 변경할 때 비디오에 대한 하위 호환성 (명령 추가 / 제거, 기능 변경 등)을 유지하기가 어렵다는 것입니다. 이 문제를 처리하는 좋은 방법이 있습니까? 여러 플레이어를 보유하고 비디오 파일의 각 버전에 맞는 것을 선택하는 대신?

다른 게임이이 상황을 어떻게 처리하는지 아는 것이 도움이 될 것입니다.

도움을 주셔서 감사합니다, 내 영어 죄송합니다.


인터넷 검색 / 검색을위한 추가 음식과 마찬가지로 : 서버 패키지를 캡처하여 id의 Quake Games가 데모를 기록한 방식과 동일합니다. 내가 아는 한 그들은 호환성 문제를 결코 해결하지 못했습니다.
Michael Stum

이 질문의 제목을 변경했습니다. MMO가 가장 자주 바뀌는 게임이라는 점을 제외하고는 실제로 MMO에 관한 것이 아닙니다.

답변:


8

기본 규칙은 기존 패킷 유형을 절대 변경하지 않는 것입니다. 모든 것이 기존 명령의 끝에 추가되거나 새로운 명령이 추가됩니다. 또한 두 사람이 서로의 작업을 수행 할 가능성이 훨씬 줄어 듭니다.


이 게임에서 발생합니다 .. 패킷이 추가, 제거, 이동되었습니다. 예를 들어, 얼마 전에 GM 명령과 관련된 모든 패킷을 "확장 패킷"으로 옮기기로 결정했습니다. 길드 시스템 .. 명령 / 기능 편집 (기능 변경)은 가능성이 적지 만 요점은 아닙니다. 지금부터 패키지를 제거하지 말고 명령을 삭제하면 서버 측에서 복구 할 수없는 상태가 되었습니까? 당신의 대답을 위해!
Marco

1
그렇습니다, 더 이상 사용하지 마십시오. 결국 오래된 물건은 제거 할 수 있지만 일반적으로 1 ~ 2 년 후에 발생합니다.
coderanger

1
또한 일부 추가 계획이 도움이 될 것입니다. 지금 패킷을 더 잘 계획할수록 향후 변경이 줄어들 것입니다.
Kylotan

문제는 게임이 항상 바뀌고 있다는 것입니다. 거의 매월 새로운 패킷을 추가합니다 (새로운 기능 추가). 그러나 이전 패킷 재 작성 기능 등을 많이 변경해야합니다. 그러나 메소드를 그대로두고 1 년이 지나서 제거 할 수 있다고 생각합니다.
Marco

3
보다 일반적인 패킷 유형을 사용하면 많은 도움이됩니다. 구현하는 모든 새 기능에 대해 새 메시지를 추가 할 필요는 없습니다.
Kylotan

5

특히 PC에서 생각할 수는 없지만 게임 플레이 코드의 버전을 변경하고 재생 시스템에 영향을 미치는 변경 사항을 만들 때 버전이 충돌하는 것은 아닙니다. 리플레이 파일에 게임 플레이 코드 버전으로 태그가 지정되어 있고 클라이언트는 여전히 해당 버전에 액세스 할 수 있으며 정상적으로 작동합니다.


이것이 실제로 수행 된 것을 보았습니다. 게임 로그와 함께 버전 번호를 저장하십시오. 물론 소스 코드 리포지토리 등의 이전 로그를 재생하려면 이전 소프트웨어 버전을 유지해야하지만 어쨌든 그렇게해야합니다.
Ian Schreiber

귀하의 답변에 감사드립니다. 게임은 무료이므로 (GPL 라이센스) 누구나 누구나 기존 게임 버전에 액세스하고 클라이언트를 컴파일하여 모든 버전의 버전을 보유하는 데 문제가되지 않도록합니다. 이것은 모든 대체 서버가 최신 버전을 사용하는 것은 아니며 2004 년 이후 버전을 실행하는 서버가 있습니다.
Marco

@Marco : SC2가 작동하는 방식은 거의 모든 코드를 DLL에 넣는 것입니다. 재생을로드 할 때 버전을 확인하고 해당 버전의 DLL을로드하여 실행합니다. 좀 더 복잡하지만 사용자는 한 번만 설치하면되며 한 명의 exe는 모든 이전 재생을 실행할 수 있습니다.
Mooing Duck

1

이것을 다루는 한 가지 방법은 "Heroes of Newerth"라는 게임 라인을 따르는 것입니다. (+/- 2 주마다 변경됨) 내가 말할 수있는 것에서 :

  1. 게임 및 재연에 diff 패치를 사용하십시오.
  2. 모든 재생은 클라우드에 저장됩니다. 결국 만료됩니다.
  3. 사용자가 이전에 다운로드 한 재생을보고 싶다면 "Compatize"버튼을 먼저 사용해야합니다.
  4. 원격 버전이 최신 버전과 다른 것 같습니다. 또는 재생이 더 이상 저장되지 않으면 업로드 한 다음 원격 차이를 수행합니다.

S2에서 일하지 않기 때문에 분명히 그것이 어떻게 작동하는지 말할 수는 없습니다. 그러나, 나는 재생 연령과 관련된 현저한 다운로드 크기 경향을 발견했다.

또는 재생에 엔티티 패치를 추가합니다 (예 : 철자 X에는 Z 효과 대신 Y 효과가 있음). 패킷 관련 정보가 엔터티 구성에도 저장되어 있으면이 엔터티 핫 패치를 사용하면 이전 패킷도 이해할 수 있습니다.

나는 클라이언트에 기록적인 행동을 저장하지 않을 것입니다. 왜냐하면 그것은 매우 빨리 커질 수 있기 때문입니다. 특히 클라이언트가 10.1.0에서 10.2.0으로 업데이트 할 때 (최종 패치 대신 두 버전 사이의 모든 패치를 다운로드해야하기 때문에)

Google Protobuf는 의도적으로 이와 같은 기능을 지원하므로 직렬화 계층으로 사용하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.