สแนปชอตของงาน

ภาพรวมงานคือโครงสร้างพื้นฐานที่เปิดตัวใน Android 8.0 ที่รวม ภาพหน้าจอสำหรับภาพปกล่าสุด รวมถึงแพลตฟอร์มที่บันทึกไว้ จาก Window Manager ภาพขนาดย่อล่าสุด แสดงสถานะล่าสุดของงานใน คือมุมมอง "ล่าสุด"

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

สถาปัตยกรรม

ทั้ง 2 แนวคิดของ "ภาพขนาดย่อล่าสุด" และ "พื้นผิวที่บันทึกไว้" จะรวมอยู่ด้วยกันกับ "งาน" สแนปชอต เมื่องานทำงานในพื้นหลัง ตัวจัดการหน้าต่างจะวางภาพหน้าจอ ของงานนี้ลงใน GraphicBuffer ตราบใดที่แอปชั้นบนสุด ของกิจกรรมของงานดังกล่าวจะอยู่ในหน่วยความจำ GraphicBuffer นี้จะถูกเก็บไว้ใน ความทรงจำ ทีนี้ เมื่อนำกิจกรรมเดิมมาไว้หน้าสุดอีกครั้ง หน้าต่าง ผู้จัดการจะสร้างหน้าต่างเริ่มต้น (TaskSnapshotSurface) และแนบ GraphicBuffer โดยไม่ต้องคัดลอกหน่วยความจำไปยังคิวบัฟเฟอร์ของการเริ่มต้น ทันทีที่กิจกรรมวาดเฟรมแรก สแนปชอตงาน หน้าต่างเริ่มต้นจะค่อยๆ เลือนหายไปเหมือนหน้าจอแนะนำทั่วไป

GraphicBuffer เดียวกันยังส่งผ่าน Binder ไปยัง SystemUI เพื่อนำไปใช้วาด สถานะการดูตัวอย่างงานในมุมมอง "ล่าสุด" เนื่องจากนี่เป็นเพียงข้อมูลอ้างอิง ไปยังบัฟเฟอร์ การส่งไฟล์ไปยังไฟล์ Binder จะใช้ทรัพยากรเพียงเล็กน้อย เมื่อ GraphicBuffer มาถึง SystemUI และถูกรวมไว้ในบิตแมปของฮาร์ดแวร์แล้ว ที่วาดลงบนหน้าจอโดยไม่มีการอัปโหลดหน่วยความจำใดๆ ไปยังหน่วยความจำกราฟิก

ข้อดี

สถาปัตยกรรมใหม่นี้มีประโยชน์หลักๆ 3 ประการดังนี้

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

การใช้งาน

ฟีเจอร์นี้มีอยู่ทั้งหมดในแพลตฟอร์ม Android ไม่มีการผสานรวม ไม่ได้ รวมทั้งไม่รองรับการปรับแต่ง อย่างไรก็ตาม ผู้ผลิตอุปกรณ์สามารถ ปิดใช้ฟีเจอร์สแนปชอตงานทั้งหมด

หากต้องการปิดใช้ฟีเจอร์นี้ ให้แก้ไขฟังก์ชันนี้

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

โปรดทราบว่าหากปิดใช้งานฟีเจอร์นี้ มุมมอง "ล่าสุด" จะไม่แสดง ภาพขนาดย่อเลย

สแนปชอตความละเอียดสูงและความละเอียดต่ำ

สแนปชอตงานจะเขียนลงในดิสก์เป็น 2 สเกล เมื่อกู้คืนงาน สแนปชอตจากดิสก์ จะมีการอ่านสแนปชอตที่มีความละเอียดต่ำก่อน จากนั้นแทนที่ด้วย ความละเอียดสูง การเพิ่มประสิทธิภาพนี้จะช่วยปรับปรุงเวลาที่ใช้ในการโหลดรูปภาพ มิฉะนั้น อาจมีความล่าช้าเล็กน้อยเมื่ออ่านไฟล์สแนปชอตจาก ผู้ใช้จะเห็นการ์ดงานที่ว่างเปล่าจนกว่าภาพจะพร้อมใช้งาน คุณสามารถกำหนดค่าการปรับขนาดในไฟล์การกำหนดค่าการวางซ้อนอุปกรณ์ overlay/frameworks/base/core/res/res/values/config.xmlตามการตั้งค่า config_highResTaskSnapshotScale และ config_lowResTaskSnapshotScale ค่าเริ่มต้นจะเป็น 1.0 และ 0.5 ตามลำดับ ปิดใช้สแนปชอตความละเอียดต่ำโดยการตั้งค่า config_lowResTaskSnapshotScale ถึง 0.0

ตัวอย่างและแหล่งที่มา

ค้นหาโค้ดที่เหลือของฟีเจอร์นี้ภายในไฟล์ TaskSnapshot* ใน

frameworks/base/+/main/services/core/java/com/android/server/wm/