Impeller เป็นเอ็นจินเรนเดอร์สมัยใหม่สำหรับ Flutter ที่พัฒนาโดย Google เพื่อแทนที่ Skia และแก้ไขปัญหาพื้นฐานของมัน: การกระตุกของเชเดอร์ (jank) ระหว่างการเรนเดอร์เฟรมแรก การใช้หน่วยความจำสูง และความซับซ้อนในการรองรับแบ็กเอนด์กราฟิกที่แตกต่างกัน แตกต่างจาก Skia ตรงที่ Impeller จะคอมไพล์เชเดอร์ล่วงหน้า (ออฟไลน์) ใช้ SPIR-V เป็นรูปแบบแสดงผลขั้นกลาง และทำงานโดยตรงกับ Vulkan, Metal และ Direct3D 12 ตามข้อมูลจาก Flutter Team (2025) Impeller สามารถกำจัดการกระตุกของเชเดอร์ได้ถึง 95% ทำให้ได้ 60 FPS ที่คาดเดาได้แม้บนอุปกรณ์ระดับเริ่มต้น
ประเด็นสำคัญ
Impeller คือเอ็นจินเรนเดอร์กราฟิกโอเพนซอร์สที่เขียนด้วยภาษา C++ ซึ่งพัฒนาโดยทีม Flutter เพื่อแทนที่ Skia ในฐานะเรนเดอร์หลัก โครงการนี้ประกาศในปี 2021 เพื่อตอบสนองต่อปัญหาการกระตุกของเชเดอร์ที่ยาวนานที่ Skia เผชิญอยู่ Impeller ไม่ใช่ fork ของ Skia — มันเป็นการนำเสนอใหม่ทั้งหมดที่ออกแบบโดยคำนึงถึงข้อจำกัดของ GPU มือถือและ API กราฟิกสมัยใหม่
แนวคิดหลักของ Impeller คือการย้ายการคอมไพล์เชเดอร์ไปยังขั้นตอนการสร้างแอปพลิเคชันแทนที่จะเป็นเวลาทำงาน ใน Skia เชเดอร์จะถูกคอมไพล์เมื่อใช้งานครั้งแรก เมื่อผู้ใช้กำลังโต้ตอบกับแอปพลิเคชันอยู่แล้ว Impeller จะคอมไพล์เชเดอร์ทั้งหมดล่วงหน้า (ออฟไลน์) บรรจุในรูปแบบไบนารี SPIR-V และจัดส่งพร้อมกับแอปพลิเคชัน ในเวลาทำงาน Impeller จะโหลดเชเดอร์ที่คอมไพล์ไว้ล่วงหน้า ซึ่งช่วยขจัดความล่าช้าในการคอมไพล์
Impeller ยังแก้ปัญหาการใช้หน่วยความจำอีกด้วย Skia สร้างวัตถุชั่วคราวจำนวนมาก (เท็กซ์เจอร์, บัฟเฟอร์) ระหว่างการเรนเดอร์ ซึ่งนำไปสู่การแตกกระจายของหน่วยความจำบนอุปกรณ์ที่มีทรัพยากรจำกัด Impeller ใช้พูลหน่วยความจำและนำทรัพยากรที่จัดสรรแล้วกลับมาใช้ใหม่ ซึ่งช่วยลดการใช้หน่วยความจำสูงสุดลง 30–40%
SPIR-V (Standard Portable Intermediate Representation) คือรูปแบบแสดงผลขั้นกลางของเชเดอร์ที่พัฒนาโดย Khronos Group Impeller ใช้ SPIR-V เป็นรูปแบบสากลสำหรับเชเดอร์ทั้งหมด ในระหว่างขั้นตอนการสร้าง เชเดอร์ที่เขียนด้วยภาษา Impeller (DSL C++ ที่กำหนดเองสำหรับอธิบายเอฟเฟกต์) จะถูกคอมไพล์เป็น SPIR-V ในเวลาทำงาน SPIR-V จะถูกโหลดและแปลงเป็นรูปแบบเฉพาะแพลตฟอร์ม — MSL สำหรับ Metal, GLSL สำหรับ Vulkan หรือ DXIL สำหรับ Direct3D 12
สถาปัตยกรรมของ Impeller ประกอบด้วยหลายชั้น แต่ละชั้นทำงานที่กำหนดไว้อย่างชัดเจน: การประมวลผลรายการคำสั่งเรนเดอร์ การจัดการทรัพยากร GPU และการดำเนินการเชเดอร์ ความเป็นโมดูลนี้ทำให้เพิ่มการรองรับ API กราฟิกใหม่ได้ง่าย
ชั้นล่างสุดคือสิ่งที่เป็นนามธรรมเหนือ API กราฟิก (Vulkan, Metal, Direct3D 12) Impeller ไม่รองรับ OpenGL เนื่องจาก OpenGL ไม่มีความสามารถสำหรับการคอมไพล์เชเดอร์ออฟไลน์ที่มีประสิทธิภาพ ในระดับนี้มีการดำเนินการ: การจัดการบัฟเฟอร์จุดยอด การสร้างและแคชไปป์ไลน์ และการซิงโครไนซ์ GPU ไปป์ไลน์ ใน Impeller คือสถานะ GPU ที่คอมไพล์ไว้ล่วงหน้าซึ่งรวมถึงเชเดอร์ การตั้งค่าราสเตอร์ไรเซชัน และการเบลนด์ ไปป์ไลน์ทั้งหมดจะถูกสร้างขึ้นระหว่างการเริ่มต้นระบบ ซึ่งช่วยขจัดการคอมไพล์ระหว่างการเรนเดอร์
ชั้นกลางคือระบบจัดการทรัพยากร มันจัดสรรและนำทรัพยากร GPU กลับมาใช้ใหม่: เท็กซ์เจอร์, บัฟเฟอร์, ตัวอย่าง แทนที่จะสร้างเท็กซ์เจอร์ใหม่ทุกเฟรม Impeller จะรักษาพูลของเท็กซ์เจอร์ที่มีขนาดและรูปแบบต่างๆ พูลหน่วยความจำ จะส่งคืนทรัพยากรที่ไม่ได้ใช้โดยอัตโนมัติและสามารถขยายได้เมื่อจำเป็น แต่ไม่มีการแตกกระจายเหมือนอย่าง Skia
ชั้นบนสุดคือกราฟเรนเดอร์ ซึ่ง Flutter Engine แปลงคำสั่ง Canvas API Impeller รับ Display List (รายการคำสั่งวาด) และสร้างกราฟการพึ่งพาการดำเนินการจากมัน กราฟจะถูกปรับให้เหมาะสม: การเรนเดอร์พาสที่ซ้ำซ้อนจะถูกลบออก การดำเนินการที่มีสถานะ GPU เดียวกันจะถูกรวมเข้าด้วยกัน จากนั้นกราฟจะถูก คอมไพล์ เป็นลำดับการเรียก Vulkan/Metal โดยใช้ไปป์ไลน์ที่สร้างไว้ล่วงหน้า
แต่ละเฟรมจะผ่านไปป์ไลน์คงที่: Display List → กราฟเรนเดอร์ → การคอมไพล์กราฟ → การส่งคำสั่ง GPU สามารถเพิ่มพาสเพิ่มเติมสำหรับเอฟเฟกต์หลังการประมวลผล (เบลอ, เงา) หรือการเตรียมบัฟเฟอร์ความลึก เวลาเฟรม ใน Impeller คาดเดาได้มากกว่าใน Skia เนื่องจากไม่มีความล่าช้าที่ไม่แน่นอนจากการคอมไพล์เชเดอร์
การเปรียบเทียบระหว่าง Impeller และ Skia แสดงให้เห็นถึงความแตกต่างในวิธีการเรนเดอร์ Skia เป็นไลบรารี 2D วัตถุประสงค์ทั่วไป ในขณะที่ Impeller เป็นเอ็นจินเฉพาะสำหรับ Flutter ที่ปรับให้เหมาะสมกับความต้องการของ UI บนมือถือ
| พารามิเตอร์ | Skia | Impeller |
|---|---|---|
| เชเดอร์ | การคอมไพล์ขณะรันไทม์ | การคอมไพล์ออฟไลน์ (เวลาสร้าง) |
| การกระตุกของเชเดอร์ | 50–200 มิลลิวินาทีในเฟรมแรก | ไม่มี (0 มิลลิวินาที) |
| รูปแบบเชเดอร์ | กรรมสิทธิ์ (SkSL) | SPIR-V (สากล) |
| แบ็กเอนด์ GPU | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| การใช้หน่วยความจำ | สูง (เท็กซ์เจอร์ชั่วคราว) | พูลหน่วยความจำ ลดได้ถึง -40% |
| แพลตฟอร์ม | Android, iOS, Web, เดสก์ท็อป | Android, iOS, เดสก์ท็อป |
| สถานะ | เสถียร (หลัก) | ตัวอย่าง (กำลังแทนที่ Skia) |
ความแตกต่างหลักคือวิธีการจัดการเชเดอร์ Skia จะคอมไพล์เชเดอร์ในขณะที่ใช้งาน ทำให้เกิด การกระตุกของเชเดอร์ เมื่อเรนเดอร์เอฟเฟกต์ที่ไม่คุ้นเคยเป็นครั้งแรก Impeller ขจัดปัญหานี้ด้วยการคอมไพล์ออฟไลน์ นอกจากนี้ Skia ยังรองรับ OpenGL ซึ่งจำเป็นสำหรับเวอร์ชันเว็บของ Flutter แต่ Impeller ละทิ้ง OpenGL เพื่อหันไปใช้ API ที่ทันสมัยกว่า ซึ่งให้ประสิทธิภาพที่ดีกว่าบนอุปกรณ์มือถือ
สำหรับแอปพลิเคชัน Flutter การเปลี่ยนไปใช้ Impeller ไม่จำเป็นต้องเปลี่ยนแปลงโค้ด Impeller ใช้ Canvas API เดียวกับ Skia ดังนั้นวิดเจ็ต อนิเมชัน และการวาดแบบกำหนดเองทั้งหมดทำงานเหมือนกัน ความเข้ากันได้ย้อนหลัง ได้รับการรับรองในระดับ Flutter Engine — เอ็นจินจะเลือกเรนเดอร์ (Skia หรือ Impeller) ในขั้นตอนการเริ่มต้นแอปพลิเคชัน
Impeller ให้ข้อได้เปรียบที่วัดได้หลายประการเมื่อเทียบกับ Skia ซึ่งส่งผลโดยตรงต่อประสบการณ์ผู้ใช้และประสิทธิภาพของแอปพลิเคชัน Flutter
การกระตุกของเชเดอร์เป็นปัญหาหลักของ Skia ที่ Impeller แก้ไขได้อย่างสมบูรณ์ เมื่อแอปพลิเคชัน Flutter แสดงหน้าจอใหม่ที่มีการไล่เฉดสี มาสก์ หรือการเบลนด์ที่ไม่ได้มาตรฐาน Skia จะคอมไพล์เชเดอร์ระหว่างอนิเมชัน ทำให้เกิดการดรอปของเฟรม Impeller จะคอมไพล์เชเดอร์ทั้งหมดในขั้นตอนการสร้าง ดังนั้นเฟรมแรกจึงเรนเดอร์ได้เร็วเท่ากับเฟรมถัดไป บนอุปกรณ์ที่มี GPU ช้า (MediaTek Helio, Qualcomm 400 series) ความแตกต่างจะสังเกตเห็นได้ชัดเป็นพิเศษ — ความล่าช้าสูงถึง 200 มิลลิวินาทีสำหรับเอฟเฟกต์ชนิดใหม่แต่ละประเภทใน Skia เทียบกับ 0 มิลลิวินาทีใน Impeller
Impeller ใช้พูลทรัพยากรสำหรับจัดการหน่วยความจำ GPU ใน Skia แต่ละเฟรมอาจสร้างเท็กซ์เจอร์ใหม่สำหรับพื้นผิวชั่วคราว โดยเฉพาะอย่างยิ่งเมื่อเรนเดอร์ด้วยความโปร่งใสหรือใช้ saveLayer Impeller จะนำเท็กซ์เจอร์กลับมาใช้ใหม่ระหว่างเฟรม ซึ่งช่วยลดการใช้หน่วยความจำสูงสุดลง 30–40% บน Android และสูงถึง 25% บน iOS ซึ่งสำคัญโดยเฉพาะสำหรับแอปพลิเคชันที่มีรายการยาวและอนิเมชัน ซึ่ง Skia อาจทำให้เกิดข้อผิดพลาด OOM บนอุปกรณ์ที่มี RAM 2 GB
ใน Skia เวลาในการเรนเดอร์เฟรมอาจแตกต่างกันไปขึ้นอยู่กับว่าเชเดอร์ใดถูกคอมไพล์แล้ว เฟรมแรกที่มีเอฟเฟกต์ใหม่อาจใช้เวลา 50–200 มิลลิวินาที ในขณะที่เฟรมถัดไปใช้เวลา 3–5 มิลลิวินาที ความไม่แน่นอน นี้ทำให้การปรับให้เหมาะสมและการทดสอบทำได้ยาก Impeller รับประกันเวลาเฟรมที่สม่ำเสมอ เนื่องจากเชเดอร์ทั้งหมดถูกคอมไพล์แล้วและการจัดสรรหน่วยความจำสามารถคาดเดาได้ Flutter Engine ที่มาพร้อม Impeller สามารถคำนวณงบเวลาในแต่ละเฟรมได้แม่นยำยิ่งขึ้น
Impeller ทำงานโดยตรงกับ Vulkan (Android), Metal (iOS) และ Direct3D 12 (Windows) โดยไม่มีชั้น OpenGL สิ่งนี้ให้ข้อดีหลายประการ: ความหน่วงของไดรเวอร์ต่ำกว่า (น้อยกว่า OpenGL ถึง 50%), การควบคุมหน่วยความจำ GPU โดยตรง และการเข้าถึงความสามารถสมัยใหม่ (สถาปัตยกรรม GPU แบบเรียงต่อกัน, การเรนเดอร์ที่ขับเคลื่อนด้วย GPU) OpenGL ไม่ได้รับการพัฒนาต่ออีกแล้ว และไดรเวอร์บนอุปกรณ์มือถือมักจะกลายเป็นคอขวดด้านประสิทธิภาพ
Impeller อยู่ระหว่างการพัฒนาอย่างต่อเนื่องและพร้อมใช้งานในช่องทาง Flutter Master และ Beta เริ่มต้นจาก Flutter 3.16 Impeller เปิดใช้งานตามค่าเริ่มต้นบน iOS และเปิดใช้งานเป็นตัวเลือกบน Android ผ่านแฟล็กการกำหนดค่า การแทนที่ Skia ด้วย Impeller อย่างสมบูรณ์คาดว่าจะเกิดขึ้นในหนึ่งในรุ่นเสถียรของ Flutter ในปี 2026
บน iOS Impeller ทำงานผ่าน Metal และเปิดใช้งานตามค่าเริ่มต้นตั้งแต่ Flutter 3.16 ทีม Flutter แนะนำให้ทดสอบแอปพลิเคชันบน Impeller และรายงานปัญหา หากต้องการกลับไปใช้ Skia ให้ใช้แฟล็ก Impeller ในไฟล์ Info.plist: FlutterEnableImpeller = NO ตามข้อมูลของ Flutter Team 92% ของแอปพลิเคชัน iOS ทำงานบน Impeller โดยไม่มีการถดถอยที่มองเห็นได้ และประสิทธิภาพอนิเมชันดีขึ้น 25–40%
บน Android Impeller ทำงานผ่าน Vulkan หากต้องการเปิดใช้งาน ให้เพิ่มเมตาแท็ก io.flutter.embedded_views_preview ใน AndroidManifest.xml ทีม Flutter ยังคงปรับปรุง Impeller สำหรับสถาปัตยกรรม GPU ต่างๆ (Adreno, Mali, PowerVR) ความท้าทายหลักบน Android คือการรองรับอุปกรณ์ที่ไม่มี Vulkan (Android < 7.0 หรือ GPU เก่า) สำหรับอุปกรณ์ดังกล่าว จะใช้แบ็กเอนด์สำรองบน Skia หรือ Impeller ที่มีการแรสเตอร์ด้วยซอฟต์แวร์
บน Windows Impeller ทำงานผ่าน Direct3D 12 (เปิดใช้งานใน Flutter Master) บน macOS และ Linux — ผ่าน Metal และ Vulkan ตามลำดับ Impeller ไม่ได้วางแผนสำหรับเว็บ เนื่องจากเวอร์ชันเว็บของ Flutter ใช้ CanvasKit (Skia ผ่าน WebAssembly) และการกระตุกของเชเดอร์ไม่ใช่ปัญหาสำคัญสำหรับมันเนื่องจากกลไกการคอมไพล์เชเดอร์ที่แตกต่างกันในเบราว์เซอร์ เวอร์ชันเว็บ จะยังคงใช้ Skia ต่อไป
Google ได้เผยแพร่แผนงานของ Impeller: 2024 — Impeller เป็นค่าเริ่มต้นบน iOS; 2025 — Impeller เป็นค่าเริ่มต้นบน Android และ Windows; 2026 — การลบ Skia ออกจาก Flutter Engine อย่างสมบูรณ์ หลังจากนั้น Flutter จะใช้ Impeller เป็นเอ็นจินเรนเดอร์เพียงตัวเดียว ซึ่งจะทำให้การบำรุงรักษาง่ายขึ้น ลดขนาดเอ็นจิน และปรับปรุงประสิทธิภาพบนทุกแพลตฟอร์ม
คำถามที่พบบ่อย
บน iOS Impeller เปิดใช้งานตามค่าเริ่มต้นตั้งแต่ Flutter 3.16 บน Android ให้เพิ่มเมตาแท็ก io.flutter.embedded_views_preview ด้วยค่า true ใน AndroidManifest.xml บน Windows ให้ใช้แฟล็ก --enable-impeller เมื่อเริ่มต้น ในทุกกรณี สามารถบังคับเปิดใช้งานผ่าน FlutterEngine ในโค้ด Dart
Skia ทำงานได้ แต่มีปัญหาพื้นฐาน: การกระตุกของเชเดอร์ (ความล่าช้าในการคอมไพล์เชเดอร์ 50–200 มิลลิวินาที) การใช้หน่วยความจำสูง และข้อจำกัดของสถาปัตยกรรม OpenGL Impeller ออกแบบมาเฉพาะสำหรับ Flutter และแก้ปัญหาเหล่านี้ด้วยการคอมไพล์เชเดอร์ออฟไลน์และพูลหน่วยความจำ
ใช่ Impeller ใช้ Canvas API เดียวกับ Skia วิดเจ็ต Flutter มาตรฐานทั้งหมด — ข้อความ รูปภาพ อนิเมชัน การวาดแบบกำหนดเอง — ทำงานบน Impeller โดยไม่ต้องเปลี่ยนแปลง ความเข้ากันได้ย้อนหลัง ได้รับการรับรองในระดับ Flutter Engine และการเปลี่ยนผ่านนั้นโปร่งใสสำหรับนักพัฒนา
ไม่ได้ แอปพลิเคชันใช้เอ็นจินเรนเดอร์ครั้งละหนึ่งตัว การเลือกจะทำเมื่อเริ่มต้น Flutter Engine ผ่านแฟล็ก การสลับระหว่าง Skia และ Impeller ระหว่างการทำงานของแอปพลิเคชันเป็นไปไม่ได้ — เรนเดอร์ จะถูกกำหนดจนกว่าจะสร้างอินสแตนซ์ FlutterEngine แรก
Skia จะยังคงมีอยู่ในฐานะไลบรารีอิสระของ Google สำหรับ Chrome, Android และโปรเจกต์อื่นๆ ใน Flutter Skia จะถูกแทนที่ด้วย Impeller ในฐานะเรนเดอร์หลัก Skia จะยังคงใช้สำหรับเวอร์ชันเว็บของ Flutter (ผ่าน CanvasKit) และเป็นตัวเลือกสำรองสำหรับอุปกรณ์ที่ไม่รองรับ Vulkan/Metal
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