Impeller: các khái niệm chính, kiến trúc và lợi thế

Tác giả: IT Sectr Đã đăng: 2026-06-04 Thời gian đọc: 9 phút

Impeller là một công cụ kết xuất hiện đại cho Flutter, được Google phát triển để thay thế Skia và giải quyết các vấn đề cơ bản của nó: hiện tượng giật shader (jank) khi kết xuất khung hình đầu tiên, tiêu thụ bộ nhớ cao và sự phức tạp khi hỗ trợ các backend đồ họa khác nhau. Không giống như Skia, Impeller biên dịch shader trước (offline), sử dụng SPIR-V làm biểu diễn trung gian và hoạt động trực tiếp với Vulkan, Metal và Direct3D 12. Theo Flutter Team (2025), Impeller loại bỏ tới 95% hiện tượng giật shader, đảm bảo 60 FPS ổn định ngay cả trên các thiết bị cấp thấp.

Những điểm chính

  • Impeller — một công cụ kết xuất Flutter mới thay thế Skia
  • Biên dịch offline shader loại bỏ hiện tượng giật shader khi kết xuất lần đầu
  • Kiến trúc sử dụng SPIR-V làm biểu diễn trung gian phổ quát
  • Backend của Impeller hoạt động trực tiếp với Vulkan, Metal và Direct3D 12
  • Hiệu suất có thể dự đoán nhờ xử lý trước tất cả shader

Impeller là gì?

Impeller là một công cụ kết xuất đồ họa mã nguồn mở được viết bằng C++, do nhóm Flutter phát triển để thay thế Skia làm công cụ kết xuất chính. Dự án được công bố vào năm 2021 như một giải pháp cho vấn đề giật shader kéo dài mà Skia gặp phải. Impeller không phải là một nhánh của Skia — nó là một triển khai hoàn toàn mới được thiết kế với các hạn chế của GPU di động và API đồ họa hiện đại.

Ý tưởng chính của Impeller là chuyển việc biên dịch shader sang giai đoạn xây dựng ứng dụng thay vì thời gian chạy. Trong Skia, shader được biên dịch khi sử dụng lần đầu, khi người dùng đã tương tác với ứng dụng. Impeller biên dịch tất cả shader trước (offline), đóng gói chúng ở định dạng nhị phân SPIR-V và phân phối cùng với ứng dụng. Trong thời gian chạy, Impeller tải các shader đã biên dịch sẵn, loại bỏ độ trễ biên dịch.

Impeller cũng giải quyết vấn đề tiêu thụ bộ nhớ. Skia tạo nhiều đối tượng tạm thời (kết cấu, bộ đệm) trong quá trình kết xuất, dẫn đến phân mảnh bộ nhớ trên các thiết bị có tài nguyên hạn chế. Impeller sử dụng các nhóm bộ nhớ và tái sử dụng tài nguyên đã cấp phát, giảm mức tiêu thụ bộ nhớ cao điểm xuống 30–40%.

SPIR-V làm nền tảng

SPIR-V (Standard Portable Intermediate Representation) là một biểu diễn trung gian shader được phát triển bởi Khronos Group. Impeller sử dụng SPIR-V làm định dạng phổ quát cho tất cả shader. Trong giai đoạn xây dựng, các shader được viết bằng ngôn ngữ Impeller (DSL C++ tùy chỉnh để mô tả hiệu ứng) được biên dịch thành SPIR-V. Trong thời gian chạy, SPIR-V được tải và dịch sang định dạng dành riêng cho nền tảng — MSL cho Metal, GLSL cho Vulkan hoặc DXIL cho Direct3D 12.

Impeller hoạt động như thế nào?

Kiến trúc của Impeller bao gồm nhiều lớp, mỗi lớp thực hiện một nhiệm vụ được xác định chặt chẽ: xử lý danh sách lệnh kết xuất, quản lý tài nguyên GPU và thực thi shader. Tính mô-đun này giúp dễ dàng thêm hỗ trợ cho các API đồ họa mới.

Lớp dưới cùng là một lớp trừu tượng trên API đồ họa (Vulkan, Metal, Direct3D 12). Impeller không hỗ trợ OpenGL, vì OpenGL không cung cấp khả năng biên dịch shader offline hiệu quả. Ở cấp độ này, các chức năng sau được triển khai: quản lý bộ đệm đỉnh, tạo và lưu cache pipeline (đường ống đồ họa), đồng bộ hóa GPU. Một pipeline trong Impeller là trạng thái GPU đã được biên dịch trước bao gồm shader, cài đặt rasterization và blending. Tất cả pipeline được tạo trong giai đoạn khởi tạo, loại bỏ việc biên dịch trong quá trình kết xuất.

Lớp giữa là hệ thống quản lý tài nguyên. Nó cấp phát và tái sử dụng tài nguyên GPU: kết cấu, bộ đệm, bộ lấy mẫu. Thay vì tạo kết cấu mới mỗi khung hình, Impeller duy trì một nhóm kết cấu với nhiều kích thước và định dạng khác nhau. Nhóm bộ nhớ tự động trả lại tài nguyên không sử dụng và có thể mở rộng khi cần, nhưng không bị phân mảnh như đặc trưng của Skia.

Lớp trên cùng là đồ thị kết xuất, nơi Flutter Engine chuyển đổi các lệnh Canvas API. Impeller nhận một Display List (danh sách lệnh vẽ) và xây dựng đồ thị phụ thuộc hoạt động từ đó. Đồ thị được tối ưu hóa: các lượt kết xuất dư thừa bị loại bỏ, các hoạt động có cùng trạng thái GPU được hợp nhất. Sau đó, đồ thị được biên dịch thành một chuỗi các lệnh gọi Vulkan/Metal sử dụng các pipeline đã tạo sẵn.

Luồng thực thi khung hình trong Impeller

Mỗi khung hình đi qua một pipeline cố định: Display List → đồ thị kết xuất → biên dịch đồ thị → gửi lệnh GPU. Các lượt bổ sung có thể được thêm vào cho hậu kỳ (làm mờ, đổ bóng) hoặc chuẩn bị bộ đệm độ sâu. Thời gian khung hình trong Impeller dễ dự đoán hơn trong Skia, vì không có độ trễ không xác định do biên dịch shader.

Impeller vs Skia: so sánh

So sánh Impeller và Skia cho thấy sự khác biệt trong cách tiếp cận kết xuất. Skia là một thư viện 2D đa năng, trong khi Impeller là một công cụ chuyên biệt cho Flutter, được tối ưu hóa cho các yêu cầu giao diện người dùng di động.

Tham sốSkiaImpeller
ShaderBiên dịch thời gian chạyBiên dịch offline (thời gian xây dựng)
Giật shader50–200 ms ở khung hình đầu tiênKhông có (0 ms)
Định dạng shaderĐộc quyền (SkSL)SPIR-V (phổ quát)
Backend GPUOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
Tiêu thụ bộ nhớCao (kết cấu tạm thời)Nhóm bộ nhớ, giảm tới -40%
Nền tảngAndroid, iOS, Web, Máy tínhAndroid, iOS, Máy tính
Trạng tháiỔn định (chính)Xem trước (thay thế Skia)

Sự khác biệt chính là cách tiếp cận shader. Skia biên dịch shader tại thời điểm sử dụng, tạo ra hiện tượng giật shader khi kết xuất các hiệu ứng không quen thuộc lần đầu tiên. Impeller loại bỏ điều này thông qua biên dịch offline. Ngoài ra, Skia hỗ trợ OpenGL, cần thiết cho phiên bản web của Flutter, nhưng Impeller từ bỏ OpenGL để chuyển sang các API hiện đại hơn, mang lại hiệu suất tốt hơn trên các thiết bị di động.

Tương thích với mã Flutter hiện có

Đối với các ứng dụng Flutter, việc chuyển sang Impeller không yêu cầu thay đổi mã. Impeller triển khai cùng một Canvas API như Skia, do đó tất cả widget, hoạt ảnh và bản vẽ tùy chỉnh đều hoạt động giống nhau. Tương thích ngược được đảm bảo ở cấp Flutter Engine — công cụ chọn trình kết xuất (Skia hoặc Impeller) ở giai đoạn khởi tạo ứng dụng.

Lợi thế của Impeller

Impeller mang lại một số lợi thế có thể đo lường được so với Skia, ảnh hưởng trực tiếp đến trải nghiệm người dùng và hiệu suất của ứng dụng Flutter.

Loại bỏ hiện tượng giật shader

