Chuyển đến nội dung chính

Bài đăng

Hiển thị các bài đăng có nhãn Rendering

Impeller thành renderer desktop mặc định — thực sự đổi gì

Impeller mặc định trên mobile đã có từ trước. Flutter 3.47 hoàn tất trên macOS, Windows và Linux . App desktop giờ nhắm Metal (macOS) và Vulkan (Windows/Linux) với tập shader cố định, compile lúc build engine. Bạn được gì Hết jank compile shader khi animation chạy lần đầu. Chữ SDF — glyph sắc hơn trên màn desktop mật độ pixel thấp hơn. Wide Gamut Color mặc định trên macOS khi phần cứng hỗ trợ. Opt-out Skia tạm thời Nền tảng Cách tắt macOS FLTEnableImpeller=false trong Info.plist Windows project.set_impeller_switch(flutter::ImpellerSwitch::Disabled) trong main.cpp Linux fl_dart_project_set_enable_impeller(project, FALSE) trong my_application.cc Hãy file bug. Fallback sẽ bị gỡ. Nên test lại FragmentShader tùy chỉnh và effect nặng saveLayer . Platform view / external texture. Luồng print/export từng giả định color management của Skia. Chạy profile mode trước. Frame vẫn dài thì vẫn là UI vs raster — Impeller chỉ lấy việc ở nhánh compile shader ,...

Impeller is now the default desktop renderer — what actually changes

Mobile Impeller defaults landed earlier. Flutter 3.47 finishes the job on macOS, Windows, and Linux . Desktop apps now target Metal (macOS) and Vulkan (Windows/Linux) with a fixed shader set compiled at engine-build time. What you gain No shader-compilation jank on first run of an animation. Signed Distance Function text — sharper glyphs on lower-density desktop displays. Wide Gamut Color on by default on macOS where hardware supports it. Temporary Skia opt-outs If a regression blocks you: Platform Opt-out macOS FLTEnableImpeller=false in Info.plist Windows project.set_impeller_switch(flutter::ImpellerSwitch::Disabled) in main.cpp Linux fl_dart_project_set_enable_impeller(project, FALSE) in my_application.cc File a bug. Fallbacks are scheduled for removal. What to retest Custom FragmentShader s and saveLayer -heavy effects. Platform views and external textures. Print/export paths that assumed Skia color management. Profile mode first. If a f...

Ngân sách 16.6 ms cho mỗi frame Flutter — thay cho câu "để sau tối ưu"

“Để sau tối ưu” là kế hoạch chọn đúng phiên bản khó nhất của công việc. “Sau” nghĩa là list view đã có sáu tầng builder lồng nhau, URL ảnh đã đến từ ba service khác nhau, và không ai còn nhớ trong mười hai widget trên màn hình thì cái nào đang repaint. Bạn kết thúc bằng việc chia đôi timeline để dò, thay vì viết code. Cách khác không cần anh hùng. Nó là một ngân sách. Một frame có một lượng thời gian cố định, thời gian đó chia cho hai thread, và mọi widget bạn viết đều tiêu một phần. Nếu bạn biết con số và biết các khoản mục, bạn có thể quyết định ngay lúc viết code là mình có đủ tiền hay không — giống hệt cách bạn quyết định một lời gọi network có được nằm trên đường đi chính hay không. Đây là ngân sách tôi tự bắt mình tuân theo, sáu khoản mục chiếm gần hết nó, và cách đo từng khoản. Việc đo quan trọng hơn các quy tắc: một quy tắc bạn không kiểm chứng được là mê tín, và Flutter đã đủ nhiều truyền thuyết về performance rồi. Ngân sách là 16.6 ms, và nó chia làm hai Màn hình 60 Hz đò...

Khi ghép widget không còn đủ: tự viết RenderObject

Bạn hẳn từng gặp tình huống này. Thiết kế là một feed masonry hai cột: các card cao thấp khác nhau, mỗi card mới rơi vào cột nào đang ngắn nhất, thỉnh thoảng chen một banner chiếm trọn chiều ngang. Bạn thử Wrap — mỗi hàng lấy chiều cao của child cao nhất, thế là hở khoảng trắng. Bạn thử hai Column trong một Row rồi tự chia danh sách — nhưng không thể chia đúng nếu chưa biết mỗi card render ra cao bao nhiêu, mà điều đó chỉ biết được sau khi layout. Bạn thử Stack với Positioned , và bây giờ bạn cần chiều cao của từng card dưới dạng con số, ngay trong build, trước khi có gì được đo. Cái bẫy nằm ở chỗ tất cả đều là câu trả lời kiểu ghép widget cho một bài toán đo đạc . Row, Column, Stack, Wrap bản thân chúng là các render object với thuật toán layout cố định. Lồng chúng vào nhau không tạo ra thuật toán mới; nó chỉ tạo ra một cây cao hơn chạy đúng ba thuật toán cũ. Khi hình dạng bạn cần thực sự là một thuật toán khác — một quyết định đặt vị trí phụ thuộc vào kích thước đã đo của các s...