TopGit
Đánh giá repo GitHub

egui: thư viện GUI immediate mode cho Rust

emilk/egui
ETopGit review image for emilk/egui
Review by Topgit.dev for emilk/egui, with GitHub repository stats and README context.
Nhận định nhanh

egui là lựa chọn hợp lý khi cần gắn nhanh một GUI vào dự án Rust mà không phải vật lộn với cây widget kiểu retained-mode. Đổi lại giao diện đẹp kiểu native, egui cho code không cần callback: xử lý click và state của app nằm chung trong một hàm, không rải rác qua nhiều nơi đăng ký handler. Đó là toàn bộ giá trị, không phải nhiều tính năng hơn. Điểm trừ là API chưa ổn định, nâng cấp version có thể phải viết lại vài lời gọi UI.

Sao
★ 31.4k
Fork
⑂ 2.2k
Người đóng góp
👥 593
Ngôn ngữ
Rust
Giấy phép
Apache-2.0
Chủ đề
Backend
Cập nhật
Oct 2026
Trang chủ
GitHub

egui là gì?

egui là một thư viện Rust để dựng giao diện đồ họa tương tác kiểu immediate mode: mỗi widget được vẽ lại và kiểm tra từ đầu ở mỗi frame, thay vì sống trong một cây widget tồn tại lâu dài kèm handler gắn sẵn. egui chạy trên web qua WebAssembly, chạy native trên desktop qua eframe, và nhúng được vào bất kỳ renderer nào vẽ được tam giác có texture. Bạn gọi egui vào từ chính render loop của mình, không phải ngược lại.

egui cung cấp những gì

  • ✓Bộ widget khá đủ: label, button, checkbox, radio button, slider, giá trị kéo-thả (draggable value), color picker, spinner, cùng trình soạn thảo text hỗ trợ copy/paste, undo và emoji.
  • ✓Các helper layout cho bố cục ngang, dọc, chia cột, tự động xuống dòng, cộng thêm panel, collapsing header và vùng scroll.
  • ✓Window di chuyển, resize được, tự tính kích thước và tự định vị.
  • ✓Render anti-aliased cho line, circle, text và convex polygon qua lớp đồ họa 2D riêng có tên epaint.
  • ✓Hỗ trợ accessibility tuỳ chọn qua AccessKit, có screen reader native trên Windows và macOS.
  • ✓Hiển thị ảnh có sẵn, việc load ảnh được đẩy sang crate egui_extras để core egui giữ được ít phụ thuộc.
  • ✓Cùng một đoạn code UI chạy được cả trên bản native lẫn trên web qua WebAssembly, không cần viết lại.
Số sao GitHub của repo này thay đổi thế nào theo thời gian. Nguồn: star-history.com.Xem lịch sử sao ↗

Thêm egui vào dự án Rust

README không đưa ra một dòng lệnh cargo add egui duy nhất; thay vào đó chỉ ra hai hướng bắt đầu. Nếu làm app desktop hoặc web, clone github.com/emilk/eframe_template rồi làm theo hướng dẫn trong đó, nó đã cấu hình sẵn eframe, framework chính thức, cho bạn. Nếu muốn dùng egui trần, nhúng vào engine hoặc renderer riêng, docs chính thức tại docs.rs/egui hướng dẫn cách tích hợp trực tiếp. Repo cũng có ví dụ mẫu trong thư mục examples/. Chạy demo app trên Linux cần cài thêm gói hệ thống trước, libclang-dev, libgtk-3-dev và một loạt gói dev libxcb/libxkbcommon/openssl, nhưng đây là yêu cầu riêng của demo app, không phải của egui; README nói rõ bản thân egui không phụ thuộc platform.

Viết UI egui đầu tiên

Một UI egui tối thiểu đọc như code Rust bình thường: không markup riêng, không XML, không phải tạo sẵn object builder rồi nối vào callback: ```rust ui.heading("My egui Application"); ui.horizontal(|ui| { ui.label("Your name: "); ui.text_edit_singleline(&mut name); }); ui.add(egui::Slider::new(&mut age, 0..=120).text("age")); if ui.button("Increment").clicked() { age += 1; } ui.label(format!("Hello '{name}', age {age}")); ui.image(egui::include_image!("ferris.png")); ``` Mỗi dòng ở trên chạy lại ở frame tiếp theo; đó chính là ý nghĩa của "immediate mode". Không gì tồn tại giữa các frame. Pattern `if ui.button(...).clicked()` thay thế cho một handler on-click: bạn kiểm tra giá trị trả về ngay tại chỗ button được vẽ, nên state của app (`name`, `age`) và state của UI không bao giờ lệch nhau.

Điểm mạnh

  • ✓Không cần nối handler: xử lý click nằm ngay cạnh widget kích hoạt nó, giúp UI nhỏ dễ đọc.
  • ✓README nói egui không có mã unsafe và phụ thuộc được giữ tối thiểu theo chủ đích, phần nặng hơn được đẩy sang crate tuỳ chọn như egui_extras.
  • ✓Cùng một đoạn code UI biên dịch được cả sang web (WASM) lẫn native, đúng với mục tiêu portable của dự án.
  • ✓ID widget cho tương tác được sinh tự động, nên hai button trùng label vẫn không đụng nhau, một điểm README nói Dear ImGui vẫn gặp phải.
  • ✓Đã được dùng để làm công cụ có cảm giác production thật: README dẫn Rerun Viewer làm ví dụ một app egui trông chuyên nghiệp.

Những gì egui không làm

  • △Layout vẫn là điểm đau kinh điển của immediate mode: phải biết kích thước window trước khi layout nội dung bên trong là một nghịch lý thật sự, và cách egui khắc phục, nhớ lại kích thước từ frame trước, gây ra hiện tượng nhấp nháy ở frame đầu tiên khi window hoặc grid xuất hiện.
  • △README nói rõ interface của egui vẫn đang thay đổi và các bản release mới sẽ có breaking change, nên việc ghim version là điều quan trọng.
  • △Giao diện giống native là một non-goal được nêu rõ; egui không cố khớp style widget của OS, nên app luôn trông như "một app egui" chứ không hoà vào giao diện Windows, macOS hay GNOME.
  • △Khả năng styling còn hạn chế hơn các hệ UI dựa trên CSS hiện nay; chính README thừa nhận theming qua `Context::set_style` chưa mạnh bằng và liệt nó như một issue đang mở.
  • △Vùng scroll lớn bị layout lại ở mỗi frame, nên một danh sách scrollback rất dài có thể ăn CPU rõ rệt nếu bạn không giới hạn phần render ngoài khung nhìn.

Các thư viện GUI Rust khác đáng cân nhắc

imgui (Dear ImGui, C++ có binding Rust) — thư viện immediate mode mà chính README của egui nhắc tới như nguồn cảm hứng; trưởng thành hơn và phổ biến hơn trong tooling game, nhưng ID widget dựa trên string nên dễ đụng nhau, vấn đề mà egui thiết kế để tránh.Tauri — thay vì vẽ widget kiểu native bằng Rust, bạn dựng giao diện bằng HTML/CSS/JS rồi gọi vào backend Rust qua webview hệ thống; hợp nếu bạn muốn UI desktop chỉn chu, giống native, và không ngại dùng frontend web. ↗iced — crate GUI Rust theo kiến trúc Elm, tách rõ view và update logic thay vì render theo từng frame như egui; đáng cân nhắc nếu bạn muốn mô hình hoá UI thành các state transition tường minh.

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

egui có render được lên web bằng WASM không?

egui biên dịch sang WebAssembly và chạy được trên mọi trình duyệt hỗ trợ WASM và WebGL; chính demo web tại egui.rs được dựng theo cách này. Bản thân crate egui được thiết kế thân thiện với Wasm, còn eframe lo phần tích hợp trình duyệt, input và render lên canvas, giúp bạn.

Khác nhau giữa egui và eframe là gì?

egui là thư viện UI 2D: lo phần layout và xử lý button, slider cùng các widget khác, nhưng không biết mình đang chạy trên web hay native, cũng không tự thu input hay vẽ lên màn hình. eframe là framework chính thức bù đắp phần còn thiếu đó, nối input và rendering cho cả web lẫn native.

egui xử lý async như thế nào?

egui không tự xử lý async; README cảnh báo gọi `.await` trực tiếp trong code UI sẽ làm giao diện đứng hình, vì một frame cần vẽ xong mà không được block. Thay vào đó bạn giữ UI thread không bị block và lấy kết quả về qua channel, `Arc<Mutex<T>>`, hoặc crate như `poll_promise` hay `tokio::sync::watch`.

egui có dùng được với game engine Bevy không?

egui tích hợp với Bevy qua crate bevy_egui, được chính dự án egui nêu tên trực tiếp như cách phổ biến để chạy egui bên trong một game engine như Bevy. Bản thân egui không biết mình đang chạy trong Bevy; bevy_egui lo việc đưa input vào và vẽ output ra bằng renderer của Bevy, thay vì đi qua eframe.

egui có hỗ trợ ký tự non-Latin và font tuỳ chỉnh không?

egui hỗ trợ ký tự non-Latin, nhưng README nói rõ bạn cần cài font riêng, file .ttf hoặc .otf, qua `Context::set_fonts`, vì font mặc định không phủ hết mọi hệ chữ viết. Màu sắc, khoảng cách, kích thước và font cũng chỉnh được toàn cục qua `Context::set_style`.

egui chạy được trên những platform nào?

egui chạy native trên Linux, Mac và Windows, chạy trên trình duyệt qua WebAssembly, và, thông qua eframe, framework chính thức, chạy được cả trên Android. Bản thân crate egui không biết nó đang ở platform nào; việc đó do integration nào đang render nó quyết định, như eframe, egui_glow, hoặc egui-wgpu.

Vấn đề mà egui giải quyết

Phần lớn crate GUI của Rust bắt bạn chọn phe từ sớm: bind vào một toolkit native nặng và tự lo mấy vấn đề đóng gói riêng theo từng platform, hoặc dùng một framework đầy đủ với vòng đời app riêng, ép code phải tổ chức theo cách của nó. Không cách nào trong hai cách đó cho bạn vẽ UI ngay bên trong một render loop có sẵn, ví dụ như hàm update mỗi frame của một game engine, mà không cần thêm lớp glue. egui lấp đúng khoảng trống hẹp đó: một thư viện widget bạn gọi trực tiếp từ bất kỳ chỗ nào bạn đang vẽ, dù đó là một renderer wgpu trần hay một hook mỗi frame của game engine.

Trường hợp sử dụng tốt nhất

  • •Overlay debug/inspector cho game hoặc simulation, vẽ trực tiếp từ code Rust ở mỗi frame.
  • •Công cụ desktop nhỏ, dùng nội bộ hoặc cá nhân, nơi ra sản phẩm nhanh quan trọng hơn giao diện giống native.
  • •Tooling trong game engine, level editor, panel chỉnh tham số, debug HUD, gắn qua bevy_egui hoặc một tích hợp tự viết.
  • •Web app thuần Rust biên dịch sang WASM, cần control tương tác mà không đụng tới JavaScript.

Ai nên dùng — và ai nên bỏ qua

Nên thử egui nếu bạn là dev Rust cần một debug panel, màn hình config, hay UI công cụ nhẹ phải ra được trong tuần này thay vì phải khớp style OS. Nó hợp với dự án solo hay team nhỏ, dev game gắn tooling ngay trong engine, và bất kỳ ai thích viết `if ui.button(...).clicked()` hơn là quản lý object handler. Bỏ qua nếu bạn không viết Rust, cần UI không thể phân biệt với giao diện native của OS, hoặc không chịu được breaking change giữa các bản release; README nói rõ interface vẫn đang thay đổi.

Repo liên quan

Nguồn & ghi công

Thông tin và trích dẫn lấy từ repository GitHub emilk/egui và README của repo này (github.com/emilk/egui).

Dữ liệu GitHub · đồng bộ lần cuối 15 thg 8, 2026Đánh giá bởi Henry
← Về TopGit

egui có đáng để bạn bỏ thời gian?

ChatGPT, Claude và Perplexity đều đọc được trang này. Hỏi thử xem họ nghĩ gì về egui.

GitHub