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

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

ตรวจสอบเวลาในการวาดภาพในหน้าเว็บ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Screencast ของ Continuouspaint

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

หมายเหตุ

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

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

การสาธิตการใช้งานแบบสด

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