문맥
내가 작업하고있는 게임 (일종의 포인트 앤 클릭 그래픽 어드벤처)에서 게임 세계에서 발생하는 거의 모든 작업은 다음과 같은 구조의 액션 매니저에 의해 제어됩니다.
예를 들어 객체를 검사 한 결과 캐릭터가 hello라고 말하고 조금 걸어 다니고 앉으면 다음 코드를 스폰합니다.
var actionGroup = actionManager.CreateGroup();
actionGroup.Add(new TalkAction("Guybrush", "Hello there!");
actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300));
actionGroup.Add(new SetAnimationAction("Guybrush", "Sit"));
그러면 새 조치 그룹 (위 이미지의 전체 라인)이 작성되어 관리자에 추가됩니다. 모든 그룹은 병렬로 실행되지만 각 그룹 내의 작업 은 서로 연결되어 있으므로 두 번째 그룹은 첫 번째 그룹이 완료된 후에 만 시작됩니다. 그룹의 마지막 작업이 완료되면 그룹이 삭제됩니다.
문제
이제 멀티 플레이어 세션에서 모든 플레이어가 동일한 정보를 볼 수 있도록 네트워크를 통해이 정보를 복제해야합니다. 개별 동작을 직렬화하는 것은 문제가되지 않습니다. 그러나 나는 네트워킹에 관해서는 절대 초보자이며 몇 가지 질문이 있습니다. 이 토론에서 간단하게하기 위해 액션 매니저 컴포넌트를 간단하게 추상화 할 수 있다고 생각합니다.
var actionManager = new List<List<string>>();
위의 데이터 구조의 내용을 모든 플레이어간에 동기화 된 상태로 유지하려면 어떻게해야합니까?
핵심 질문 외에도, 그와 관련된 몇 가지 다른 우려가 있습니다 (즉, 위의 동일한 문제에 대한 모든 가능한 의미).
- 내가, 그리고 중 하나 (서버와 클라이언트 모두 역할을하는 선수 중 하나) 서버 / 클라이언트 아키텍처를 사용하는 경우 클라이언트 낳았다 작업 그룹을, 그는 매니저에게 직접 추가, 또는 유일한 요청을 보내야합니다 서버에 모든 클라이언트가 해당 그룹을 추가하도록 명령 합니까?
- 패킷 손실 등은 어떻습니까? 게임은 결정 론적이지만 클라이언트에서 실행되는 일련의 동작에 불일치가 발생하면 세계의 일관성이없는 상태가 될 수 있다고 생각합니다. 그런 종류의 문제로부터 어떻게 보호 합니까?
- 한 번에 너무 많은 작업을 추가하면 연결에 문제가 발생하지 않습니까? 그것을 완화시킬 방법이 있습니까?