เว็บไซต์ทำให้ CPU และแบตเตอรี่สูญเปล่าได้อย่างไร
(h.43z.one)-
การค้นพบปัญหา: พบปัญหาที่ลำโพงของโน้ตบุ๊กเครื่องใหม่มีเสียง white noise ดังเป็นช่วง ๆ ได้ยินเฉพาะในห้องที่เงียบเท่านั้น
-
การวิเคราะห์สาเหตุ: เมื่อตรวจสอบสถานะ audio sink ของ PulseAudio พบว่าในสถานะ SUSPENDED จะไม่มีเสียง แต่ในสถานะ IDLE หรือ RUNNING จะเกิดเสียง white noise
-
ปัญหาของ Firefox: พบว่า Firefox เป็นโปรแกรมที่กำลังใช้งาน audio sink และแม้ในแท็บที่เปิดอยู่จะไม่มีแท็บไหนเล่นเสียงอยู่ ก็ยังเกิดเสียง white noise
-
สาเหตุ: พบว่าเสียงแจ้งเตือนของ outlook.office.com เป็นต้นเหตุของปัญหา ทุกครั้งที่มีอีเมลเข้าจะเริ่มเกิดเสียง white noise และจะหยุดได้ก็ต่อเมื่อรีเฟรชแท็บหรือรีสตาร์ต Firefox
-
การใช้แบตเตอรี่: เมื่อเกิดเสียง white noise การใช้ CPU และการกินแบตเตอรี่จะเพิ่มขึ้น
-
ความพยายามแก้ปัญหา: พยายามแก้ปัญหาด้วยการปิดการแจ้งเตือนอีเมล แต่พบว่าเว็บไซต์อื่นก็มีปัญหาคล้ายกัน
-
การจัดการเสียงด้วย HTML/JavaScript: วิธีเล่นเสียงมีทั้งแท็ก `` และ WebAudio API โดยพบว่าสาเหตุของปัญหาเกิดขึ้นตอนสร้าง AudioContext
-
ความแตกต่างระหว่าง Firefox กับ Chrome: Chrome จะหยุดการสิ้นเปลืองแบตเตอรี่/CPU โดยอัตโนมัติหลังผ่านไประยะหนึ่ง แต่ Firefox ไม่เป็นเช่นนั้น
-
ทางแก้: ได้พัฒนาส่วนขยายที่หยุด AudioContext โดยอัตโนมัติและเริ่มใหม่เมื่อจำเป็น แม้จะไม่สมบูรณ์แบบ แต่ก็ได้ผลดีพอสมควร
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ปัญหานี้เป็นสิ่งที่วางแผนไว้และมีความสำคัญ จะแก้ไขในเร็ว ๆ นี้ ขอโทษที่ยังไม่ได้แก้เพราะเป็นเรื่องของลำดับความสำคัญ แต่สำหรับผมมันมีลำดับความสำคัญสูง
เว็บไซต์ที่เปิด audio context แล้วไม่เล่นอะไรเลย มีโอกาสสูงว่าอาจกำลังทำ bot detection
สงสัยว่าปัญหาเดียวกันนี้เกิดบนอุปกรณ์ Android ด้วยหรือไม่
white noise นี้ทำให้ผมหงุดหงิดมานานมาก แต่ตามต้นตอไม่เจอ
เมื่อเอาต์พุตว่างอยู่ สัญญาณดิจิทัล SPDIF จะสูญเสียการซิงก์ พอเริ่มเล่นก็ต้องใช้เวลาซิงก์ใหม่ ทำให้เสียงช่วงไม่กี่วินาทีแรกหายไป ผมจึงเขียนโปรแกรมที่เปิดเอาต์พุตค้างไว้โดยไม่ทิ้งข้อมูลลงในสาย เพื่อไม่ให้เอาต์พุตเข้าสู่สถานะว่าง
นี่น่าจะอธิบายปัญหาที่บางครั้ง Firefox บน Android ทำให้โทรศัพท์ใช้ข้อมูลถึง 10GB ต่อวันได้ เว็บข่าวเล่นเสียงและโหลดโฆษณาซ้ำ ๆ และแท็บก็ไม่เข้าสู่โหมดประหยัดพลังงานเพราะเสียง สุดท้ายต้องย้ายไปใช้ Chrome เพราะค่าเน็ตที่เพิ่มขึ้นซ้ำ ๆ
โค้ดใน Chromium ที่จัดการการขัดจังหวะนี้อยู่ที่นี่
พบปัญหาคล้ายกันบน macOS เช่นกัน (การใช้พลังงานจากเสียง, ไม่มี white noise)
ปัญหานี้แก้ไขหน้าแรกของ https://www.dr.dk/
ผมไม่ค่อยรู้ว่า audioContext ติดตั้งอย่างไร แต่ดูฉลาดและไดนามิกมาก การเล่นเสียงแจ้งเตือนก็เหมือนการวาด SVG ด้วย D3 เลย เลยสงสัยว่ามี serviceWorker hook ใน API ที่มีประสิทธิภาพกว่านี้ไหม ที่ให้ลงทะเบียนงานซ้ำ ๆ แบบง่าย ๆ เช่น notification handler ได้