Compositing (การประกอบ) คือกระบวนการรวมเลเยอร์ภาพหลายชั้น (layers) เข้าเป็นภาพสุดท้ายภาพเดียว ตาม เอกสาร Apple Core Animation, 2025 ในการพัฒนาแอปมือถือ การประกอบใช้สำหรับซ้อนทับเลเยอร์ UI รวมการเรนเดอร์ 3D เข้ากับอินเทอร์เฟซ และสร้างแอนิเมชัน Compositing ควบคุมลำดับการวาด ความโปร่งใส และการผสมสีระหว่างเลเยอร์
ประเด็นสำคัญ
Compositing คือขั้นตอนสุดท้ายของไปป์ไลน์กราฟิกที่เลเยอร์ที่เรนเดอร์แยกกันทั้งหมด (ฉาก 3D, องค์ประกอบ UI, วิดีโอ, อินเทอร์เฟซระบบ) ถูกรวมเป็นภาพเดียวเพื่อแสดงบนหน้าจอ แต่ละเลเยอร์สามารถมีสี ความโปร่งใส (alpha) ตำแหน่ง และลำดับการซ้อนของตัวเอง
ในบริบทของการพัฒนาแอปมือถือ การประกอบมีความสำคัญต่ออินเทอร์เฟซผู้ใช้: หน้าต่าง ปุ่ม ข้อความ ไอคอน — องค์ประกอบทั้งหมดเหล่านี้ถูก ประกอบ เป็นฉากเดียว ระบบการประกอบจัดการลำดับการวาด (z-order) การซ้อนทับที่ถูกต้องขององค์ประกอบโปร่งแสง และแอนิเมชันการเปลี่ยนระหว่างสถานะ UI
ในไปป์ไลน์กราฟิก การประกอบเกิดขึ้นหลังจากผ่านชาเดอร์ทั้งหมดและการแรสเตอร์เสร็จสมบูรณ์ GPU นำเลเยอร์ที่เสร็จแล้วจาก framebuffer ใช้การดำเนินการ blending และเขียนผลลัพธ์ลงใน framebuffer หลัก (front buffer) เพื่อส่งไปยังหน้าจอ
Compositing ใช้การผสมสีแบบพิกเซลต่อพิกเซล (blending) จากเลเยอร์ต่างๆ แต่ละพิกเซลของภาพเอาต์พุตคำนวณจากสีพิกเซลของเลเยอร์ที่ซ้อนทับ โดยคำนึงถึงความโปร่งใส (ช่อง alpha) และโหมดการผสมที่เลือก
แต่ละเลเยอร์ประกอบด้วยช่อง alpha (องค์ประกอบสีที่สี่ของ RGBA) ที่กำหนดความทึบของมัน Alpha = 1.0 — ทึบแสงอย่างสมบูรณ์, alpha = 0.0 — โปร่งใสอย่างสมบูรณ์ Alpha blending คำนวณสีพิกเซลเป็นผลรวมถ่วงน้ำหนักของสีของเลเยอร์ด้านหน้า (source) และด้านหลัง (destination): ผลลัพธ์ = source * alpha + dest * (1 - alpha)
การประกอบดำเนินการจากเลเยอร์ที่ไกลที่สุดไปหาใกล้ที่สุด (back-to-front) ขั้นแรก เลเยอร์พื้นหลังถูกเรนเดอร์ จากนั้นแต่ละเลเยอร์ถัดไปจะถูกซ้อนทับบนเลเยอร์ก่อนหน้าโดยคำนึงถึงความโปร่งใสของมัน Z-order กำหนดว่าเลเยอร์ใดอยู่ด้านบนและจะปกคลุมเลเยอร์ด้านล่าง
Compositing รองรับโหมดการผสมต่างๆ (blend modes) ที่กำหนดว่าสีของเลเยอร์ถูกรวมกันอย่างไร แต่ละโหมดให้เอฟเฟกต์ภาพที่แตกต่างกันและมีต้นทุนการคำนวณของตัวเอง
| โหมด | สูตร | การใช้งาน |
|---|---|---|
| Normal (Alpha) | src * a + dst * (1 - a) | การซ้อนทับมาตรฐานด้วยความโปร่งใส |
| Additive | src + dst | เอฟเฟกต์เรืองแสง อนุภาค |
| Multiply | src * dst | การแรเงา เงา |
| Screen | 1 - (1 - src) * (1 - dst) | การทำให้สว่าง ไฮไลต์ |
| Premultiplied Alpha | (src.rgb * a) + dst * (1 - a) | ประสิทธิภาพ (ไม่ต้องคูณขณะทำงาน) |
ในโหมด premultiplied alpha ช่องสีจะถูกเก็บโดยคูณด้วยช่อง alpha แล้ว (RGB × A) สิ่งนี้ขจัดความจำเป็นในการคูณในการดำเนินการ blending แต่ละครั้ง ช่วยเร่งการประกอบ Premultiplied alpha เป็นรูปแบบมาตรฐานสำหรับ GPU compositing ใน iOS Core Animation และ Android HWUI
ระบบปฏิบัติการมือถือแต่ละระบบมีระบบการประกอบของตัวเองที่ปรับให้เหมาะสมสำหรับแพลตฟอร์มฮาร์ดแวร์ของตน Compositing ในระบบปฏิบัติการมือถือรับผิดชอบการเรนเดอร์อินเทอร์เฟซผู้ใช้ทั้งหมด
ใน iOS การประกอบถูกจัดการโดย Core Animation — ระบบระดับสูงที่ทำงานบน Metal หรือ OpenGL ES Core Animation สร้าง layer tree (ต้นไม้เลเยอร์) ที่จากนั้นถูกประกอบเป็นภาพสุดท้าย Core Animation จะกำหนดโดยอัตโนมัติว่าเลเยอร์ใดเปลี่ยนแปลงและวาดเฉพาะเลเยอร์เหล่านั้นใหม่ (การประกอบแบบเพิ่มหน่วย) ซึ่งช่วยลดภาระของ GPU
ใน Android การประกอบดำเนินการโดย SurfaceFlinger — บริการระบบที่รวมพื้นผิว (surfaces) จากแอปพลิเคชันต่างๆ และ UI ของระบบ SurfaceFlinger ใช้ HWC (Hardware Composer) เพื่อโอนส่วนหนึ่งของงานประกอบไปยังฮาร์ดแวร์เฉพาะของตัวควบคุมหน้าจอ
ประสิทธิภาพของการประกอบ เป็นคอขวดที่พบบ่อยในแอปพลิเคชันมือถือ โดยเฉพาะอย่างยิ่งกับแอนิเมชันที่ซับซ้อนและการซ้อนทับของเลเยอร์โปร่งแสงหลายชั้น แต่ละเลเยอร์เพิ่มเติมต้องอ่าน ผสม และเขียนพิกเซลในหน่วยความจำ
อุปกรณ์มือถือสมัยใหม่ทำการประกอบบน GPU ผ่านหน่วย blending เฉพาะทาง GPU compositing ใช้หน่วย ROP แบบขนานและตัวกรองพื้นผิวเพื่อการผสมพิกเซลที่รวดเร็ว CPU compositing ใช้เฉพาะในกรณีที่หายาก (อุปกรณ์เก่า การทดสอบ)
การปรับแต่งการประกอบ เป็นหนึ่งในงานหลักในการพัฒนาอินเทอร์เฟซมือถือ ความลื่นไหลของ UI (60 FPS) ขึ้นอยู่กับประสิทธิภาพของการรวมเลเยอร์โดยตรง
สำหรับการวิเคราะห์ประสิทธิภาพการประกอบ ให้ใช้: Core Animation Profiler (Xcode Instruments) — แสดงจำนวนเลเยอร์และความถี่ในการประกอบ; GPU Debugger (Android Studio) — แสดงภาระ GPU และ overdraw; Overdraw Visualization — เครื่องมือดีบักที่แสดงพื้นที่ของการวาดพิกเซลซ้ำหลายครั้ง
คำถามที่พบบ่อย
Compositing เหมือนกับการซ้อนแผ่นโปร่งใสหลายแผ่นที่มีภาพวาดเป็นภาพเดียว แต่ละแผ่นคือเลเยอร์ (ปุ่ม พื้นหลัง ข้อความ) และ ความโปร่งใส กำหนดว่าเลเยอร์มองเห็นผ่านกันและกันอย่างไร
การเรนเดอร์ — การสร้างเนื้อหาของแต่ละเลเยอร์ (การวาดปุ่ม การใส่พื้นผิวโมเดล 3D) การประกอบ — การรวมเลเยอร์ที่เสร็จแล้วเป็นภาพสุดท้ายโดยคำนึงถึงความโปร่งใสและลำดับการซ้อน
Core Animation ประกอบเลเยอร์บน GPU ผ่าน Metal ปัญหาเริ่มต้นเมื่อมีเลเยอร์โปร่งแสงจำนวนมาก (overdraw) หรือเมื่อมี CPU compositing (การเรนเดอร์นอกหน้าจอ) ใช้ Core Animation Profiler เพื่อวินิจฉัย
Hardware Composer (HWC) คือโมดูลฮาร์ดแวร์ของตัวควบคุมหน้าจอที่ทำการประกอบโดยไม่โหลด GPU HWC สามารถรวมเลเยอร์ได้มากถึง 4-8 ชั้นในฮาร์ดแวร์ ซึ่งลดการใช้พลังงานและปล่อย GPU สำหรับงานอื่น
รวมเลเยอร์คงที่ (layer flattening) ใช้สีทึบแสงเมื่อเป็นไปได้ ลดขนาดบัฟเฟอร์ offscreen และ หลีกเลี่ยงแอนิเมชันที่ไม่จำเป็น ที่ทำให้เกิดการประกอบฉากทั้งหมดใหม่
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม