[javascript] 자바 스크립트에서 밀리 초 단위의 시간을 얻는 더 좋은 방법은 무엇입니까?

이 값을 얻을 때마다 새 객체를 인스턴스화하지 않고 날짜 객체를 사용하여 밀리 초 단위로 시간을 얻는 방법 또는 적어도 해당 객체를 재사용하는 방법이 JavaScript에 대안이 있습니까? JavaScript로 간단한 게임 엔진을 만들려고하기 때문에 이것을 묻고 있습니다. “델타 프레임 시간”을 계산할 때 매 프레임마다 새로운 Date 객체를 만들어야합니다. 성능의 영향에 대해 너무 걱정하지는 않지만이 객체가 반환 한 정확한 시간의 신뢰성에 문제가 있습니다.

나는 매초마다 애니메이션에서 이상한 “점프”를 얻었으며 이것이 너무 빨리 업데이트 할 때 JavaScript의 가비지 콜렉션 또는 Date 객체의 제한과 관련이 있는지 확실하지 않습니다. 델타 값을 일정한 값으로 설정하면 애니메이션이 완벽하게 매끄러 워 지므로이 “점프”가 시간을 얻는 방식과 관련이 있다고 확신합니다.

내가 줄 수있는 유일한 관련 코드는 델타 시간을 계산하는 방법입니다.

prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;

움직임 / 애니메이션을 계산할 때 상수 값에 델타 시간을 곱합니다.

Date 객체를 사용하여 밀리 초 단위로 시간을 얻는 것을 피할 방법이 없으면 변수를 증가시키는 함수 (게임이 시작된 후 경과 된 시간 (밀리 초))와 SetTimer 함수를 사용하여 호출하는 함수 밀리 초마다 한 번 효율적이고 안정적인 대안이 되겠습니까?

편집 : 이제 다른 브라우저에서 내 코드를 테스트 했으며이 “점프”는 Firefox가 아닌 Chrome에서만 나타납니다. 그러나 두 브라우저에서 모두 작동하는 방법이 있다면 여전히 좋을 것입니다.



답변

Date.now () 시도하십시오 .

건너 뛰기는 가비지 수집으로 인한 것 같습니다. 일반적으로 변수를 최대한 재사용하면 가비지 수집을 피할 수 있지만 가비지 수집 일시 중지를 줄이기 위해 사용할 수있는 방법을 구체적으로 말할 수는 없습니다.


답변

나는 이것이 꽤 오래된 스레드라는 것을 알고 있지만 최신 정보를 유지하고 관련성을 높이기 위해보다 정확한 performance.now()기능을 사용하여 자바 스크립트에서 미세한 입자 타이밍을 얻을 수 있습니다.

window.performance = window.performance || {};
performance.now = (function() {
    return performance.now       ||
        performance.mozNow    ||
        performance.msNow     ||
        performance.oNow      ||
        performance.webkitNow ||
        Date.now  /*none found - fallback to browser default */
})();


답변

내가 아는 한 Date 로만 시간을 얻을 수 있습니다 .

Date.now 는 솔루션이지만 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now 어디에서나 사용할 수는 없습니다 .

var currentTime = +new Date();

현재 시간 (밀리 초)을 제공합니다.

당신의 점프 를 위해 . 델타 프레임 시간 에 따라 보간을 올바르게 계산 하고 반올림 오류 가없는 경우 가비지 수집기 (GC)에 베팅합니다.

루프에 작성된 임시 오브젝트가 많이있는 경우 가비지 콜렉션은 스레드를 잠 가서 정리 및 메모리 재구성을 수행해야합니다.

Chrome을 사용하면 타임 라인 패널 에서 GC가 소비하는 시간을 확인할 수 있습니다 .

편집 : 내 대답 이후 Date.now()모든 곳에서 IE> = 9에서 지원되므로 최상의 옵션으로 간주해야합니다.


답변

당신이 같은 날짜 개체가 있다면

var date = new Date('2017/12/03');

그런 다음 valueOf () 인 밀리 초 형식으로 날짜를 가져 오기 위해 자바 스크립트에 내장 된 메소드가 있습니다.

date.valueOf(); //1512239400000 in milliseconds format


답변

이것은 매우 오래된 질문이지만 여전히 다른 사람들이 그것을보고있는 경우 참조 용 requestAnimationFrame()으로 현대 브라우저에서 애니메이션을 처리하는 올바른 방법입니다.

업데이트 : mozilla 링크는이 작업을 수행하는 방법을 보여줍니다-링크 뒤의 텍스트를 반복하는 느낌이 들지 않았습니다.)


답변