대체 왜 2초짜리 인셉은 게캠을 안당한다고 하는걸까?
그 이유가 서버틱에 있어.


이브온라인 서버엔 Destiny라는 서버 엔진이 있는데, 이 엔진에서 그리드를 시뮬레이팅. 즉 그리드의 물리계산 ( 함선 이동, 드론 / 미사일이 이동) 과 클라이언트와의 소통 ( 위치 업데이트, 모듈 작동, 타겟 락온 등 ) 을 담당해.


이브의 각 성계엔, Destiny의 처리 루프가 있어. 이 루프는 무한반복하고, 항상 작동해.


루프에서 처리하는 내용은 대충 이래.


최우선 처리

  • 그리드간의 사람의 이동. 워프인/아웃 혹은 그리드 통과
  • 클라이언트 작업 수행. 예를들어 A에게 킵레 1000, 드론 B 출격, 게이트 C로 워프 같은거.
  • 서버 작업 수행. 예를들어 "드론 A가 터졌음", "B가 C에게 미사일 발사" 같은거.
  • 클라이언트에 확인 정보 보내기. 미사일을 발사하면, 서버에서 처리 후 확인해주고, 그 확인을 받고 미사일 그래픽 같은걸 랜더링해.
물리 처리
  • 각 그리드마다 쉽/미상일/드론의 움직임 계산, 범핑 움직임 계산.
마지막 처리
  • 작업을 정리하고, 다음 틱까지 쉼.
이브 서버의 목표는, 한 서버 틱이 정확히 매 1초 마다 실행되는 거야.
만약 서버가 모든 작업을 처리하는 데에 1초 미만이 걸렸다? 그럼 좋은 거고 남은 시간동안엔 쉬어. ( 혹은 같은 노드의 다른 성계의 계산을 처리해, 이 경우가 더 많겠지 )
그런데 서버 틱이 1초 이상이 걸렸다?? 그럼 서버 입장에선 나쁜 선택을 해야 해. 남은 계산못한 틱을 다음 틱으로 미루던가, 틱을 계산하는 데에 더 많은 시간을 필요로 하는거지.

여기서 TIDI가 나와. 틱 시간을 늘려서, 서버가 한 틱에 더 작은 작업을 수행하도록 하는거지.
물론 TIDI가 최고 단계가 되어도 한 틱에 모든 계산을 하지 못할때가 있고, 그럴땐 첫번째 선택을 해. 큰 싸움 도중에 팅겼을때 들어가는데 30분씩 걸리는게 이거 때문이지.

하지만 서버 틱은 큰 한계가 있어, 데이터베이스랑 통신하는데에 충분한 시간이 없다는게 그건데, 보통 데이터베이스 서버는 몇백개의 성계를 대상으로 해.
즉 1틱이라는 시간이 있어도 데이터베이스와 통신하는데 1/100초정도의 시간밖에 없을수도 있다는 것이고, 이 시간은 데이터베이스와 소통하는데 아주 부족해.

그래서 대부분의 무거운 작업 ( 데이터베이스와 통신하는 ) 부분은 별계의 쓰레드에 큐를 넣어 작동돼. 큐가 끝나면 다음 틱에 정보가 보고되고.

이브 온라인이 싱글쓰레드라는 도시전설이 있는데, 이건 사실이 아니야. 물론 처리 결과의 보고는 싱글 쓰레드로 작동해.


사실, Destiny 는 틱 밖에서 대부분의 작업을 수행해. 대부분의 클라이언트 명령 ( "타겟 락온 시작", "모듈 작동" ) 이 트랭퀄리티에 접수되면, 대부분 즉시 처리해.

예를 들어

  • 게이트를 점프하면, "X게이트 점프함" 이라는 메시지를 서버에 보내고, 서버는 즉시 처리 후 점프 중이라는 확인을 보내줘. 하지만 점프하는 당사자가 아닌 다른 사람은 그 사람이 점프한다는 것을 다음 틱까지는 몰라. ( 처리는 즉시 되지만, 결과는 다음 틱에 보고되기 때문 )
  • 같은 이유로, 터렛 모듈을 키면 서버는 즉시 데미지를 계산하고, 즉시 타겟에 적용해. 그리고 "터렛 작동됨"이라고 클라이언트에 보내. 하지만 너 혹은 타겟은 다음 틱까지 얼마의 데미지가 가해졌는지 몰라. - 즉, 넌 1초 혹은 10초전에 죽었을지도 모른다는 거야.
  • 만약 태클 모듈을 키면, 서버는 즉시 타겟을 태클하지만, 태클했다는 메시지는 다음 틱에 나와.
몇몇 작업은 틱에 상관없이 작동해. 프로브로 스캔을 한다던지 하는 거.

