Birkaç yıl önce MFC, QT, Formlar, SWING ve birkaç web-GUI çerçevesi gibi birçok "tutulan" GUI sistemi (bununla ne kastettiğim hakkında daha fazlası) ile uygulama geliştirme üzerine çalışıyorum. Her zaman çoğu GUI sisteminin konseptini aşırı karmaşık ve sakar buldum. Geri arama olaylarının, dinleyicilerin, veri kopyalarının, bir şeye bağlanacak bir şeyin - dönüşümler (ve benzeri), uygulamadaki diğer bölümlere kıyasla her zaman bir hata ve baş ağrısı kaynağıydı. (Veri Bağlamalarının / Modellerinin "uygun" kullanımı ile bile).
Şimdi bilgisayar oyunları yazıyorum :). Şimdiye kadar bir GUI ile çalıştım: Miyagi (tanınmayan, ancak temelde diğer tüm sistemler ile aynı fikir).
O korkunçtu.
Oyunlar gibi gerçek zamanlı görüntü oluşturma ortamları için, GUI sistemlerinin "korunmuş" olduklarını daha da eski hissettiriyorum. Kullanıcı arabirimlerinin genellikle otomatik olarak düzenlenmesi veya anında yeniden boyutlandırılabilir pencereleri olması gerekmez. Bunun yerine, sürekli değişen verilerle (dünyadaki modellerin 3d konumları gibi) çok verimli bir şekilde etkileşime girmeleri gerekiyor.
Birkaç yıl önce, temelde bir Hemen Grafik moduna benzeyen, ancak kullanıcı arayüzleri için olan "IMGUI" üzerine rastladım. Çok fazla dikkat etmedim, çünkü uygulama geliştirme aşamasındaydım ve IMGUI sahnesinin kendisi gerçekten geniş ya da başarılı görünmüyordu. Yine de aldıkları yaklaşım son derece seksi ve zarif görünüyor, ki bu UI yöntemini kullanarak bir sonraki proje için bir şeyler yazmak istememi sağladı (işteki birini ikna edemedim: (...)
"tutulan" ve "hemen" ile ne demek istediğimi özetleyeyim:
Atanan GUI: Ayrı bir başlatma aşamasında, Etiketler, Düğmeler, Metin Kutuları vb. Gibi "GUI kontrolleri" yaratır ve bunları ekrana yerleştirmek için açıklayıcı (veya programatik) bir yol kullanırsınız - hepsi bir şey yapılmadan önce. Kontroller kendi durumlarının çoğunu X, Y konumu, büyüklüğü, sınırları, alt kontrolleri, etiket metni, resimler vb. Bellekte tutar. Olaylardan haberdar olmak ve GUI kontrolündeki verileri güncellemek için geri aramalar ve dinleyiciler ekleyebilirsiniz.
Anında GUI: GUI kitaplığı, tek seferlik "RenderButton", "RenderLabel", "RenderTextBox" ... işlevlerinden oluşur (düzenleme: Render ile karıştırılmaması)önek. Bu işlevler aynı zamanda "hemen" bir denetim yapmak için çağırabileceğiniz sorgulama kullanıcı girişi, karakter ekleme, karakter ekleme, karakter tekrar hızını kullanma gibi kontrollerin arkasındaki mantığı da kullanır. Derhal GPU’ya yazılmalıdır: Genellikle mevcut çerçeve için hatırlanır ve daha sonra uygun gruplar halinde sıralanır). Kütüphanede bunlar için herhangi bir "devlet" yoktur. Bir düğmeyi gizlemek istiyorsanız ... sadece RenderButton işlevini çağırmayın. Bir düğme veya onay kutusu gibi kullanıcı etkileşimi olan tüm RenderXXX işlevleri, örneğin kullanıcının düğmeyi tıklattığını belirten değerlere sahiptir. Demek "RenderGUI" işlev, oyun durumunuza bağlı olarak RenderXXX işlevlerinizi aradığınız veya aramamanız durumunda büyük bir if / else işlevi gibi görünür ve tüm veri güncelleme mantığı (bir düğmeye basıldığında) akış içine karıştırılır. Tüm veri depolaması GUI'nin "dışında" ve istek üzerine Render fonksiyonlarına aktarılmıştır. (Tabii ki, büyük fonksiyonları birkaç taneye bölersiniz ya da kullanıcı arayüzünün bölümlerini gruplamak için bazı sınıf soyutlamaları kullanırsınız. Artık 1980'deki gibi kod yazmıyoruz, değil mi?)
Şimdi Unity3D'nin aslında kendi GUI sistemlerinde aynı temel yaklaşımı kullandığını gördüm. Muhtemelen bu yaklaşımla birlikte bir kaç GUI vardır.
Yine de .. Etrafa bakarken, tutulan GUI sistemlerine karşı güçlü bir önyargı var gibi görünüyor? En azından Unity3D dışında bu yaklaşımı bulamadım ve orijinal IMGUI topluluğu oldukça sessiz görünüyor.
Yani, her iki fikirde de çalışan ve güçlü bir görüşü olan var mı?
Düzenleme: En çok gerçek dünya deneyiminden kaynaklanan görüşlerle ilgileniyorum. IMGUI forumunda, anlık GUI yaklaşımının herhangi bir "teorik zayıflığı" hakkında çok fazla ateşli tartışmalar olduğunu düşünüyorum, ancak her zaman gerçek dünyadaki zayıflıklar hakkında bilmek daha aydınlatıcı buluyorum .