나만의 작은 도서관
[TIL] 240705 캠프 82일차: setInterval의 time은 동적할당, uuid의 중복 가능성, 추측 항법 본문
[TIL] 240705 캠프 82일차: setInterval의 time은 동적할당, uuid의 중복 가능성, 추측 항법
pledge24 2024. 7. 5. 21:51오늘 배운 내용
setInterval의 time은 동적으로 변경할 수 없다.
자바스크립트에서 setInterval은 콜백함수와 시간을 매개변수로 넣어 사용하는 함수이다. setInterval()함수가 하는 역할은 매개변수로 받은 시간이 지나면 콜백함수를 실행하는 과정을 반복하는 것이다. 문제는 이런 setInterval()의 매개변수인 시간을 동적으로 변경할 수 없다는 것이다. 그렇다면 같은 interval을 사용하면서 시간을 바꿀 수는 없을까?
직접적으로 바꾸는 방법은 지원하지 않는다고 한다. 그렇다고 방법이 전혀 없는 것은 아니다. 아래와 같이 사용하면 시간을 동적으로 변경하는 것과 비슷한 기능을 할 수 있다.
let intervalId;
let currentInterval = 1000; // 초기 간격 1초
function dynamicIntervalFunction() {
console.log("작업 수행: " + new Date());
}
function startInterval(newInterval) {
// 기존의 인터벌을 중지
if (intervalId) {
clearInterval(intervalId);
}
// 새로운 간격으로 인터벌 설정
currentInterval = newInterval;
intervalId = setInterval(dynamicIntervalFunction, currentInterval);
}
// 초기 간격으로 인터벌 시작
startInterval(currentInterval);
// 5초 후에 간격을 2초로 변경
setTimeout(() => {
startInterval(2000);
console.log("간격이 2초로 변경되었습니다.");
}, 5000);
코드에 대해 간단하게 설명하자면 결국 setInterval의 반환값을 전역 변수에 저장해두고, 시간으로 변경하고 싶을 때, 기존의 interval을 지우고 변경하고자 하는 시간을 가진 interval을 해당 전역 변수에 저장하는 것이다. 이렇게하면 맘에 들지는 않지만 동적으로 interval의 시간을 변경할 수 있다.
uuid의 중복 가능성
UUID는 Universally Unique IDentifier의 약자로, 한국말로 범용 고유 식별자라고 부를 수 있다. 자바스크립트에서 uuid패키지를 다운받고 const id = uuidv4()와 같이 사용하게 되는데 보면 알겠지만, 아무런 입력 값 없이 id를 반환받을 수 있다. 유일성을 보장하기 위해 사용되는 uuid가 아무런 장치없이 값을 받아오는데 과연 이러한 방식이 신뢰할 수 있을 정도의 유일성을 보장할까하는 궁금증이 생겼다. 그래서 알아보니 다음과 같은 결론이 나왔다.
중복이 될 수는 있으나 그 확률이 매우 희박하다.
uuid는 "550e8400-e29b-41d4-a716–446655440000"처럼 8-4-4-4-12와 같은 방식으로 32개의 16진수와 4개의 '-'로 이루어져 있다. 간단하게 경우의 수를 계산해보면 32*4 = 128bit이므로, 2^128개의 경우의 수가 나온다. 지수가 128이라... 확실히 중복될 걱정을 하지 않아도 될 것같다. 그래도! 중복이 나지 않을 거라는 보장이 되는 건 아니기 때문에 중복이 날 수는 있다. 하지만, 128승이면 중복될 확률을 0으로 수렴한다고 볼 수 있는 수준이기 때문에 걱정할 필요가 없어보인다.
추가로 uuid는 특정 위치는 임의의 값이 아닌 특정한 값으로 고정되어 있다. 예를 들어, 버전이 1~4까지 있는 uuid는 각 버전을 uuid 안에 명시하기 위해 아래와 같이 특정 값으로 고정해둔다.
UUID v1 : 57cc83a0-3ee0-11ec-ad54-3d4a7263eeca
UUID v4 : e0f14cf7-e07c-4d12-9eb7-6360cc94770e
추측 항법( Dead Reckoning )
추측 항법(Dead Reckoning, DR)은 현재의 위치를 추정하기 위해 초기 위치와 이동 중의 변화를 바탕으로 하는 위치 추정 기법입니다. 다음과 같은 기본 요소들을 사용하여 위치를 계산합니다
- 초기 위치: 시작 위치를 기준으로 합니다.
- 속도: 이동 속도를 측정하여 이동 거리를 계산합니다.
- 방향: 이동 방향을 추적하여 이동 경로를 파악합니다.
- 시간: 시간 경과에 따라 이동 거리를 계산합니다.
게임 서버를 기준으로 말하게되면, 각 유저는 레이턴시와 상관없이 같은 상황의 위치를 가져야하기 때문에 동기화가 매우 중요하게 된다. 하지만 레이턴시가 각각 다른 경우가 일반적이기 때문에 이를 위한 여러가지 보간과 동기화 방법들이 제시되어왔다. 그 중 추측 항법은 이전의 이동 정보를 통해 앞으로의 이동을 미리 예측하여 움직이는 방식이다. 이렇게 움직이게 되면 예측이기 때문에 오차가 발생할 수 밖에 없지만, 동기화 과정에서 워프하듯 움직이는 모습이 보다 덜해지게 된다.(동기화된 위치 정보를 받는 사이에 지속적인 움직임을 보이기 때문) 따라서, 추측 항법을 넣으면 다음과 같이 보이게된다.
1. 네트워크가 구린 유저가 이동을 한다.(추측 항법)
2. 서버에서 동기화 위치 패킷을 모든 클라이언트에게 보내면 구린 유저가 갑자기 워프한다.
3. 워프한 유저는 1~2과정을 반복한다.
오늘 한 일
- TCP 게임 서버 개인과제 도전 구현 기능 65%완료