1 minute read

Delay와 Rollback

  • 앞선 강의에서 봤듯이, Deterministic은 sync를 맞춰주는 것이 핵심이다. 이런 상태가 깨지는 것을 desync라고 한다.
  • desync를 해결하기 위한 방법으로 Delay와 Rollback이 있다

Delay

  • 각 플레이어의 입력을 레이턴시만큼 딜레이를 줘서 상태를 일치시킨다.
  • 비교적 쉽고 단순하게 할 수 있다.
  • 하지만 말그대로 딜레이가 생기는 단점이 있다.
    • 버튼을 딱 눌렀는데, 주먹이 바로 나가는 것이 아니고 딜레이 후 주먹이 나간다.
      • 200ms -> 0.2sec 의 딜레이가 생기면 사람이 먹먹한 느낌을 받기 시작한다. 고로 게임의 재미를 반감시키기 시작한다.
      • 따라서 레이턴시가 200ms라고 200ms를 딜레이킬 수가 없는 것이다. -> Rollback의 필요성

image-20210430003925331

Rollback

  • 말그대로 뒤로 돌리는 것
  • Delay가 없는 상황이라고 가정했을 때, p1이 50에서 펀치를 날리고, p1의 입력이 100의 시간이 걸려서 p2에 가게 될 것이다. 그리고 p2는 50에 펀치를 날린다고 하자
    • p1의 컴퓨터에서는 펀치를 바로 날릴 것이고, p2도 50에서 펀치를 날리고 있을텐데, 이 순간은 desync의 상황이다.
    • 이 상황의 sync를 맞추기 위해서, p2의 컴퓨터에 p1의 입력이 들어왔을 때, 이 펀치를 0에 들어온 것처럼 뒤로 rollback 시키고 100이라는 원래 시점으로 돌리면 B는 펀치를 얻어맞게 된다. 즉, rollbakc으로 인해 sync가 맞게 된다.
  • 하지만 rollback에도 문제가 있다.
    • p2의 입장에서 거의 펀치를 맞춰가는 중에 갑자기 화면이 바뀌면서 얻어맞는 장면으로 바뀌게 된다면 p2는 매우 열받을 것이다. 내가 먼저 쐈는데 내가 맞았다는 생각이 든다. 전체 입장에서는 공정한 상황이지만 p2 입장에서는 이것을 알 수가 없다.
    • 그리고 만들기가 어렵다. 뒤감기, 앞감기가 계속해서 일어나고, 중간에 입력을 집어넣는 과정을 반복해야한다. 그리고 뒤감기, 앞감기를 하기 위해서는 입력들을 계속해서 저장해놔야한다. 이것이 2인용 게임이 아니고 다수의 플레이어가 한꺼번에 게임하는 상황이라면..?
    • 또한, 중간 접속 처리가 어렵다. 이는 Rollback의 문제이기도 하지만 Deterministic 자체의 문제이다.
      • Deterministic은 결과를 같게할 뿐 메시지를 주고받으며 state를 공유하는 것이 아니다. 입력을 주고받기 때문에 캐릭터의 상태를 만들기 위해서는 그간의 입력을 저장해놓고 모든 값들이 들어와야 한다.
      • 그런데 만약 내가 게임을 하다 Disconnected상태가 되어서 다시 재접속했을 때 내가 지금 게임의 상황을 알기 위해서는 처음의 게임이 시작했던 순간부터 사람들의 입력했던 입력값을 모두 받아서 그것을 현재 시간까지 앞감기를 해서 sync를 맞춰줘야한다. 이 작업이 부하도 크고 구현하기가 쉽지 않아서 일부 게임에서는 reconnect처리를 하지 않기도 한다.
    • Desync 상황이 항상 문제가 되고, 이를 다시 sync를 맞춰주기가 어렵다. 두 캐릭터의 상태가 아주 살짝만 차이가 나도 시간이 지날수록 차이가 커지게 된다.

결론

  • 실제 게임에서 Delay와 Rollback을 섞어서 쓴다.
    • 특히, Rollback은 유저가 느끼지 못할 정도로 제한적으로 사용해야 한다.
    • 이것이 잘 적용된 대표적인 게임이 오버워치다.

출처