ภาพรวมงาน

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

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

สถาปัตยกรรม

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

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

ประโยชน์

ประโยชน์หลักสามประการสำหรับสถาปัตยกรรมใหม่นี้:

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

การนำไปปฏิบัติ

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

หากต้องการปิดใช้งานคุณสมบัตินี้ ให้แก้ไขฟังก์ชันนี้:

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

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

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

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