क्रोम: पृष्ठभूमि टैब में टाइमआउट / अंतराल निलंबित?


130

मैं इस परीक्षण का setTimeoutउपयोग करने की सटीकता का परीक्षण कर रहा था । अब मैंने देखा कि (जैसा कि अपेक्षित था) बहुत सटीक नहीं है, लेकिन अधिकांश उपकरणों के लिए नाटकीय रूप से गलत नहीं है। अब अगर मैं क्रोम में परीक्षण चलाता हूं और इसे एक पृष्ठभूमि टैब में चलाने देता हूं (इसलिए, दूसरे टैब पर स्विच करना और वहां ब्राउज़ करना), परीक्षण पर वापस लौटकर और ते परिणामों का निरीक्षण करना (यदि परीक्षण समाप्त हो गया) तो वे नाटकीय रूप से बदल जाते हैं। ऐसा लग रहा है कि टाइमआउट बहुत धीमा चल रहा है। FF4 या IE9 में परीक्षण किया गया था।setTimeout

तो ऐसा लगता है कि क्रोम सस्पेंड है या कम से कम जावास्क्रिप्ट निष्पादन को एक टैब में धीमा कर देता है जिसमें कोई फोकस नहीं है। विषय पर नेट पर बहुत कुछ नहीं मिला। इसका मतलब यह होगा कि हम पृष्ठभूमि कार्यों को नहीं चला सकते हैं, उदाहरण के लिए एक्सएचआर कॉल का उपयोग कर सर्वर पर समय-समय पर जांच करना और setInterval(मुझे उसी व्यवहार को देखने के लिए संदेह है setInterval, अगर समय मेरे साथ है तो एक परीक्षा लिखेंगे)।

क्या किसी ने इसका सामना किया है? वहाँ इस निलंबन के लिए एक समाधान होगा / धीमा? क्या आप इसे बग कहते हैं और क्या मुझे इसे इस तरह दर्ज करना चाहिए?


दिलचस्प! क्या आप बता सकते हैं कि क्या क्रोम टैब को रोक रहा है और टाइमर को फिर से शुरू कर रहा है या टैब को फिर से एक्सेस कर रहा है? या व्यवहार यादृच्छिक है? क्या इस तथ्य से कोई लेना देना हो सकता है कि क्रोम स्वतंत्र प्रक्रियाओं में टैब चलाता है?
हैदर

@gAMBOOKa: देखिए @ pimvdb का जवाब यह प्रति सेकंड एक बार अधिकतम धीमा होने की संभावना है।
KooiInc

4 साल बाद और यह समस्या अभी भी मौजूद है। मैं एक के साथ divs के लिए एक setTimeOut है transition, तो एक ही समय में सभी divs संक्रमण नहीं है, लेकिन वास्तव में 15 मीटर प्रत्येक संभोग के बाद, कुछ रोलिंग प्रभाव पैदा कर रहा है। जब मैं दूसरे टैब पर जाता हूं और थोड़ी देर बाद वापस आता हूं, तो सभी एक ही समय में संक्रमण कर देते हैं और setTimeOutपूरी तरह से नजरअंदाज कर दिया जाता है। यह मेरे प्रोजेक्ट के लिए कोई बड़ी समस्या नहीं है, लेकिन यह एक अजीब और अवांछित जोड़ है।
रेवेरुअर्ट

हमारे एनीमेशन के लिए जिसे सेटटाइमआउट एक अनुक्रम में कहा जाता है, हमारे लिए समाधान सिर्फ यह सुनिश्चित करने के लिए था कि हम टाइमर के हैंडल / आईडी को याद रखें (यह सेटटाइमआउट से वापस आ गया है) और इससे पहले कि हम एक नया टाइमर सेट करें, अगर हम पहले से ही क्लियर टाइमआउट कहते हैं संभाल लिया। हमारे मामले में इसका मतलब यह है कि जब आप टैब पर लौटते हैं, तो एनीमेशन क्या खेल रहा है, इस संदर्भ में कुछ प्रारंभिक स्पष्टता हो सकती है, लेकिन यह अपने आप को बहुत जल्दी और नियमित रूप से एनीमेशन फिर से शुरू करता है। हमने सोचा था कि यह शुरू में कोड के साथ एक मुद्दा था।
एक्शन डैन

जवाबों:


88

मैंने हाल ही में इस बारे में पूछा है और यह डिजाइन द्वारा व्यवहार है। जब कोई टैब निष्क्रिय होता है, तो अधिकतम प्रति सेकंड एक बार फ़ंक्शन कहा जाता है। यहाँ कोड परिवर्तन है

शायद यह मदद करेगा: मैं कैसे सेट कर सकता हूं जब क्रोम में एक टैब निष्क्रिय होता है तो इन्टरवल भी काम करता है।

TL; DR: वेब वर्कर्स का उपयोग करें ।


3
धन्यवाद, मुझे 'निष्क्रिय टैब' के साथ देखना चाहिए था। देशी अंग्रेजी बोलने वाला नहीं होना कभी-कभी एक बाधा है।
कोइइन्क

1
@Kooilnc: कोई बात नहीं :) मैं एक देशी अंग्रेजी वक्ता भी नहीं हूँ।
पिमवेदब

22

वेब वर्कर्स का उपयोग करने के लिए एक समाधान है, क्योंकि वे अलग-अलग प्रक्रिया में चलते हैं और धीमा नहीं होते हैं

मैंने एक छोटी सी स्क्रिप्ट लिखी है जिसे आपके कोड में बदलाव किए बिना उपयोग किया जा सकता है - यह केवल सेटटाइमआउट, क्लियरटाइम, सेटइंटरवल, क्लियरइंटरवल फ़ंक्शन को ओवरराइड करता है

बस अपने सभी कोड से पहले इसे शामिल करें

http://github.com/turuslan/HackTimer


7
यह अच्छा है और सभी जानते हैं कि: 1. श्रमिकों के पास DOM तक कोई पहुंच नहीं है, 2. श्रमिकों को कभी भी निष्पादित किया जाता है यदि वे अपने दम पर एक फ़ाइल पर हैं। यह बहुत से मामलों के लिए सेटटाइमआउट के लिए ड्रॉप-इन प्रतिस्थापन नहीं है।
मदारा का भूत

1
आप सही हैं, लेकिन कुछ आधुनिक ब्राउज़र अपनी फ़ाइलों के बिना श्रमिकों को ब्लब्स ( html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers ) का उपयोग करके अनुमति देते हैं
रुस्लान तुषोव

1
उस के साथ भी, वेब वर्कर्स बहुत अधिक कार्यक्षमता (अर्थात्, DOM) याद कर रहे हैं जो उन्हें setTimeout और सह के लिए एक सुरक्षित प्रतिस्थापन की अनुमति देता है।
का भूत

उदाहरण के लिए, कोड के बारे में क्या कहना है, उदाहरण के लिए, भारी ग्राफिक्स प्रसंस्करण कार्य जिन्हें हम अन्य सामान करते समय समाप्त करना चाहते हैं?
माइकल

ठीक है, आप वर्कर्स, सर्विस वर्कर बना सकते हैं और डेटा-यूआरएल का उपयोग करके कैनवस एपीआई का उपयोग कर सकते हैं। new Worker('data:text/javascript,(' + function myWorkerCode () { /*...*/ } + '()')। यह जांचने का भी एक अच्छा तरीका है कि क्या आपके पास आयात समर्थन है:try { eval('import("data:text/javascript,void 0")') } catch (e) { /* no support! */ }
Fábio Santos

9

~ खाली साउंड बजाना ब्राउज़र को प्रदर्शन को बनाए रखने के लिए मजबूर करता है - मुझे यह टिप्पणी पढ़ने के बाद पता चला: क्रोम सक्रिय नहीं होने पर भी क्रोम को सामान्य गति से कैसे चलाया जाता है जब टैब सक्रिय नहीं होता है?

मुझे WebSockets का उपयोग करने वाले ब्राउज़र गेम के लिए असीमित प्रदर्शन की आवश्यकता है, इसलिए मुझे अनुभव से पता है कि WebSockets का उपयोग असीमित प्रदर्शन सुनिश्चित नहीं करता है, लेकिन परीक्षणों से, ऑडियो फ़ाइल चलाने से यह सुनिश्चित होता है।

यहां 2 खाली ऑडियो लूप हैं जिन्हें मैंने इस उद्देश्य के लिए बनाया है, आप उन्हें स्वतंत्र रूप से, व्यावसायिक रूप से उपयोग कर सकते हैं: http://advt.land/sounds/loops/empty_loop_for_js_performance.ogg http://advt.land/bounds/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,
    });
}

यह दुख की बात है कि डिफ़ॉल्ट रूप से पूर्ण जावास्क्रिप्ट प्रदर्शन को चालू / बंद करने के लिए कोई अंतर्निहित विधि नहीं है, फिर भी, क्रिप्टो खनिक बिना किसी संकेत के वेब वर्कर्स का उपयोग करके आपके सभी कंप्यूटिंग थ्रेड्स को हाईजैक कर सकते हैं: |


धन्यवाद, 58db हेडफोन थियो के साथ बहुत ही घृणित है, लेकिन साइट को म्यूट करने से उस समस्या का हल हो जाता है
काँन सोरल

1

मैंने कार्यकर्ता-अंतराल जारी किया है एनपीएम पैकेज जो क्रोम, फ़ायरफ़ॉक्स और आईई के लिए निष्क्रिय टैब पर बनाए रखने और चलाने के लिए वेब-वर्कर्स का उपयोग करने के साथ इनइंटरवल और क्लियरइंटरवल कार्यान्वयन सेट करता है।

अधिकांश आधुनिक ब्राउज़रों (क्रोम, फ़ायरफ़ॉक्स और 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


0

मैंने अपना jQuery कोर 1.9.1 में अपडेट किया, और इसने निष्क्रिय टैब में इंटरवल विसंगति को हल किया। मैं कोशिश करूँगा कि पहले, फिर अन्य कोड ओवरराइड विकल्प देखें।


आपने किस संस्करण से अपग्रेड किया? मैं संस्करण के साथ कुछ समय समाप्ति समस्याओं (गैलरी स्लाइडर) का अनुभव ~ 1.6
dmi3y

0

यहां मेरा समाधान है जो वर्तमान मिलीसेकंड प्राप्त करता है, और इसकी तुलना उस मिलीसेकंड से करता है जो फ़ंक्शन बनाया गया था। अंतराल के लिए, यह फ़ंक्शन चलाने पर मिलीसेकंड को अपडेट करेगा। तुम भी एक अंतराल द्वारा अंतराल / मध्यांतर हड़पने कर सकते हैं।

<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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.