대체 왜 2초짜리 인셉은 게캠을 안당한다고 하는걸까?
그 이유가 서버틱에 있어.
이브온라인 서버엔 Destiny라는 서버 엔진이 있는데, 이 엔진에서 그리드를 시뮬레이팅. 즉 그리드의 물리계산 ( 함선 이동, 드론 / 미사일이 이동) 과 클라이언트와의 소통 ( 위치 업데이트, 모듈 작동, 타겟 락온 등 ) 을 담당해.
이브의 각 성계엔, Destiny의 처리 루프가 있어. 이 루프는 무한반복하고, 항상 작동해.
루프에서 처리하는 내용은 대충 이래.
최우선 처리
- 그리드간의 사람의 이동. 워프인/아웃 혹은 그리드 통과
- 클라이언트 작업 수행. 예를들어 A에게 킵레 1000, 드론 B 출격, 게이트 C로 워프 같은거.
- 서버 작업 수행. 예를들어 "드론 A가 터졌음", "B가 C에게 미사일 발사" 같은거.
- 클라이언트에 확인 정보 보내기. 미사일을 발사하면, 서버에서 처리 후 확인해주고, 그 확인을 받고 미사일 그래픽 같은걸 랜더링해.
- 각 그리드마다 쉽/미상일/드론의 움직임 계산, 범핑 움직임 계산.
- 작업을 정리하고, 다음 틱까지 쉼.
이브 온라인이 싱글쓰레드라는 도시전설이 있는데, 이건 사실이 아니야. 물론 처리 결과의 보고는 싱글 쓰레드로 작동해.
사실, 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초가 걸려 )
- 서버는 "태클" 메시지를 받고, 즉시 적용해서 다음 틱에 "태클 성공" 메시지를 보내. 운송선은 태클당햇어.
언니 너무 멋져요
진짜너무하네
연산량을 줄이는 방법은 없으려나 쩝
보통 다른 온라인 게임은 클라에서 연산하는 식으로 줄이긴 하는데, 그럼 핵 같은 문제가 나올 수 있어서.
이래서 그렇구나... - dc App
뭔가 근본 설계부터 잘못됐다는 생각이 드는데 이거 말곤 방법이 없나?
소규모 프로그래밍에 저따구로 설계했다면 좆병신이지만 전세계 단일서버에 국소적이나마 은하 스케일을 구현한 상황에선 저게 최선일 각인데
모든 게임이 다 그런건 아니지만, 어느정도 시점이 지나면 알아도 갈아엎을수가없다
어느정도 연식이 된 엔진의 코어쪽을 건들어야하는 순간 사이드이펙트가 감당이 안되니까.. 그래서 2가 나오는거고
일단개추
틱빨라지면 핑높은놈들이 특히 유리해지니까 ㅇㅇ