ภาพรวมงาน

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

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

สถาปัตยกรรม

แนวคิดของภาพปกรายการล่าสุดและพื้นผิวที่บันทึกไว้จะรวมเข้ากับภาพหน้าจอของงาน เมื่องานทำงานอยู่เบื้องหลัง Window Manager จะวางภาพหน้าจอของงานนี้ลงใน GraphicBuffer ตราบใดที่แอปของกิจกรรมที่ทำงานอยู่สูงสุดของงานยังคงอยู่ในหน่วยความจำ GraphicBuffer นี้จะยังคงอยู่ในหน่วยความจำ ตอนนี้เมื่อนํากิจกรรมเดียวกันมาไว้ที่ด้านหน้าอีกครั้ง WindowManager จะสร้างหน้าต่างเริ่มต้น (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/