Saya telah bekerja pada pengembangan aplikasi dengan banyak sistem GUI "yang dipertahankan" (di bawah ini lebih lanjut tentang apa yang saya maksud dengan itu) seperti MFC, QT, Forms, SWING, dan beberapa kerangka kerja web-GUI beberapa tahun yang lalu. Saya selalu menemukan konsep kebanyakan sistem GUI terlalu rumit dan canggung. Jumlah peristiwa panggilan balik, pendengar, salinan data, sesuatu untuk dirangkai dengan sesuatu - konversi (dan sebagainya) selalu menjadi sumber kesalahan dan sakit kepala dibandingkan dengan bagian lain dalam aplikasi. (Bahkan dengan penggunaan "Binding / Model Data" yang tepat).
Sekarang saya sedang menulis game komputer :). Saya bekerja dengan satu GUI sejauh ini: Miyagi (tidak terkenal, tetapi pada dasarnya Ide yang sama dengan semua sistem lainnya.)
Itu mengerikan.
Untuk lingkungan render waktu nyata seperti Game, saya merasa bahwa sistem GUI "yang dipertahankan" bahkan lebih usang. Antarmuka pengguna biasanya tidak perlu ditata secara otomatis atau memiliki jendela resizable on-the-fly. Sebaliknya, mereka perlu berinteraksi sangat efisien dengan data yang selalu berubah (seperti posisi 3d model di dunia)
Beberapa tahun yang lalu, saya menemukan "IMGUI" yang pada dasarnya seperti mode Grafis Langsung, tetapi untuk antarmuka pengguna. Saya tidak memberi terlalu banyak perhatian, karena saya masih dalam pengembangan aplikasi dan adegan IMGUI itu sendiri tampaknya tidak terlalu luas atau tidak berhasil. Namun pendekatan yang mereka ambil tampaknya sangat seksi dan elegan, sehingga saya ingin menulis sesuatu untuk proyek selanjutnya menggunakan UI seperti ini (saya gagal meyakinkan siapa pun di tempat kerja: (...)
izinkan saya meringkas apa yang saya maksud dengan "dipertahankan" dan "segera":
Retensi GUI: Dalam fase inisialisasi terpisah, Anda membuat "kontrol GUI" seperti Label, Tombol, Kotak Teks dll. Dan menggunakan beberapa cara deskriptif (atau terprogram) untuk menempatkannya di layar - semua sebelum apa pun diberikan. Kontrol menahan sebagian besar statusnya dalam memori seperti X, lokasi Y, ukuran, batas, kontrol anak, teks label, gambar, dan sebagainya. Anda dapat menambahkan panggilan balik dan pendengar untuk mendapat informasi tentang acara dan memperbarui data dalam kontrol GUI.
GUI Langsung: Pustaka GUI terdiri dari satu-fungsi "RenderButton", "RenderLabel", "RenderTextBox" ... fungsi (sunting: jangan bingung dengan Renderawalan. Fungsi-fungsi ini juga melakukan logika di balik kontrol seperti polling input pengguna, memasukkan karakter, menangani karakter-repeat-speed ketika pengguna menekan tombol dan sebagainya ...) yang dapat Anda panggil untuk "segera" membuat kontrol (tidak "Harus segera ditulis ke GPU. Biasanya diingat untuk frame saat ini dan diurutkan ke dalam batch yang sesuai nanti). Perpustakaan tidak memiliki "keadaan" untuk ini. Jika Anda ingin menyembunyikan tombol ... jangan panggil fungsi RenderButton. Semua fungsi RenderXXX yang memiliki interaksi pengguna seperti tombol atau kotak centang memiliki nilai kembali yang menunjukkan apakah misalnya pengguna mengklik tombol. Jadi "RenderGUI" Anda fungsi tampak seperti fungsi if / else besar di mana Anda memanggil atau tidak memanggil fungsi RenderXXX Anda tergantung pada kondisi permainan Anda dan semua logika pembaruan data (ketika tombol ditekan) terjalin ke dalam aliran. Semua penyimpanan data "di luar" gui dan diteruskan sesuai permintaan ke fungsi Render. (Tentu saja, Anda akan membagi fungsi-fungsi besar menjadi beberapa yang atau menggunakan beberapa abstraksi kelas untuk mengelompokkan bagian-bagian gui. Kami tidak menulis kode seperti pada tahun 1980 lagi, kan?;))
Sekarang saya menemukan bahwa Unity3D sebenarnya menggunakan pendekatan dasar yang sama untuk sistem GUI bawaan mereka. Mungkin ada beberapa GUI dengan pendekatan ini di luar sana juga?
Namun .. ketika melihat sekeliling, sepertinya ada bias yang kuat terhadap sistem GUI yang dipertahankan? Setidaknya saya belum menemukan pendekatan ini kecuali di Unity3D dan komunitas IMGUI asli tampaknya agak .... tenang.
Jadi, ada yang bekerja dengan kedua ide dan memiliki pendapat yang kuat?
Sunting: Saya sangat tertarik dengan pendapat yang berasal dari pengalaman dunia nyata. Saya pikir ada banyak diskusi hangat di forum IMGUI tentang "kelemahan teoritis" dari pendekatan GUI langsung, tetapi saya selalu merasa lebih mencerahkan untuk mengetahui tentang kelemahan dunia nyata .