Lựa Chọn Mô-Đun UI Trong Phát Triển Game - nói dối e blog

Lựa Chọn Mô-Đun UI Trong Phát Triển Game

Trong quá trình phát triển game (bao gồm cả engine), khi đề cập đến mô-đun UI, thường có hai khái niệm cần phân biệt rõ:

  1. UI dành cho công cụ phát triển - giao diện sử dụng trong quá trình xây dựng engine hoặc công cụ hỗ trợ nhà phát triển.
  2. UI dành cho game - giao diện trực tiếp xuất hiện trong sản phẩm game hoàn chỉnh.

Hai loại UI này thường bị trộn lẫn trong cùng một mô-đun. Ví dụ, Unity thời kỳ đầu đã tận dụng luôn hệ thống UI của công cụ phát triển để phục vụ cho việc xây dựng giao diện game. Tuy nhiên, các nhà phát triển nhanh chóng nhận ra rằng UI tối ưu cho công cụ (với yêu cầu hiển thị dữ liệu phức tạp, hỗ trợ sửa đổi tham số) lại không phù hợp với trải nghiệm người chơi. Điều này dẫn đến sự bùng nổ các plugin UI của bên thứ ba, và cuối cùng buộc Unity phải xây dựng lại hệ thống UI chuyên dụng cho game.

Sự khác biệt về yêu cầu

UI công cụ phát triển đòi hỏi:

  • Khả năng trình bày dữ liệu nội bộ một cách trực quan, cho phép người dùng quan sát và điều chỉnh thông qua giao diện.
  • Tính nhất quán về phong cách để giảm chi phí học tập.
  • Hỗ trợ biểu diễn động các thay đổi dữ liệu, giúp lập trình viên nắm bắt trạng thái hệ thống dễ dàng hơn.

UI game lại tập trung vào:

  • Tạo ra trải nghiệm cảm xúc thông qua thiết kế hình ảnh và tương tác độc đáo.
  • Chuyển đổi dữ liệu game thành các yếu tố trực quan dễ hiểu cho người chơi, thay vì phơi bày cấu trúc dữ liệu phức tạp.
  • Hỗ trợ HUD (Heads-Up Display) với yêu cầu thiết kế hoàn toàn khác biệt so với các hộp thoại thông thường.

Về mặt kỹ thuật, điểm chung giữa hai loại UI này cực kỳ hạn chế - có thể chỉ cần vài trăm đến nghìn dòng code chung, trong khi phần khác biệt chiếm phần lớn. Vì vậy, tôi luôn ủng hộ việc tách biệt hoàn toàn hai hệ thống này trong thiết kế.

Kinh nghiệm cá nhân với UI công cụ

Trong sự nghiệp phát triển game, tôi đã trải qua nhiều hệ thống UI khác nhau: từ MFC, .NET, wxWidgets, Qt cho đến IUP và gần đây nhất là Dear ImGui. Cuộc tranh luận giữa Retained ModeImmediate Mode luôn là chủ đề nóng. Cá nhân tôi nghiêng về Immediate Mode (IM) vì ưu điểm giảm thiểu lỗi thông qua mô hình stateless, như phân tích trong bài viết nổi tiếng này [link

Hành trình tìm kiếm giải pháp UI cho game

Tôi từng tự xây dựng hai hệ thống UI riêng:

  • Phiên bản đầu tiên cho game Đại Thoại Tây Du hơn một thập kỷ trước.
  • Phiên bản cải tiến khi học C++ nâng cao, dù không dùng trong dự án cá nhân nhưng đã được bạn bè ứng dụng thành công.

Tuy nhiên, sau này tôi thay đổi quan điểm, ưu tiên các giải pháp đã trưởng thành thay vì tự phát triển từ đầu. Trong dự án engine hiện tại, tôi đã xem xét nhiều lựa chọn:

  • Dear ImGui/Nuklear: Dù mạnh mẽ cho công cụ, nhưng không phù hợp với yêu cầu game.
  • CEGUI: Từng phổ biến nhưng nay ít được cập nhật, giao diện phức tạp hơn nhu cầu thực tế.
  • Giải pháp Flash/HTML-CSS: Dù có sẵn công cụ mạnh, nhưng gặp vấn đề hiệu năng khi tích hợp vào game (ví dụ: WebKit thường gây lag nếu không tối ưu kỹ).

Cảm hứng từ hệ thống UI của Paradox

Khi nghiên cứu mod game Stellaris, tôi đặc biệt ấn tượng với cách Paradox tách biệt cấu trúc và giao diện:

  • Tập tin .gui: Mô tả cấu trúc UI dưới dạng cây phân cấp các vùng hình chữ nhật, tập trung vào logic và chức năng.
  • Tập tin .gfx: Quy định cách hiển thị từng thành phần (hình tĩnh, hoạt ảnh, hiệu ứng hover chuột…).

Mô hình này tương tự sự kết hợp giữa HTML và CSS, nhưng tối giản hơn nhiều. Dù chưa tìm thấy thư viện mã nguồn mở nào áp dụng ý tưởng này, tôi đã thiết kế một phiên bản riêng dựa trên nguyên tắc của Paradox.

Giải pháp tiềm năng: RmlUI

Trong các lựa chọn hiện tại, tôi đặc biệt quan tâm RmlUI - fork cải tiến từ LibRocket:

  • Cắt bỏ các tính năng thừa, tối ưu cho việc tích hợp vào engine game.
  • Hỗ trợ HTML/CSS quen thuộc nhưng nhẹ hơn nhiều so với WebKit.
  • Cộng đồng phát triển sôi động, với commit mới nhất chỉ cách đây 1 ngày.

Thách thức với font chữ

Hầu hết thư viện UI phương Tây ít quan tâm đến hệ thống font chữ phức tạp như tiếng Trung/Hàn/Việt. Ví dụ:

  • Dear ImGui dùng texture khổng lồ chứa toàn bộ ký tự Unicode (gây lãng phí bộ nhớ).
  • Tính năng quản lý font động vẫn nằm trong danh sách “cần làm” từ nhiều năm nay.

Trong dự án hiện tại, tôi đã đầu tư thiết kế hệ thống quản lý font riêng, áp dụng kỹ thuật baking thông minh để cân bằng giữa hiệu năng và tính linh hoạt. Chi tiết sẽ được chia sẻ trong bài viết sắp tới.

Kết luận

0%