# Flutter Impeller 2026: สถาปัตยกรรม Rendering Engine, ประสิทธิภาพ และคำถามสัมภาษณ์ > Flutter Impeller แทนที่ Skia ด้วย shader ที่คอมไพล์แบบ AOT ขจัดปัญหา jank ขณะ runtime คู่มือนี้ครอบคลุมสถาปัตยกรรม การรองรับแพลตฟอร์ม benchmark ประสิทธิภาพ และคำถามสัมภาษณ์ - Published: 2026-09-18 - Updated: 2026-09-18 - Author: Anthony Fillion-Maillet - Reading time: 5 min --- Flutter Impeller เป็น rendering engine รุ่นใหม่ที่แทนที่ Skia ด้วยสถาปัตยกรรมที่ออกแบบมาเพื่อ graphics API ที่ทันสมัย ใน Flutter 3.47 Impeller ทำงานเป็นค่าเริ่มต้นบน iOS, Android (API 29+), macOS, Linux และ Windows มอบ frame rate ที่สม่ำเสมอโดยขจัดการคอมไพล์ shader ขณะ runtime > **ทำไม Impeller สำคัญในการสัมภาษณ์** > > Impeller เป็นหัวข้อที่พบบ่อยในการสัมภาษณ์ Flutter ปี 2026 ผู้สมัครควรอธิบายได้ว่าทำไม shader jank จึงเกิดขึ้น การคอมไพล์ AOT แก้ปัญหาอย่างไร และความแตกต่างของประสิทธิภาพระหว่างแพลตฟอร์ม ความสามารถในการอธิบายสถาปัตยกรรม Impeller แสดงให้เห็นความเข้าใจเชิงลึกเกี่ยวกับภายใน Flutter มากกว่าแค่ widget tree ## Impeller ขจัด Shader Jank อย่างไร Shader jank เป็นปัญหาที่รบกวนแอป Flutter ที่ใช้ Skia เมื่อ GPU พบ visual effect ใหม่ Skia จะคอมไพล์ shader ที่จำเป็นขณะ runtime กระบวนการคอมไพล์นี้บล็อก rendering ทำให้เกิด frame drop ระหว่าง animation และ transition ผู้ใช้สังเกตเห็น stutter ชัดเจนที่สุดเมื่อเปิดแอปครั้งแรกหรือเมื่อไปยังหน้าจอใหม่ Impeller ใช้วิธีการที่แตกต่าง: shader ทั้งหมดถูกคอมไพล์ล่วงหน้า (ahead-of-time) ระหว่างกระบวนการ build pipeline การคอมไพล์แปลง source GLSL 4.60 เป็น SPIRV จากนั้นแปลงเป็นรูปแบบเฉพาะ backend (Metal สำหรับ iOS/macOS, Vulkan หรือ OpenGL ES สำหรับ Android) เมื่อแอปรัน shader ทุกตัวมีอยู่เป็น binary blob ที่ถูก optimize แล้ว เอกสารสถาปัตยกรรม Impeller อธิบายหลักการออกแบบห้าประการ: 1. **ประสิทธิภาพที่คาดเดาได้**: การคอมไพล์ shader ทั้งหมดเกิดขึ้นแบบ offline Pipeline state objects ถูกสร้างล่วงหน้า 2. **สามารถวัดผลได้**: ทรัพยากรกราฟิกมี tag และ label สำหรับ profiling โดยไม่มีต้นทุน runtime 3. **ความสามารถในการพกพา**: Shader เขียนครั้งเดียวใน GLSL และแปลงต่อ backend 4. **การใช้ API ที่ทันสมัย**: Impeller ใช้ความสามารถของ Metal และ Vulkan อย่างเต็มที่ 5. **การทำงานพร้อมกัน**: workload single-frame กระจายไปยังหลาย thread ```dart // main.dart // ไม่ต้องเปลี่ยนโค้ดเพื่อใช้ Impeller - อัตโนมัติ // การเลือก rendering engine เกิดขึ้นที่ระดับ Flutter framework import 'package:flutter/material.dart'; void main() { // Impeller จัดการ rendering ทั้งหมดเบื้องหลัง // Frame rate คงที่ตั้งแต่ animation แรก runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { // Animation ที่ซับซ้อนที่เคยทำให้เกิด shader jank // ตอนนี้ render ได้ลื่นไหลตั้งแต่ปรากฏครั้งแรก return MaterialApp( home: AnimatedContainer( duration: const Duration(milliseconds: 300), decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.blue, Colors.purple], ), boxShadow: [ BoxShadow(blurRadius: 20, spreadRadius: 5), ], ), child: const Center(child: Text('No jank')), ), ); } } ``` การ precompile shader ขจัดการหยุดชะงักที่ไม่สามารถคาดเดาได้ซึ่งทำให้แอป Flutter รู้สึกไม่ลื่นไหลเท่าแอป native ## การรองรับแพลตฟอร์มและพฤติกรรมเริ่มต้นใน Flutter 3.47 การเปิดตัว Impeller เกิดขึ้นทีละแพลตฟอร์ม สถานะปัจจุบันใน Flutter 3.47: | แพลตฟอร์ม | สถานะ Impeller | Fallback พร้อมใช้ | |----------|-----------------|-------------------| | iOS | เริ่มต้นและเป็นตัวเลือกเดียว | ไม่ (Skia ถูกลบ) | | Android API 29+ | เริ่มต้น | ใช่ (OpenGL) | | Android API < 29 | Fallback OpenGL | N/A | | macOS | เริ่มต้น | ใช่ | | Windows | เริ่มต้น | ใช่ | | Linux | เริ่มต้น | ใช่ | | Web | Skia (วางแผนใช้ Impeller) | N/A | บน iOS Impeller กลายเป็น renderer เพียงหนึ่งเดียวตั้งแต่ Flutter 3.16 ไม่มี fallback Skia ทีม Flutter ลบการรองรับ Skia สำหรับ iOS ทั้งหมดเพราะ Impeller มีความเสถียรแล้วและการดูแลสอง rendering backend เพิ่มความซับซ้อนโดยไม่มีประโยชน์ Android มีความหลากหลายมากขึ้นเนื่องจากความแตกต่างของอุปกรณ์ อุปกรณ์ที่รัน API 29 (Android 10) ขึ้นไปใช้ Impeller เป็นค่าเริ่มต้นกับ Vulkan อุปกรณ์รุ่นเก่า fallback ไปที่ OpenGL ผ่าน Skia legacy ## Benchmark ประสิทธิภาพ: ตัวเลขจริง Benchmark จากปี 2026 แสดงการปรับปรุงที่วัดได้ในตัวชี้วัดสำคัญ: **Rasterization frame**: Impeller ลดเวลา rasterization frame เฉลี่ยประมาณ 50% ใน scene ที่ซับซ้อน การปรับปรุงนี้มาจากการขจัดการคอมไพล์ shader runtime และการใช้ประโยชน์จาก API GPU ที่ทันสมัยได้ดีขึ้น **ความสม่ำเสมอ 120fps**: หน้าจอ high-refresh-rate ได้ประโยชน์อย่างมาก แอปรักษา 120fps คงที่บนอุปกรณ์ flagship ในขณะที่ build ที่ใช้ Skia มักจะ drop frame ระหว่าง animation เริ่มต้น **เวลาเริ่มต้น**: แอป Flutter ที่มี Impeller มี cold start เฉลี่ยประมาณ 250ms engine ข้าม shader compiler initialization ทั้งหมด **การใช้หน่วยความจำ**: Impeller ใช้หน่วยความจำน้อยกว่า Skia ประมาณ 100MB ในขณะที่รักษาประสิทธิภาพที่สูงขึ้น Benchmark แสดง delta หน่วยความจำประมาณ 25MB บน iOS และ 14MB บน Android ตัวเลขเหล่านี้แตกต่างกันตามอุปกรณ์และความซับซ้อนของ scene หน้าจอที่มี animation หนักพร้อม gradient, shadow และ blur effect แสดงการปรับปรุงมากที่สุดเพราะ effect เหล่านั้นต้องการการคอมไพล์ shader runtime มากที่สุดภายใต้ Skia > **การ profiling ประสิทธิภาพ Impeller** > > Flutter DevTools มี tracing เฉพาะสำหรับ Impeller Performance overlay แสดงเวลา rasterization และสามารถ export trace สำหรับการวิเคราะห์โดยละเอียด เครื่องมือ GPU frame capture เช่น Xcode Instruments (iOS/macOS) และ RenderDoc (Android/Windows/Linux) ทำงานกับทรัพยากรที่มี label ของ Impeller ## การปิด Impeller สำหรับ Debug บางครั้งการ debug ต้องเปรียบเทียบพฤติกรรมระหว่าง Impeller และ Skia Flutter CLI มี flag สำหรับสิ่งนี้: ```bash # รันด้วย Skia แทน Impeller (Android/macOS/Windows/Linux) flutter run --no-enable-impeller ``` สำหรับ production build ที่ต้องปิด Impeller แต่ละแพลตฟอร์มมีการตั้งค่าเฉพาะ: ```xml ``` ```xml FLTEnableImpeller ``` ```cpp // windows/runner/main.cpp // ปิด Impeller ใน production Windows builds project.set_impeller_switch(flutter::ImpellerSwitch::Disabled); ``` การปิด Impeller ควรเป็นการชั่วคราว หาก Impeller ทำให้เกิดปัญหา rendering ให้รายงาน bug ด้วย prefix `[Impeller]` บน GitHub repository ของ Flutter ให้ใส่ข้อมูลอุปกรณ์ screenshot และ performance trace ## สถาปัตยกรรม Impeller สำหรับการสัมภาษณ์เทคนิค ผู้สัมภาษณ์ที่ทดสอบความรู้ Flutter ในปี 2026 มักถามเกี่ยวกับภายในของ Impeller สถาปัตยกรรมประกอบด้วยองค์ประกอบหลักหลายส่วน: **Compiler subsystem**: แปลง shader GLSL 4.60 ผ่าน pipeline หลายขั้นตอน GLSL กลายเป็น SPIRV จากนั้นแปลงเป็น Metal Shading Language หรือ SPIR-V สำหรับ Vulkan Compiler สร้าง C++ translation units พร้อมคำจำกัดความ struct ขจัด reflection ขณะ runtime **Renderer layer**: ให้ abstraction ที่ไม่ขึ้นกับ backend สำหรับ memory allocation, pipeline state และ command encoding Renderer เปิดเผย API เดียวกันไม่ว่า Metal, Vulkan หรือ OpenGL จะทำงานอยู่เบื้องล่าง **Entity system**: จัดการ 2D rendering ด้วยการ optimize pass Scene ที่ซับซ้อนถูกแบ่งเป็น render pass ที่ GPU สามารถ execute ได้อย่างมีประสิทธิภาพ **Display List integration**: เชื่อมต่อ widget layer ของ Flutter กับ Impeller ผ่าน interface `DisplayListDispatcher` นี่คือที่ที่การเรียก Flutter framework ถูกแปลเป็น rendering commands ```dart // ตัวอย่าง CustomPainter แสดงการดำเนินการ rendering // Impeller จัดการการดำเนินการเหล่านี้ด้วย shader ที่ precompile แล้ว class GradientPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { // Gradient shader - precompile แล้ว ไม่มีการคอมไพล์ runtime final paint = Paint() ..shader = const LinearGradient( colors: [Color(0xFF1E88E5), Color(0xFF7C4DFF)], ).createShader(Rect.fromLTWH(0, 0, size.width, size.height)); // Blur effect - ก็ precompile แล้วเช่นกัน final blurPaint = Paint() ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 10); // การดำเนินการ path ทำงานกับ pipeline state ที่ build ไว้แล้ว final path = Path() ..addRRect(RRect.fromRectAndRadius( Rect.fromLTWH(20, 20, size.width - 40, size.height - 40), const Radius.circular(16), )); canvas.drawPath(path, blurPaint); canvas.drawPath(path, paint); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false; } ``` คำตอบสัมภาษณ์ที่ดีอธิบาย compilation pipeline ว่าทำไมการคอมไพล์ AOT จึงสำคัญสำหรับ frame consistency และสถาปัตยกรรมแตกต่างจากวิธี JIT ของ Skia อย่างไร ## คำถามสัมภาษณ์ทั่วไปเกี่ยวกับ Impeller คำถามเหล่านี้ปรากฏเป็นประจำในการสัมภาษณ์เทคนิค Flutter แต่ละคำถามทดสอบความเข้าใจพื้นฐานของ rendering **Q: ทำไม Flutter ถึงต้องการ rendering engine ใหม่?** Skia คอมไพล์ shader ขณะ runtime เมื่อ visual effect ใหม่ปรากฏขึ้น GPU หยุดในขณะที่คอมไพล์ shader ที่จำเป็น สิ่งนี้ทำให้เกิด frame drop ที่ไม่สามารถคาดเดาได้ โดยเฉพาะในสถานการณ์ first-run ผู้ใช้รู้สึกว่าแอป Flutter กระตุกเมื่อเทียบกับแอป native ที่การคอมไพล์ shader เกิดขึ้นระหว่างการติดตั้งแอป **Q: Shader jank คืออะไรและ Impeller แก้ไขอย่างไร?** Shader jank คือการ stutter ที่มองเห็นได้เมื่อ GPU หยุดเพื่อคอมไพล์ shader Impeller แก้ไขโดยคอมไพล์ shader ทั้งหมดล่วงหน้าระหว่างกระบวนการ build แอป เมื่อ runtime shader ทุกตัวมีอยู่เป็น binary code ที่ precompile แล้ว GPU ไม่เคยต้องรอการคอมไพล์ **Q: Impeller เป็นค่าเริ่มต้นบนแพลตฟอร์มไหนบ้าง?** ใน Flutter 3.47: iOS (เพียงอย่างเดียว ไม่มี Skia), Android API 29+ (กับ Vulkan), macOS, Windows และ Linux Web ยังใช้ Skia **Q: สามารถปิด Impeller ได้ไหม? เมื่อไหร่ถึงจำเป็น?** ได้ ผ่าน CLI flag (`--no-enable-impeller`) หรือการตั้งค่าเฉพาะแพลตฟอร์ม การปิดอาจจำเป็นเพื่อ debug ความแตกต่างของ rendering แยก bug หรือรองรับอุปกรณ์ Android รุ่นเก่าที่ไม่มี Vulkan **Q: Impeller ใช้ graphics API อะไรบ้าง?** Metal บน iOS และ macOS, Vulkan บน Android (API 29+) และ OpenGL ES เป็น fallback บน Android รุ่นเก่า Windows และ Linux ใช้ Vulkan ถ้ามี > **เคล็ดลับเตรียมสัมภาษณ์** > > หลีกเลี่ยงการพูดว่า Impeller "ทำให้ทุกอย่างเร็วขึ้น" ผู้สัมภาษณ์ต้องการรายละเอียดเฉพาะ: shader ที่ precompile การขจัดการคอมไพล์ runtime เวลา frame worst-case ที่ต่ำลง ความสม่ำเสมอ 120fps บนหน้าจอ high-refresh ให้ตัวเลขเมื่อเป็นไปได้ ## การแก้ไขปัญหา Rendering ของ Impeller แม้ว่า Impeller จะเสถียร แต่ edge case ยังมีอยู่ ทีม Flutter กำลังแก้ไขปัญหาที่รายงานอย่างแข็งขัน **Artifact ภาพ**: การดำเนินการ path ที่ซับซ้อนบางอย่างหรือ blend mode ที่ไม่ค่อยพบอาจ render ต่างจาก Skia เปรียบเทียบพฤติกรรมด้วย `--no-enable-impeller` เพื่อยืนยันว่า Impeller เป็นสาเหตุ **ประสิทธิภาพลดลงบนอุปกรณ์เฉพาะ**: คุณภาพ driver Vulkan แตกต่างกันระหว่างอุปกรณ์ Android การใช้งาน Vulkan รุ่นเก่าบางตัวทำงานได้แย่กว่า OpenGL รายงานสิ่งเหล่านี้พร้อมรุ่นอุปกรณ์และข้อมูล GPU **Shader ที่กำหนดเอง**: หากแอปใช้ GLSL shader ที่กำหนดเองผ่าน `FragmentProgram` ตรวจสอบว่าคอมไพล์ถูกต้องภายใต้ Impeller Shader compilation pipeline แตกต่างจาก Skia เมื่อรายงาน bug ให้รวม: - รุ่นอุปกรณ์และ GPU (เช่น "Pixel 8 Pro พร้อม Tensor G3") - เวอร์ชัน Flutter (`flutter --version`) - Screenshot หรือ screen recording - Performance trace จาก DevTools ## สิ่งที่นักพัฒนา Flutter ควรรู้เกี่ยวกับ Impeller ในปี 2026 Impeller แสดงถึงการเปลี่ยนแปลงพื้นฐานในวิธีที่ Flutter render กราฟิก ประเด็นสำคัญ: - การคอมไพล์ shader เกิดขึ้นตอน build time ไม่ใช่ runtime Frame consistency ดีขึ้นอย่างมาก - iOS ใช้ Impeller เพียงอย่างเดียว Skia ไม่มีให้ใช้บนแพลตฟอร์มนั้นอีกต่อไป - Android API 29+ ใช้ Impeller เป็นค่าเริ่มต้นกับ Vulkan อุปกรณ์รุ่นเก่าใช้ OpenGL ผ่าน Skia - macOS, Windows และ Linux รัน Impeller เป็นค่าเริ่มต้นตั้งแต่ Flutter 3.47 - การใช้หน่วยความจำลดลงในขณะที่ประสิทธิภาพเพิ่มขึ้น เป็นประโยชน์สำหรับอุปกรณ์ mid-range - DevTools และ profiler GPU เฉพาะแพลตฟอร์มทำงานกับทรัพยากรที่มี label ของ Impeller - การเตรียมสัมภาษณ์ควรรวมสถาปัตยกรรม Impeller, shader compilation pipeline และพฤติกรรมเฉพาะแพลตฟอร์ม สำหรับการศึกษาเพิ่มเติม ทบทวนคู่มือประสิทธิภาพ Flutter และฝึกอธิบาย shader jank ให้คนที่ไม่คุ้นเคยกับ GPU rendering --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/th/blog/flutter/flutter-impeller-rendering-engine-performance-guide