ทดสอบหนึ่ง
ฉันได้เขียนการทดสอบเพื่อจุดประสงค์นี้โดยเฉพาะ: การ
กระจายอัตราเฟรม: setInterval เทียบกับ requestAnimationFrame
หมายเหตุ: การทดสอบนี้ค่อนข้างเข้มข้นของ CPU requestAnimationFrame
ไม่รองรับ IE 9- และ Opera 12-
การทดสอบจะบันทึกเวลาตามจริงสำหรับ a setInterval
และrequestAnimationFrame
ทำงานในเบราว์เซอร์ที่ต่างกันและให้ผลลัพธ์ในรูปแบบของการแจกแจง คุณสามารถเปลี่ยนจำนวนมิลลิวินาทีsetInterval
เพื่อดูว่ามันทำงานอย่างไรภายใต้การตั้งค่าที่แตกต่างกัน setTimeout
ทำงานคล้ายsetInterval
กับที่เกี่ยวกับความล่าช้า requestAnimationFrame
โดยทั่วไปค่าเริ่มต้นที่ 60fps ขึ้นอยู่กับเบราว์เซอร์ หากต้องการดูว่าเกิดอะไรขึ้นเมื่อคุณสลับไปที่แท็บอื่นหรือมีหน้าต่างที่ไม่ใช้งานอยู่เพียงแค่เปิดหน้านั้นสลับไปที่แท็บอื่นแล้วรอสักครู่ มันจะยังคงบันทึกเวลาตามจริงสำหรับฟังก์ชั่นเหล่านี้ในแท็บที่ไม่ได้ใช้งาน
ทดสอบสอง
วิธีการทดสอบมันก็คือการเข้าสู่ระบบการประทับเวลาซ้ำ ๆ ด้วยsetInterval
และrequestAnimationFrame
และดูในคอนโซลแฝด คุณสามารถดูว่ามีการอัปเดตบ่อยเพียงใด (หรือเคยอัปเดต) เมื่อคุณทำให้แท็บหรือหน้าต่างไม่ทำงาน
ผล
Chrome
Chrome จำกัด ช่วงเวลาต่ำสุดsetInterval
ที่ประมาณ 1000ms เมื่อแท็บไม่ทำงาน หากช่วงเวลานั้นสูงกว่า 1,000 มิลลิวินาทีมันจะทำงานตามช่วงเวลาที่ระบุ ไม่สำคัญว่าหน้าต่างจะไม่โฟกัสหรือไม่ช่วงเวลาจะถูก จำกัด เฉพาะเมื่อคุณสลับไปที่แท็บอื่น requestAnimationFrame
หยุดชั่วคราวเมื่อแท็บไม่ทำงาน
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
คล้ายกับ Chrome Firefox จะ จำกัด ช่วงเวลาขั้นต่ำไว้setInterval
ที่ประมาณ 1,000 มิลลิวินาทีเมื่อแท็บ (ไม่ใช่หน้าต่าง) ไม่ทำงาน อย่างไรก็ตามrequestAnimationFrame
จะทำงานช้าลงอย่างมากเมื่อแท็บไม่ทำงานโดยแต่ละเฟรมใช้เวลา 1 วินาที, 2 วินาที, 4s, 8 วินาทีเป็นต้น
// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms
https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE ไม่ได้ จำกัด การหน่วงเวลาsetInterval
เมื่อแท็บไม่ทำงาน แต่จะหยุดrequestAnimationFrame
ในแท็บที่ไม่ทำงาน มันไม่สำคัญว่าหน้าต่างจะไม่โฟกัสหรือไม่
Edge
เริ่มต้นจาก Edge 14, setInterval
ต่อยอดที่ 1000ms ในแท็บที่ไม่ได้ใช้งาน requestAnimationFrame
ถูกหยุดชั่วคราวในแท็บที่ไม่ใช้งาน
Safari
เช่นเดียวกับ Chrome และ Safari จะsetInterval
อยู่ที่ 1000 มิลลิวินาทีเมื่อแท็บไม่ทำงาน requestAnimationFrame
หยุดชั่วคราวเช่นกัน
โอเปร่า
นับตั้งแต่มีการนำ Webkit engine มาใช้แสดงว่าพฤติกรรมเช่นเดียวกับ Chrome setInterval
ถูก จำกัด ที่ 1,000ms และrequestAnimationFrame
หยุดชั่วคราวเมื่อแท็บไม่ทำงาน
สรุป
ทำซ้ำช่วงเวลาสำหรับแท็บที่ไม่ได้ใช้งาน:
setInterval requestAnimationFrame
Chrome
9- ไม่ได้รับผลกระทบไม่ได้รับการสนับสนุน
10 ไม่ได้รับผลกระทบหยุดชั่วคราว
11+> = 1000ms หยุดชั่วคราว
Firefox
3- ไม่ได้รับผลกระทบไม่ได้รับการสนับสนุน
4 ไม่ได้รับผลกระทบ 1 วินาที
5+> = 1000ms 2 n s (n = จำนวนเฟรมตั้งแต่ไม่มีกิจกรรม)
IE
9- ไม่ได้รับผลกระทบไม่ได้รับการสนับสนุน
10+ ไม่ได้รับผลกระทบหยุดชั่วคราว
ขอบ
13- ไม่ได้รับผลกระทบหยุดชั่วคราว
14+> = 1000ms หยุดชั่วคราว
การแข่งรถวิบาก
5- ไม่ได้รับผลกระทบไม่ได้รับการสนับสนุน
6 ไม่ได้รับผลกระทบหยุดชั่วคราว
7+> = 1000ms หยุดชั่วคราว
อุปรากร
12- ไม่ได้รับผลกระทบไม่ได้รับการสนับสนุน
15+> = 1000ms หยุดชั่วคราว