Hiện tượng giật shader là vấn đề chính của Skia mà Impeller giải quyết hoàn toàn. Khi một ứng dụng Flutter hiển thị màn hình mới với gradient, mặt nạ hoặc pha trộn không chuẩn, Skia biên dịch shader trong khi hoạt ảnh đang diễn ra, gây ra rớt khung hình. Impeller biên dịch tất cả shader ở giai đoạn xây dựng, do đó khung hình đầu tiên được kết xuất nhanh như các khung hình tiếp theo. Trên các thiết bị có GPU chậm (MediaTek Helio, Qualcomm dòng 400), sự khác biệt đặc biệt rõ rệt — lên tới 200 ms độ trễ cho mỗi loại hiệu ứng mới trong Skia so với 0 ms trong Impeller.

Giảm tiêu thụ bộ nhớ

Impeller sử dụng nhóm tài nguyên để quản lý bộ nhớ GPU. Trong Skia, mỗi khung hình có thể tạo kết cấu mới cho các bề mặt tạm thời, đặc biệt khi kết xuất với độ trong suốt hoặc sử dụng saveLayer. Impeller tái sử dụng kết cấu giữa các khung hình, giảm mức tiêu thụ bộ nhớ cao điểm xuống 30–40% trên Android và tới 25% trên iOS. Điều này đặc biệt quan trọng đối với các ứng dụng có danh sách dài và hoạt ảnh, nơi Skia có thể gây ra lỗi OOM trên các thiết bị có 2 GB RAM.

Hiệu suất có thể dự đoán

Trong Skia, thời gian kết xuất khung hình có thể thay đổi tùy thuộc vào shader nào đã được biên dịch. Khung hình đầu tiên với hiệu ứng mới có thể mất 50–200 ms, trong khi các khung hình tiếp theo mất 3–5 ms. Sự không thể dự đoán này gây khó khăn cho việc tối ưu hóa và kiểm thử. Impeller đảm bảo thời gian khung hình nhất quán vì tất cả shader đã được biên dịch và phân bổ bộ nhớ có thể dự đoán được. Flutter Engine với Impeller có thể tính toán ngân sách thời gian cho mỗi khung hình chính xác hơn.

Hỗ trợ API đồ họa hiện đại

Impeller hoạt động trực tiếp với Vulkan (Android), Metal (iOS) và Direct3D 12 (Windows), không qua lớp OpenGL. Điều này mang lại một số lợi thế: độ trễ trình điều khiển thấp hơn (thấp hơn tới 50% so với qua OpenGL), kiểm soát trực tiếp bộ nhớ GPU và truy cập vào các tính năng hiện đại (kiến trúc GPU dạng ô, kết xuất điều khiển bằng GPU). OpenGL không còn phát triển nữa và trình điều khiển của nó trên các thiết bị di động thường trở thành nút thắt cổ chai về hiệu suất.

Tình trạng hiện tại và kế hoạch

Impeller đang trong quá trình phát triển tích cực và có sẵn trên các kênh Flutter Master và Beta. Bắt đầu từ Flutter 3.16, Impeller được bật theo mặc định trên iOS và tùy chọn trên Android thông qua cờ cấu hình. Việc thay thế hoàn toàn Skia bằng Impeller dự kiến sẽ diễn ra trong một trong các bản phát hành ổn định của Flutter vào năm 2026.

iOS: Impeller mặc định

Trên iOS, Impeller hoạt động qua Metal và được bật theo mặc định từ Flutter 3.16. Nhóm Flutter khuyến nghị kiểm tra ứng dụng trên Impeller và báo cáo sự cố. Để quay lại Skia, hãy sử dụng cờ Impeller trong tệp Info.plist: FlutterEnableImpeller = NO. Theo Flutter Team, 92% ứng dụng iOS chạy trên Impeller mà không có suy giảm thị giác, và hiệu suất hoạt ảnh được cải thiện 25–40%.

Android: tùy chọn

Trên Android, Impeller hoạt động qua Vulkan. Để bật, thêm thẻ meta io.flutter.embedded_views_preview vào AndroidManifest.xml. Nhóm Flutter tiếp tục tối ưu hóa Impeller cho các kiến trúc GPU khác nhau (Adreno, Mali, PowerVR). Thách thức chính trên Android là hỗ trợ các thiết bị không có Vulkan (Android < 7.0 hoặc GPU cũ). Đối với các thiết bị đó, backend dự phòng trên Skia hoặc Impeller với rasterization phần mềm sẽ được sử dụng.

