ทดสอบหนึ่ง
ฉันได้เขียนการทดสอบเพื่อจุดประสงค์นี้โดยเฉพาะ: การ
กระจายอัตราเฟรม: 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 หยุดชั่วคราว