programing

크롬: 배경 탭에서 시간 초과/간격이 일시 중단됩니까?

muds 2023. 8. 14. 23:12
반응형

크롬: 배경 탭에서 시간 초과/간격이 일시 중단됩니까?

는 정성을테있요었어의 하고 있었습니다.setTimeout 테스트를 사용합니다.(역시) 이제야 알았어요.setTimeout매우 정확하지는 않지만 대부분의 가전제품의 경우 극적으로 부정확하지는 않습니다.이제 Chrome에서 테스트를 실행하고 백그라운드 탭에서 실행되도록 하면(따라서 다른 탭으로 전환하여 해당 탭에서 찾아보기) 테스트로 돌아가서 결과를 검사하면(테스트가 완료된 경우) 극적으로 변경됩니다.제한 시간이 훨씬 더 느리게 실행되고 있는 것 같습니다.FF4 또는 IE9에서 테스트한 결과 이 문제가 발생하지 않았습니다.

그래서 Chrome은 포커스가 없는 탭에서 Javascript 실행을 일시 중단하거나 적어도 느리게 하는 것처럼 보입니다.그 주제에 대해 인터넷에서 많은 것을 찾을 수 없었습니다.를 들어 과 XHR 호출을 으로 확인하는 것과 작업을 수 것을 합니다.setInterval는 (에 대해서도) 행동을 으로 의심됩니다.setInterval시간이 있으면 테스트를 작성할 것입니다.)

이런 일을 겪은 사람이 있습니까?이 서스펜션/속도 저하에 대한 해결 방법이 있습니까?당신은 그것을 버그라고 부르시겠습니까? 그리고 제가 그렇게 신고해야 합니까?

나는 최근에 이것에 대해 물었고 그것은 의도적인 행동입니다.탭이 비활성 상태일 때는 초당 최대 한 번만 함수가 호출됩니다.이것이 코드 변경입니다.

이것은 아마도 다음과 같은 도움이 될 수 있습니다.Chrome에서 탭이 비활성화되어 있을 때 setInterval도 작동하도록 하려면 어떻게 해야 합니까?

TL;DR:작업자를 사용합니다.

Web Workers는 별도의 프로세스로 실행되고 속도가 느려지지 않으므로 Web Workers를 사용할 수 있는 솔루션이 있습니다.

코드 변경 없이 사용할 수 있는 작은 스크립트를 작성했습니다. 단순히 setTimeout, clearTimeout, setInterval, clear 함수를 재정의합니다.간격

모든 코드 앞에 포함하기만 하면 됩니다.

http://github.com/turuslan/HackTimer

빈 소리를 재생하면 브라우저가 강제로 성능을 유지합니다.저는 이 댓글을 읽고 그것을 발견했습니다:탭이 활성화되지 않은 상태에서도 크롬에서 자바스크립트가 정상 속도로 실행되도록 하는 방법은 무엇입니까?

해당 의견의 출처는 다음과 같습니다.

크롬 내부자는 또한 "오디오를 재생하는" 모든 배경 탭과 "활성 웹 소켓 연결"이 있는 모든 페이지에 대해 공격적 조절이 자동으로 비활성화될 것이라고 명확히 했습니다.

WebSockets를 사용하는 브라우저 게임의 경우 주문형으로 무제한 성능이 필요하므로 WebSockets를 사용한다고 해서 무제한 성능이 보장되는 것은 아니지만 테스트를 통해 오디오 파일을 재생하면 성능이 보장되는 것 같습니다.

이를 위해 만든 빈 오디오 루프는 http://adventure.land/sounds/loops/empty_loop_for_js_performance.ogg http://adventure/sounds/loops/empty_loop_for_js_performance.wav입니다.

(-58db 노이즈가 포함되지만 -60db가 작동하지 않습니다.)

Howler.js: https://github.com/goldfire/howler.js 에서 사용자 요구에 따라 재생합니다.

function performance_trick()
{
    if(sounds.empty) return sounds.empty.play();
    sounds.empty = new Howl({
        src: ['/sounds/loops/empty_loop_for_js_performance.ogg','/sounds/loops/empty_loop_for_js_performance.wav'],
        volume:0.5,
        autoplay: true, loop: true,
    });
}

기본적으로 전체 JavaScript 성능을 설정/해제할 수 있는 내장된 방법이 없다는 것은 슬픈 일이지만, 크립토 마이너는 프롬프트 없이 WebWorkers를 사용하여 모든 컴퓨팅 스레드를 하이잭킹할 수 있습니다.

단위 테스트의 경우 다음 인수를 사용하여 크롬/크롬을 실행할 수 있습니다.--disable-background-timer-throttling

Interval과 clear를 설정한 worker-interval npm 패키지를 릴리스했습니다.웹 작업자를 사용하여 Chrome, Firefox 및 IE의 비활성 탭을 지속적으로 유지하고 실행하는 간격 구현.

대부분의 최신 브라우저(Chrome, Firefox 및 IE), 간격(윈도우 타이머)은 비활성 탭에서 초당 한 번 이상 작동하지 않도록 고정됩니다.

자세한 내용은 에서 확인할 수 있습니다.

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals

저는 제 jQuery 코어를 1.9.1로 업데이트했고, 비활성 탭의 Interval 불일치를 해결했습니다.먼저 시도한 다음 다른 코드 오버라이드 옵션을 알아보겠습니다.

여기 현재 밀리초를 가져와서 함수가 생성된 밀리초와 비교하는 솔루션이 있습니다.간격의 경우 기능을 실행할 때 밀리초가 업데이트됩니다.간격/시간을 id로 파악할 수도 있습니다.

<script>

var nowMillisTimeout = [];
var timeout = [];
var nowMillisInterval = [];
var interval = [];

function getCurrentMillis(){
    var d = new Date();
    var now = d.getHours()+""+d.getMinutes()+""+d.getSeconds()+""+d.getMilliseconds();
    return now;
}

function setAccurateTimeout(callbackfunction, millis, id=0){
    nowMillisTimeout[id] = getCurrentMillis();
    timeout[id] = setInterval(function(){ var now = getCurrentMillis(); if(now >= (+nowMillisTimeout[id] + +millis)){callbackfunction.call(); clearInterval(timeout[id]);} }, 10);
}

function setAccurateInterval(callbackfunction, millis, id=0){
    nowMillisInterval[id] = getCurrentMillis();
    interval[id] = setInterval(function(){ var now = getCurrentMillis(); if(now >= (+nowMillisInterval[id] + +millis)){callbackfunction.call(); nowMillisInterval[id] = getCurrentMillis();} }, 10);
}

//usage
setAccurateTimeout(function(){ console.log('test timeout'); }, 1000, 1);

setAccurateInterval(function(){ console.log('test interval'); }, 1000, 1);

</script>

언급URL : https://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs

반응형