제일 영향을 많이 미치는 경우는, 연관된 두가지 동작을 할 때야. 예를 들어 워프 혹은 락온을 한다면, 두 작업은 모두 가장 가까운 다음 틱에 처리가 시작돼.

자세하게 설명하자면, 너가 "A로 워프"를 클릭하면 클라이언트는 즉시 서버에 "A에 얼라인후 최대한 빨리 워프"라는 메시지를 보내. 그러면 서버는 다음 틱 큐에 그것을 넣고, 다음 틱이 되면 Impulse 모드 ( 일반 그리드 모드 )에서 워프 전 모드로 바꾸고, "속도가 75% 이상이고 정확한 방향인가?" 를 체크하고, 맞다면 즉시 워프 모드로 바꾸고, 아니면 그리드에서 계속 얼라인을 진행해.


틱의 일부로 75% 속도 체크가 들어가므로, 결과적으로 얼라인 시간은 제일 가까운 틱으로 '반올림'된다고 할 수 있어.

만약 얼라인 타임이 4.5초라면, 이것에 의해 5~6초가 될수도 있다는 거야. 하지만 걱정하지 마. 태클러에겐 더 심각해.


만약 게이트에서 게이트 켐핑을 하고 있고, 웝디를 미리 켜놓은 상태에서 한대의 운송선이 넘어왔고, 넌 락온 후 태클에 성공했다고 가정해 보자.

방금 무었이 일어났냐면

  • 운송선의 파일럿이 "A 게이트로 워프" 버튼을 누르고, 서버에 메시지를 보내. 서버는 다음 틱 큐에 처리할 내용을 넣어둬.
  • 다음 서버 틱이 시작되면, 운송선은 클락이 풀리고 얼라인이 시작해. 서버는 "B 위치에서 C에게 의해 조종되는 운송선이 나타났고, A게이트로 얼라인중" 이라는 ㅔ시지를 보내고, 타겟에게도 이 메시지를 보내. 이 메시지는 유럽엔 20~30ms, us엔 75~80ms, au엔 110~200ms의 시간이 걸려 도착해.
  • 한국 기준으로, 100ms, 즉 0.1초가 지나고 이 메시지가 도착했고, 너의 컴퓨터는 그것을 받고 처리해. 오버뷰에 운송선이 나타나.
  • 눈 그리고 뇌가 그것을 보고 클릭해서 락온하고, "C의 운송선 락온" 이라는 명령을 보내. 다시 서버에 가는데 100ms가 걸려.
  • 서버는 "락온 시작" 메시지를 클라이언트에 보내고, 락온 시간을 계산해서 정확하게 실행되는 "락온 완료"작업을 예약해 둬.
  • 락온 시간만큼의 시간이 지났고, 서버는 락온을 실행하고 다음 틱에 운송선 파일럿에게 "D 파일럿이 옐로박싱 중"이란 메시지를, 너에겐 "락온 성공" 이란 메시지를 보내
  • 다음 서버 틱 ( 상황에 따라 1초가 될수도 있고, 0초가 될수도 있어 )에 서버는 너에게 "운송선 락온 성공, 실드 아머 헐 량" 을 보내고, 그건 다시 인터넷을 거쳐 ( 또다른 0.1초 ) 너의 컴퓨터에 도달해. 이 때 서버는 운송선의 얼라인 여부를 확인하고, 75%이상이라면 워프를 진행해. 얼라인 속도가 0.3 ~ 1.3초 사이라면 워프에 성공했겠지.
  • 너의 클라이언트는 "락온 완료" 메시지를 받고, 다시 "C 운송선에 웝디 가동" 이라는 메시지를 즉시 보내. ( 또 서버로 가는데 0.1초가 걸려 )
  • 서버는 "태클" 메시지를 받고, 즉시 적용해서 다음 틱에 "태클 성공" 메시지를 보내. 운송선은 태클당햇어.
그렇다면 케레스로 1.9초 얼라인타임의 인셉을 잡으려면 몇초의 락온 시간이 필요할까?
핑이 100ms라 가정하고, 오버뷰에 뜨고 락온하는 데에 0초가 걸린다고 가정할때, 약 0.725초의 락온 시간이 필요해.
150ms라면 0.625초가 필요하고.

0.725초의 락온 시간은 불가능한건 아니야, 하지만 스태깅 패널티를 받는 많은 량의 리못샌부가 필요하겠지.

CCP가 이 문제를 해결하는건 생각보다 간단해.
그냥 틱 처리 시간을 0.5초로 줄이면 해결되는 문제야. 틱 타임을 줄일 경우 높은 핑을 가진 지역 사람들이 더 나은 이브 경험을 하게 할수도 있어.
하지만 이건 단순 계산해봐도 2배의 처리속도가 필요한 거야. 아니면 2배의 TIDI가 되겠지.

1줄 요약
1틱에 1개 동작이 실행됨. 1틱은 1초