แท็บพื้นหลังใน Chrome 57

แท็บพื้นหลังอาจส่งผลลบอย่างมากต่อประสิทธิภาพของเบราว์เซอร์ โดยเฉพาะอายุการใช้งานแบตเตอรี่ เพื่อลดปัญหานี้ Chrome ได้ตั้ง ข้อจำกัดหลายอย่างเกี่ยวกับแท็บที่ทำงานอยู่เบื้องหลังมาหลายปีแล้ว เมื่อเร็วๆ นี้มีการพยายามมากมายที่จะปรับปรุงเพิ่มเติม และเอกสารนี้จะให้ภาพรวมของนโยบาย Chrome เอกสารนี้เน้นการอธิบายนโยบายปัจจุบันใน Chrome 57 อ่านกลยุทธ์ระยะยาวและแผนอื่นๆ ได้ในเอกสารนี้

การเพิ่มประสิทธิภาพแอปพลิเคชันสำหรับพื้นหลัง

นักพัฒนาเว็บควรตระหนักว่าผู้ใช้มักจะเปิดแท็บจำนวนมากอยู่ในเบื้องหลังและอาจส่งผลกระทบต่อการใช้พลังงานและอายุการใช้งานแบตเตอรี่เป็นอย่างมาก ควรเก็บงานในเบื้องหลังไว้ให้น้อยที่สุด นอกเสียจากมีความจำเป็นจริงๆ ที่จะต้องมอบประสบการณ์ของผู้ใช้ที่เฉพาะเจาะจง คุณควรใช้ API การแสดงหน้าเว็บเพื่อตรวจจับเมื่อหน้าเว็บมีในเบื้องหลังและระงับงานที่ไม่จำเป็นทั้งหมด เช่น การอัปเดตด้วยภาพ

สำหรับบางไซต์ การเพิ่มประสิทธิภาพง่ายๆ นี้สามารถลดการใช้ CPU ได้มากถึง 75%

var doVisualUpdates = true;

document.addEventListener('visibilitychange', function(){
    doVisualUpdates = !document.hidden;
});

function update() {
    if (!doVisualUpdates) {
    return;
    }
    doStuff();
}

นโยบาย

requestAnimationFrame()

ตามเอกสารประกอบ Chrome ไม่เรียกใช้ requestAnimationFrame() เมื่อหน้าเว็บอยู่ในเบื้องหลัง ลักษณะการทำงานนี้เป็นมาตั้งแต่ปี 2011

การปรับตัวตั้งเวลาเบื้องหลัง

ตั้งแต่ Chrome 11 เป็นต้นไป ตัวจับเวลาแต่ละรายการจะทำงานไม่เกิน 1 ครั้งต่อวินาที Chrome จะเรียกใช้ตัวจับเวลาเหล่านี้เป็นชุดวินาทีละครั้งเพื่อให้มั่นใจได้ว่าจำนวน Wakeup ของกระบวนการจะอยู่ในระดับต่ำสุด หน้าที่เล่นเสียงได้จะถือว่าผู้ใช้มองเห็นได้และได้รับการยกเว้นจากการควบคุมตัวจับเวลาในเบื้องหลัง การยกเว้นจะมีผลเป็นเวลาหลายวินาทีหลังจากที่เสียงหยุดเล่นเพื่อให้แอปพลิเคชันจัดคิวแทร็กเสียงถัดไป

โปรดทราบว่าเสียงจะถือว่าได้ยินเสียงเมื่อและเมื่อ Chrome แสดงไอคอนเสียงเท่านั้น สตรีมเสียงเงียบจะไม่ให้การยกเว้น

การควบคุมตัวจับเวลาในเบื้องหลังตามงบประมาณ

การจัดส่งใน Chrome 57 การควบคุมตัวจับเวลาโดยอิงตามงบประมาณเป็นส่วนเสริมของกลไกการปรับตัวจับเวลา ซึ่งเพิ่มขีดจำกัดการใช้งาน CPU ของตัวจับเวลาในเบื้องหลัง โดยมีวิธีการทำงานดังนี้

  • แท็บเบื้องหลังแต่ละแท็บจะมีงบประมาณเวลา (เป็นวินาที) สำหรับเรียกใช้ตัวจับเวลาในเบื้องหลัง
  • หน้าเว็บอาจมีข้อจำกัดด้านเวลาหลังจาก 10 วินาทีในเบื้องหลัง
  • งานตัวจับเวลาจะทำงานเมื่องบประมาณด้านเวลาไม่ติดลบเท่านั้น
  • หลังจากจับเวลาแล้ว เวลาที่แสดงจะถูกหักออกจากงบประมาณ
  • ระบบจะสร้างงบประมาณใหม่อย่างต่อเนื่องเมื่อเวลาผ่านไป (ปัจจุบันกำหนดเป็นอัตรา 0.01 วินาทีต่อวินาที) โปรดทราบว่าอัตราการสร้างงบประมาณใหม่นี้อาจปรับเปลี่ยนได้เนื่องจาก Chrome รวบรวมข้อมูลเพิ่มเติมเกี่ยวกับพฤติกรรมการควบคุม

การยกเว้นอัตโนมัติจากการควบคุมนี้มีอยู่ด้วยกันหลายประการ ได้แก่

  • แอปพลิเคชันที่เล่นเสียงจะถือว่าเป็นการทำงานเบื้องหน้าและจะไม่ถูกควบคุม
  • แอปพลิเคชันที่มีการเชื่อมต่อแบบเรียลไทม์ (WebSockets และ WebRTC) เพื่อหลีกเลี่ยงการปิดการเชื่อมต่อเหล่านี้ด้วยการหมดเวลา กฎรันไทม์หนึ่งครั้งต่อวินาทียังคงมีผลในกรณีเหล่านี้

โปรดทราบว่ากลไกของเขาใช้เวลาทำงานจริง ไม่ใช่เวลา CPU เป็นระยะเวลาที่ CPU ใกล้เคียงโดยประมาณและบทลงโทษจากการบล็อกเทรดหลักเป็นระยะเวลานาน

สุดท้าย โปรดทราบว่าหากคุณใช้งานที่ใช้เวลานานในเบื้องหลัง ระบบอาจควบคุมแอปพลิเคชันของคุณเป็นระยะเวลาที่นานมาก (มีระยะเวลามากถึง 100 เท่าของงานของคุณ) แบ่งงานออกเป็นช่วงๆ ที่ไม่เกิน 50 มิลลิวินาทีตามหลักเกณฑ์ด้านประสิทธิภาพ และใช้ Listener ของ visibilityChange เพื่อหลีกเลี่ยงการทำงานที่ไม่จำเป็นในเบื้องหลัง

การเลือกไม่ใช้

Chrome แสดงค่าสถานะ --disable-background-timer-throttling สำหรับกรณีการใช้งานต่างๆ เช่น การเรียกใช้ชุดทดสอบและการคำนวณอื่นๆ ที่ผู้ใช้อนุมัติ