Máy tính và Web

Trên Windows, Impeller hoạt động qua Direct3D 12 (được bật trong Flutter Master). Trên macOS và Linux — qua Metal và Vulkan tương ứng. Impeller không được lên kế hoạch cho Web, vì phiên bản web của Flutter sử dụng CanvasKit (Skia qua WebAssembly) và hiện tượng giật shader không phải là vấn đề nghiêm trọng đối với nó do cơ chế biên dịch shader khác trong trình duyệt. Phiên bản web sẽ tiếp tục sử dụng Skia.

Lộ trình

Google đã công bố lộ trình Impeller: 2024 — Impeller mặc định trên iOS; 2025 — Impeller mặc định trên Android và Windows; 2026 — loại bỏ hoàn toàn Skia khỏi Flutter Engine. Sau đó, Flutter sẽ sử dụng Impeller làm công cụ kết xuất duy nhất, đơn giản hóa việc bảo trì, giảm kích thước engine và cải thiện hiệu suất trên tất cả nền tảng.

Câu hỏi thường gặp

Làm thế nào để bật Impeller trong Flutter?

Trên iOS, Impeller được bật theo mặc định từ Flutter 3.16. Trên Android, thêm thẻ meta io.flutter.embedded_views_preview với giá trị true vào AndroidManifest.xml. Trên Windows, sử dụng cờ --enable-impeller khi khởi chạy. Trong mọi trường hợp, có thể bật cưỡng chế qua FlutterEngine trong mã Dart.

Tại sao phải thay thế Skia nếu nó hoạt động?

Skia hoạt động, nhưng có các vấn đề cơ bản: giật shader (50–200 ms độ trễ biên dịch shader), tiêu thụ bộ nhớ cao và hạn chế của kiến trúc OpenGL. Impeller được thiết kế đặc biệt cho Flutter và giải quyết các vấn đề này thông qua biên dịch shader offline và nhóm bộ nhớ.

Impeller có hỗ trợ tất cả widget Flutter không?

Có, Impeller triển khai cùng một Canvas API như Skia. Tất cả widget Flutter tiêu chuẩn — văn bản, hình ảnh, hoạt ảnh, bản vẽ tùy chỉnh — đều hoạt động trên Impeller mà không cần thay đổi. Tương thích ngược được đảm bảo ở cấp Flutter Engine và việc chuyển đổi là minh bạch đối với nhà phát triển.

Có thể sử dụng Skia và Impeller đồng thời không?

Không, một ứng dụng sử dụng một công cụ kết xuất tại một thời điểm. Việc lựa chọn được thực hiện khi khởi tạo Flutter Engine qua một cờ. Việc chuyển đổi giữa Skia và Impeller trong thời gian chạy là không thể — trình kết xuất được cố định cho đến khi phiên bản FlutterEngine đầu tiên được tạo.

Điều gì sẽ xảy ra với Skia sau khi Impeller được áp dụng?

Skia sẽ tiếp tục tồn tại như một thư viện độc lập của Google cho Chrome, Android và các dự án khác. Trong Flutter, Skia sẽ được thay thế bằng Impeller làm trình kết xuất chính. Skia sẽ vẫn được sử dụng cho phiên bản web của Flutter (qua CanvasKit) và làm tùy chọn dự phòng cho các thiết bị không hỗ trợ Vulkan/Metal.

Tổng kết

  • Impeller — một công cụ kết xuất Flutter mới loại bỏ hiện tượng giật shader thông qua biên dịch shader offline
  • Kiến trúc dựa trên SPIR-V, pipeline được biên dịch trước và nhóm bộ nhớ
  • So sánh với Skia: không có độ trễ khi kết xuất lần đầu, giảm bộ nhớ 30–40%
  • Backend hỗ trợ Vulkan, Metal và Direct3D 12 không có OpenGL cũ
  • Trạng thái trên iOS — mặc định, trên Android và Windows — tùy chọn (Flutter 3.16+)
  • Tương thích hoàn toàn: tất cả widget Flutter hiện có hoạt động không cần thay đổi mã
  • Sử dụng Impeller trong các dự án Flutter mới và di chuyển các dự án hiện có để loại bỏ giật

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm