ทำโปรไฟล์ระยะเวลาในการวาดที่ยาวนานด้วยเครื่องมือสำหรับนักพัฒนาเว็บ' โหมดการวาดภาพแบบต่อเนื่อง

พอล ไอริช

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

การตรวจสอบระยะเวลาการวาดภาพในหน้าเว็บของคุณ

คุณจึงสังเกตเห็นว่าหน้าเว็บได้เลื่อนได้ไม่ราบรื่น นี่คือวิธีที่คุณจะเริ่ม จัดการกับปัญหา สำหรับตัวอย่าง เราจะใช้หน้าสาธิต Things We Left On The Moon โดย Dan Cederholm

คุณเปิดเครื่องมือตรวจสอบเว็บ เริ่มการบันทึกไทม์ไลน์ และเลื่อนหน้าเว็บขึ้นและลง จากนั้นดูที่ไทม์ไลน์แนวตั้ง ซึ่งจะแสดงสิ่งที่เกิดขึ้นในแต่ละเฟรม

ภาพหน้าจอการบันทึกไทม์ไลน์

หากคุณเห็นเวลาส่วนใหญ่ในการวาดภาพ (แถบสีเขียวขนาดใหญ่สูงกว่า 60 เฟรมต่อวินาที) คุณต้องตรวจสอบอย่างละเอียดว่าทำไมจึงเป็นเช่นนั้น หากต้องการตรวจสอบสี ให้ใช้การตั้งค่าแสดงสี่เหลี่ยมสีของเครื่องมือตรวจสอบเว็บ (ไอคอนฟันเฟืองที่มุมขวาล่างของเครื่องมือตรวจสอบเว็บ) ซึ่งจะแสดงภูมิภาคที่ใช้สี Chrome

ภาพหน้าจอเวลาที่ใช้ภาพวาดบนเส้นควบคุมเวลา

สาเหตุที่ทำให้ Chrome แสดงผลส่วนต่างๆ ของหน้าเว็บใหม่มีดังนี้

  • โหนด DOM มีการเปลี่ยนแปลงใน JavaScript ซึ่งทำให้ Chrome คำนวณเลย์เอาต์ของหน้าเว็บใหม่
  • ภาพเคลื่อนไหวกำลังเล่นที่จะอัปเดตในรอบตามเฟรม
  • การโต้ตอบของผู้ใช้ เช่น การวางเมาส์ ทำให้เกิดการเปลี่ยนแปลงรูปแบบในองค์ประกอบบางอย่าง
  • การดำเนินการอื่นๆ ที่ทำให้เลย์เอาต์หน้าเว็บเปลี่ยนแปลง

ในฐานะนักพัฒนาซอฟต์แวร์ คุณต้องตระหนักถึงการแสดงผลซ้ำที่เกิดขึ้นบนหน้าเว็บของคุณ การดูกรอบสี่เหลี่ยมสีก็เป็นวิธีที่ดี ในตัวอย่างภาพหน้าจอด้านบน คุณจะเห็นว่าทั้งหน้าจอมีการวาดรูปสี่เหลี่ยมผืนผ้าสำหรับวาดรูปขนาดใหญ่ แบบนี้หมายความว่าทั้งหน้าจอมีการทาสีใหม่ขณะที่คุณเลื่อน ซึ่งไม่ใช่เรื่องดี ในกรณีเฉพาะนี้ ปัญหานี้เกิดจากสไตล์ CSS background-attachment:fixed ซึ่งทำให้ภาพพื้นหลังของหน้าอยู่ในตำแหน่งเดิมในขณะที่เนื้อหาในหน้าเลื่อนขึ้นไปด้านบนขณะที่คุณเลื่อน

หากคุณพบว่าภาพใหม่ครอบคลุมพื้นที่ขนาดใหญ่และ/หรือใช้เวลานาน คุณมี 2 ทางเลือกดังนี้

  1. คุณสามารถลองเปลี่ยนเลย์เอาต์ของหน้าเพื่อลดปริมาณภาพวาด หากเป็นไปได้ Chrome จะทาสีหน้าที่มองเห็นได้เพียงครั้งเดียวและเพิ่มส่วนที่มองไม่เห็นขณะที่คุณเลื่อนลง อย่างไรก็ตาม ในบางกรณี Chrome จำเป็นต้องแสดงผลใหม่ในบางพื้นที่ เช่น กฎ CSS position:fixed ซึ่งมักใช้กับองค์ประกอบการนำทางที่อยู่ในตำแหน่งเดิมอาจทำให้เกิดการวาดใหม่
  2. หากคุณต้องการรักษาเลย์เอาต์ของหน้าเว็บไว้ ให้ลองลดค่าใช้จ่ายในการทาสีพื้นที่ที่ได้รับการทาสีใหม่ สไตล์ CSS แต่ละแบบมีค่าใช้จ่ายในการทาสีไม่เท่ากัน บางสไตล์มีผลกระทบน้อย และบางรูปแบบก็สำคัญมาก การคิดต้นทุนในการทาสีบางรูปแบบอาจเป็นงานหนัก ซึ่งทำได้โดยสลับรูปแบบในแผงองค์ประกอบ แล้วดูความแตกต่างของการบันทึกไทม์ไลน์ ซึ่งหมายถึงการสลับระหว่างแผงต่างๆ กับการบันทึกจำนวนมาก และนี่คือที่มาของโหมดการวาดภาพแบบต่อเนื่อง

โหมดการวาดภาพแบบต่อเนื่อง

โหมดการวาดภาพแบบต่อเนื่องเป็นเครื่องมือที่ช่วยคุณระบุว่าองค์ประกอบใดมีค่าใช้จ่ายในหน้าเว็บ ทำให้หน้ามีสภาพการทาสีใหม่อยู่เสมอ ซึ่งแสดงตัวนับว่ากำลังมีงานทาสีมากเพียงใด จากนั้นคุณสามารถซ่อนองค์ประกอบและเปลี่ยนสไตล์ คอยดูตัวนับ เพื่อดูว่าแบบใดทำงานช้า

การตั้งค่า

หากต้องการใช้โหมดการวาดภาพแบบต่อเนื่อง คุณต้องใช้ Chrome Canary

ในระบบ Linux (และ Mac บางรุ่น) คุณต้องตรวจสอบว่า Chrome ทำงานในโหมดจัดวางองค์ประกอบ ซึ่งจะสามารถเปิดใช้งานได้อย่างถาวรโดยใช้การตั้งค่า GPU การประสานในทุกหน้า ใน about:flags

วิธีการเริ่มต้น

คุณเปิดใช้โหมดการวาดภาพแบบต่อเนื่องได้ผ่านช่องทำเครื่องหมายเปิดใช้การเรียกซ้ำหน้าอย่างต่อเนื่องในการตั้งค่าของเครื่องมือตรวจสอบเว็บ (ไอคอนฟันเฟืองที่มุมขวาล่างของเครื่องมือตรวจสอบเว็บ)

โหมดการวาดภาพแบบต่อเนื่อง

จอแสดงผลขนาดเล็กที่มุมขวาบนจะแสดงเวลาของสีที่วัดได้เป็นมิลลิวินาที กล่าวอย่างเจาะจงก็คือ

  • เวลาในการลงสีที่วัดได้ล่าสุดทางด้านซ้าย
  • ค่าต่ำสุดและสูงสุดของกราฟปัจจุบันทางด้านขวา
  • แผนภูมิแท่งแสดงประวัติของ 80 เฟรมล่าสุดที่ด้านล่าง (เส้นในแผนภูมิระบุว่าเป็นจุดอ้างอิง 16 มิลลิวินาที)

การวัดเวลาในการทำสีขึ้นอยู่กับความละเอียดของหน้าจอ ขนาดหน้าต่าง และฮาร์ดแวร์ที่ Chrome ทำงานอยู่ โปรดทราบว่าข้อมูลเหล่านี้อาจแตกต่างออกไปสำหรับผู้ใช้

ขั้นตอนการทำงาน

วิธีใช้โหมดการวาดภาพแบบต่อเนื่องเพื่อติดตามองค์ประกอบและรูปแบบที่ทำให้มีค่าใช้จ่ายสำหรับการทาสีเพิ่มขึ้นมาก

  1. เปิดการตั้งค่าของเครื่องมือตรวจสอบเว็บ และทำเครื่องหมายที่เปิดใช้การจัดเรียงหน้าอย่างต่อเนื่อง
  2. ไปที่แผงองค์ประกอบและข้ามผ่านต้นไม้ DOM ด้วยปุ่มลูกศร หรือเลือกองค์ประกอบในหน้า
  3. ใช้แป้นพิมพ์ลัด H ซึ่งเป็นเครื่องมือช่วยเหลือใหม่ล่าสุดเพื่อเปิด/ปิดการแสดงองค์ประกอบ
  4. ดูกราฟเวลาลงสีและพยายามหาองค์ประกอบที่ทำให้ใช้เวลาในการวาดภาพเพิ่มขึ้นมาก
  5. ตรวจสอบรูปแบบ CSS ขององค์ประกอบนั้น สลับเปิดและปิดขณะดูกราฟ เพื่อค้นหารูปแบบที่ทำให้การทำงานช้าลง
  6. เปลี่ยนรูปแบบนี้และบันทึกไทม์ไลน์อีกครั้งเพื่อดูว่าการทำเช่นนี้ทำให้หน้าเว็บมีประสิทธิภาพดีขึ้นหรือไม่

ภาพเคลื่อนไหวด้านล่างแสดงการสลับรูปแบบและผลกระทบต่อเวลาในการวาด

Screencast แบบ Continuous Paint

ตัวอย่างนี้แสดงให้เห็นว่าการปิดรูปแบบ CSS box-shadow หรือ border-radius แบบใดแบบหนึ่งจะช่วยลดเวลาในการวาดลงได้อย่างมาก การใช้ทั้ง box-shadow และ border-radius ในองค์ประกอบจะนำไปสู่การดำเนินการทาสีที่แพงมาก เนื่องจาก Chrome ไม่สามารถเพิ่มประสิทธิภาพในเรื่องนี้ได้ ดังนั้นหากคุณมีองค์ประกอบที่มีการวาดใหม่จำนวนมาก เช่น ในตัวอย่าง คุณก็ควรหลีกเลี่ยงการใช้ชุดค่าผสมนี้

Notes

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

เมื่อใช้ continuous painting mode คุณอาจพบว่ารูปแบบ CSS border-radius และ box-shadow ทำให้ต้องใช้เวลาในการลงสีมากขึ้น เราไม่แนะนำฟีเจอร์ดังกล่าวโดยทั่วไป ฟีเจอร์ดังกล่าวยอดเยี่ยมมาก และเราก็ยินดีเป็นอย่างยิ่งที่ได้มาอยู่ที่นี่แล้ว แต่คุณควรทราบว่าควรใช้เมื่อใดและที่ไหน หลีกเลี่ยงการใช้สีเหล่านั้นในบริเวณที่มีสีวาดใหม่จำนวนมากและหลีกเลี่ยงการใช้สีเหล่านี้มากเกินไปโดยทั่วไป

การสาธิตสด

คลิกด้านล่างเพื่อดูการสาธิตที่พอล ไอริชใช้การวาดภาพอย่างต่อเนื่องเพื่อระบุการวาดภาพที่มีราคาแพงอย่างไม่เหมือนใคร