Tôi đã làm việc về phát triển ứng dụng với rất nhiều hệ thống GUI "được giữ lại" (bên dưới là những gì tôi muốn nói) như MFC, QT, Forms, SWING và một số khung GUI web cách đây vài năm. Tôi luôn thấy các khái niệm của hầu hết các hệ thống GUI quá phức tạp và vụng về. Số lượng sự kiện gọi lại, người nghe, bản sao dữ liệu, thứ gì đó để xâu chuỗi thành thứ gì đó - chuyển đổi (v.v.) luôn là nguồn gốc của những sai lầm và đau đầu so với các phần khác trong ứng dụng. (Ngay cả với việc sử dụng "đúng" các ràng buộc / mô hình dữ liệu).
Bây giờ tôi đang viết trò chơi máy tính :). Tôi đã làm việc với một GUI cho đến nay: Miyagi (không nổi tiếng, nhưng về cơ bản là cùng một ý tưởng với tất cả các hệ thống khác.)
Thật là kinh khủng.
Đối với các môi trường kết xuất thời gian thực như Trò chơi, tôi có cảm giác rằng các hệ thống GUI "được giữ lại" thậm chí còn lỗi thời hơn. Giao diện người dùng thường không cần phải được bố trí tự động hoặc có cửa sổ thay đổi kích thước nhanh chóng. Thay vào đó, họ cần tương tác rất hiệu quả với dữ liệu luôn thay đổi (như vị trí 3d của các mô hình trên thế giới)
Cách đây vài năm, tôi tình cờ phát hiện ra "IMGUI" về cơ bản giống như chế độ Đồ họa tức thời, nhưng dành cho giao diện người dùng. Tôi đã không chú ý quá nhiều, vì tôi vẫn đang trong quá trình phát triển ứng dụng và bản thân cảnh quay IMGUI dường như không thực sự rộng cũng không thành công. Tuy nhiên, cách tiếp cận mà họ đưa ra dường như vô cùng gợi cảm và thanh lịch, đến nỗi nó khiến tôi muốn viết một cái gì đó cho dự án tiếp theo bằng cách sử dụng giao diện người dùng này (tôi đã thất bại trong việc thuyết phục bất cứ ai tại nơi làm việc: (...)
hãy để tôi tóm tắt những gì tôi có nghĩa là "giữ lại" và "ngay lập tức":
GUI được giữ lại: Trong giai đoạn khởi tạo riêng biệt, bạn tạo "điều khiển GUI" như Nhãn, Nút, TextBoxes, v.v. và sử dụng một số cách mô tả (hoặc lập trình) để đặt chúng trên màn hình - tất cả trước khi mọi thứ được hiển thị. Các điều khiển giữ hầu hết trạng thái của chúng trong bộ nhớ như vị trí X, Y, kích thước, đường viền, điều khiển con, văn bản nhãn, hình ảnh, v.v. Bạn có thể thêm các cuộc gọi lại và người nghe để được thông báo về các sự kiện và cập nhật dữ liệu trong điều khiển GUI.
GUI ngay lập tức: Thư viện GUI bao gồm các chức năng "RenderButton", "RenderLabel", "RenderTextBox" ... (chỉnh sửa: không bị nhầm lẫn bởi Rendertiếp đầu ngữ. Các chức năng này cũng thực hiện logic đằng sau các điều khiển như bỏ phiếu nhập của người dùng, chèn ký tự, xử lý tốc độ lặp lại ký tự khi người dùng giữ phím và vv ... mà bạn có thể gọi để "ngay lập tức" hiển thị điều khiển (không ' Phải được ghi ngay lập tức vào GPU. Thông thường, nó được ghi nhớ cho khung hiện tại và được sắp xếp thành các lô thích hợp sau này). Thư viện không giữ bất kỳ "trạng thái" nào cho những thứ này. Nếu bạn muốn ẩn một nút ... chỉ cần đừng gọi chức năng RenderButton. Tất cả các hàm RenderXXX có tương tác người dùng như nút hoặc hộp kiểm có giá trị trả về cho biết liệu người dùng có nhấp vào nút hay không. Vì vậy, "RenderGUI" của bạn Hàm trông giống như một hàm if / khác lớn trong đó bạn gọi hoặc không gọi các hàm RenderXXX tùy thuộc vào trạng thái trò chơi của bạn và tất cả logic cập nhật dữ liệu (khi nhấn nút) được xen kẽ vào luồng. Tất cả lưu trữ dữ liệu là "bên ngoài" gui và chuyển theo yêu cầu cho các chức năng Kết xuất. (Tất nhiên, bạn sẽ chia các hàm lớn thành nhiều hàm hoặc sử dụng một số tóm tắt lớp để nhóm các phần của gui. Chúng ta không viết mã như năm 1980 nữa, phải không?))
Bây giờ tôi thấy rằng Unity3D thực sự sử dụng cách tiếp cận cơ bản rất giống với các hệ thống GUI tích hợp của họ. Có lẽ có một vài GUI với cách tiếp cận này ngoài kia?
Tuy nhiên, khi nhìn xung quanh, dường như có sự thiên vị mạnh mẽ đối với các hệ thống GUI được giữ lại? Ít nhất tôi đã không tìm thấy cách tiếp cận này ngoại trừ trong Unity3D và cộng đồng IMGUI ban đầu dường như khá .... yên tĩnh.
Vì vậy, bất cứ ai làm việc với cả hai ý tưởng và có một số ý kiến mạnh mẽ?
Chỉnh sửa: Tôi quan tâm nhất đến các ý kiến xuất phát từ kinh nghiệm thực tế. Tôi nghĩ rằng có rất nhiều cuộc thảo luận sôi nổi trên diễn đàn IMGUI về bất kỳ "điểm yếu lý thuyết" nào của phương pháp GUI ngay lập tức, nhưng tôi luôn thấy rõ hơn khi biết về những điểm yếu trong thế giới thực .