8 puan yazan GN⁺ 2024-07-01 | 7 yorum | WhatsApp'ta paylaş
  • C++ için GUI geliştirme kütüphaneleri araştırılıp karşılaştırıldı ve sonuçlar özetlendi
  • Temel gereksinimler: yalnızca Windows desteği, ticari kullanıma uygunluk, dark mode dahil kolay stillendirme, en az bağımlılıkla 40 MB'tan küçük tek bir EXE üretimi, hızlı geliştirme

WinUI 3

  • İlk bakışta harika bir seçenek gibi görünüyor
  • Modern Windows bileşenleri kullanılabiliyor ve stil renkleri özelleştirilebiliyor
  • XAML ile tasarlanabiliyor ve Visual Studio tasarımcısı doğrudan kullanılabiliyor
  • Sorunlar:
    • Uygulamayı paketlenmemiş biçimde dağıtmak pek iyi desteklenmiyor
    • Uygulama bir VM'e ya da başka bir bilgisayara taşındığında çoğu zaman çalıştırılamıyor
    • WinUI işlevlerini sağlayan çok sayıda .dll dosyasının da dağıtılması gerekiyor
    • Tek bir taşınabilir .exe dosyası üretilemiyor
    • Paketli kullanımda sorun yok, ancak AppX paketi olarak kurulduğunda Win32 API erişimiyle ilgili sorunlar çıkıyor

Win32 / MFC / Win32'yi sarmalayan küçük kütüphaneler

  • Yüksek taşınabilirlik gerektiği için işletim sisteminin yerel çizimini kullanmak mantıklı
  • Program tek bir .exe dosyası olabilir ve boyutu da çok küçük kalabilir (MFC statik bağlandığında)
  • Başkasının zaten yazdığı daha minimal bir kütüphane kullanılabilir
  • Sorunlar:
    • Temel Win32 kontrollerini stillendirmek çok zor
    • Tüm kontroller için özel boyama işlevleri yazmak gerekiyor
    • Windows Dosya Gezgini'nde kullanılan "gizli" bir dark mode var, ancak yalnızca bazı kontrolleri kapsıyor ve yine de pek iyi görünmüyor

Qt

  • C++ GUI dünyasının kutsal kasesi
  • Karmaşık, ama Qt Style Sheets kullanılarak kolayca stillendirilebiliyor
  • Sorunlar:
    • Dinamik bağlandığında uygulamayı çalıştırmak için gereken çok sayıda .dll bulunuyor ve boyut 40 MB'ı aşıyor
    • Qt programa statik olarak bağlanabiliyor, ancak bunun için ya uygulamanın açık kaynak olması ya da Qt'nin LGPL lisansı nedeniyle yeniden derleme için nesne dosyalarının dağıtılması gerekiyor
    • Alternatif olarak ticari lisans satın alınabiliyor, ancak maliyeti binlerce dolar

wxWidgets

  • Öğrenmesi kolay bir kütüphane
  • wxFormBuilder kullanılabiliyor
  • Qt'den daha esnek bir lisansa sahip ve 3 MB'lık çalıştırılabilir dosyaya statik olarak bağlanabiliyor
  • Sorunlar:
    • Windows'ta yerel Win32 bileşenlerini kullanıyor ve stillendirme seçenekleri sunmuyor
    • Windows Dosya Gezgini dark control uygulamasını destekliyor, ama pek iyi değil

hikogui

  • Arka uç olarak Vulkan kullanan yeni bir retained mode GUI kütüphanesi
  • Yerleşik dark mode'a sahip ve kolayca stillendirilebiliyor
  • Sorunlar:
    • Başarıyla derlemek için bilgisayar bilimleri doktorası gerekiyormuş gibi hissettiriyor
    • 30 dakikadan fazla örnekleri derlemeye çalıştıktan sonra elde edilen tek şey, Vulkan kütüphanesinin içinde access violation ile anında çöken bir çalıştırılabilir dosya oldu

Sciter

  • HTML/CSS kullanarak masaüstü uygulamaları için GUI yazmayı sağlayan, Electron'a iyi bir alternatif
  • Sorunlar:
    • Nihai uygulamanın tüm .dll dosyalarıyla birlikte yaklaşık 25 MB olması sorun yaratabilir gibi görünse de kabul edilebilir
    • Açık kaynak olsaydı ve ticari kullanım için statik bağlantılı sürümü olsaydı daha iyi olurdu
    • Qt kadar pahalı olmadığı için ($310) ücret ödemek sorun olmazdı
    • Asıl sorun, render kalitesinin çok iyi olmaması
    • Yazı tiplerinde ve görsellerde aliasing sorunları yaşandı
    • Pencerenin, özelleştirilemeyen veya değiştirilemeyen oldukça kalın (2-3px) gri bir çerçevesi var

WinForms / WPF

  • C++ GUI kütüphaneleri sorulduğunda çoğu kişi başka bir stack kullanmayı öneriyor
    • C++'ın kötü bir fikir olduğunu, bu yüzden programın ön yüzünün başka bir stack ile yazılıp C++ ile yazılmış işlevlerin bileşen/modül olarak yüklenmesi gerektiğini söylüyorlar
  • Küçük boyutlu tek bir .exe dosyasına sahip olunabilir ve WinForms/WPF kullanılabilir
  • .dll dosyaları uygulamaya kaynak olarak gömülüp geçici klasöre çıkarılabilir; ardından P/Invoke kullanılarak C#/.NET uygulaması içinden derlenmiş .dll çağrılabilir ya da C++/CLI tercih edilebilir
  • Sorunlar:
    • .NET Framework, Windows 10 ve üzeri sürümlerde önceden yüklü geldiği için teknik olarak bağımlılık olmaması şartını karşılıyor
    • .dll dosyaları gömülürse bir yere çıkarılmaları gerekiyor ve P/Invoke'ın çalışması için ek kod yazmak gerekiyor
    • C++/CLI, .NET IL koduna derleniyor; sonuçta C#'a çevrilmiş gibi görünen bir C++ kodu ortaya çıkıyor

Çözüm?

  • Basit uygulamalar için Dear ImGui'den daha uygun bir seçenek olmadığı düşünülüyor
  • Karmaşık arayüzler tasarlarken başlıca dezavantajı, retained mode değil immediate mode bir UI olması; dolayısıyla UI için saniyede 60 kareden fazla çizim yapmak üzere DirectX gibi bir GPU renderer'ının sürekli çalışması gerekiyor
  • Ancak diğer tüm açılardan gereksinimlerle örtüşüyor
  • Derlenmiş program yalnızca 500 KB boyutunda ve VC++ Redistributable kurulumu gerektirmiyor

GN⁺ görüşü

  • Yazarın da söylediği gibi GUI uygulama geliştirme için kusursuz bir kütüphane yok gibi görünüyor. Gereksinimlere göre çeşitli trade-off'lar var
  • Basit uygulamalar için Dear ImGui en uygun seçenek gibi dursa da, karmaşık arayüzler için retained mode bir GUI toolkit kullanmak daha iyi olabilir
  • Ticari bir uygulama geliştirilecekse lisans maliyeti önemli bir değerlendirme unsuru olabilir. Qt gibi kütüphaneler pahalıyken wxWidgets ücretsiz kullanılabiliyor
  • C++ ile GUI uygulaması geliştirmek kolay değil; bu nedenle ön yüzü C# veya başka bir dille geliştirip yalnızca performans yoğun kısımları C++ ile yazmak daha gerçekçi olabilir
  • Windows'ta yerel görünüm ve hissiyat isteniyorsa WinUI veya MFC tercih edilebilir; çapraz platform desteği gerekiyorsa Qt ya da wxWidgets daha iyi bir seçim olabilir

7 yorum

 
tsboard 2024-07-05

hikogui korkutucu bir şeymiş, titreme

 
fastkoder 2024-07-03

https://getstream.io/blog/flutter-desktop-vs-electron/ çeşitli göstergelerle performansı karşılaştırıyor

 
fastkoder 2024-07-03

Sciter ve Electron ile karşılaştırıldığında Flutter Windows Desktop Build de değerlendirilmeye değer. Zaman zaman hatalı eklentiler olsa da temeli sağlamdır; bir iletim aracı olarak kullanırken işe yarar.
Tekil örnek, otomatik güncelleme, durum çubuğu, Windows bildirimleri, hızlı açılış süresi, Dart dili, Win32API Plugin vb.

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

"Derlemenin başarılı olması için bilgisayar bilimi doktorası gerekiyor"
kahkaha

 
GN⁺ 2024-07-01
Hacker News görüşü
  • Birçok yorumu okurken, temel varsayımın baştan yanlış olduğunu fark ettim. Blog yazısının adını "Gereksinimler gerçekçi olmadığında Windows için GUI uygulaması yazmak acı vericidir" olarak değiştirmek daha doğru olurdu
  • .NET Framework 3.5 kullanıp WinForms'u hedeflemek daha iyi olurdu. Tüm güncel Windows sürümlerinde kurulu geliyor
  • Bu yazı çeşitli seçeneklere dair iyi bir genel bakış sunuyor, ancak yazarın özel gereksinimleri birçok seçeneği daha baştan eliyor
    • Tamamen özelleştirilmiş GUI stillendirmesi isteyip kendi render fonksiyonlarını yazmak istememesi, işi kullanımı kolay özelleştirilebilir bir GUI kütüphanesi seçme problemine dönüştürüyor
    • Kendinden bağımsız çalışabilir dosya ve 40 MB altı boyut sınırı gereksinimi de birçok seçeneği eliyor. Qt bu gereksinimleri karşılayabilirdi, ancak açık kaynak lisansı hedefleriyle uyuşmuyordu ve lisans satın almak istemiyordu
    • Bağımlılıklara izin verilse, daha büyük indirme boyutu kabul edilse ya da yerleşik Windows GUI kontrolleri kullanılsa tablo çok farklı olurdu
    • Harici bağımlılık olmadan hafif, tamamen özelleştirilebilir bir GUI yazmak ve izin verici bir lisans istemek söz konusuysa, cevabın ImGui olacağını düşünürdüm
  • WinForms/WPF fikrinde büyük bir kusur olmadığını söylüyor ama iki ayrı stack gerektirmesi dışında buna pek değinmiyor. Native kod istiyor ve C# görmek istemiyor, ancak nedenini açıklamıyor. Bunun nedeni tersine mühendislik korkusu olabilir. UI kodu nadiren sır içerir
    • Tek bir exe ile dağıtım bazen kullanışlıdır, ancak bu senaryoda zahmetli olabilir. Velopack (Squirrel) gibi bir paketleyici kullanırsanız tek exe olarak dağıtabilir ve otomatik güncelleme özelliği de ekleyebilirsiniz. Kurulumdan sonra diskte iki veya daha fazla dosya bulunması makul bir uzlaşmadır
    • Windows, diğer tüm platformlar hariç tutulduğunda masaüstü uygulaması geliştirmek için en kötü platformdur
  • LGPL lisanslı yazılım kütüphaneleri için ticari lisans ücreti talep edilmesini eleştiren geliştiriciler hakkında çok düşük bir kanaate sahibim. Onlar kendi emeklerinin karşılığını almayı bekliyor ve bunu kapalı kaynak yazılım üreterek güvence altına alıyor. Ama UI kütüphanesinin gerçekten zor kısımlarını çözen geliştiricilerin dünyaya kodlarını bedava hediye eden olgun insanlar olması gerektiği varsayılıyor
  • Sciter ve "anti-aliasing" sorunu konusunda... yazar uygulamada yüksek çözünürlüklü DPI desteğini etkinleştirmemiş
    • Bunu Visual Studio'da etkinleştirerek veya uygun bir manifest ekleyerek çözebilirsiniz
    • "Hello C++" eğitiminde anlatılıyor
  • Daha doğru ifade etmek gerekirse:
    • "Portable" (kendiliğinden açılma olmadan tek exe)
    • Ticari olmak ve derlenmiş nesne dosyalarını yeniden dağıtmak istememek (bu da "portable" gereksinimiyle birlikte LGPL'i fiilen dışarıda bırakıyor)
    • Karanlık mod
    • Windows GUI uygulamaları gerçekten zahmetlidir. Bu gereksinimlerden herhangi birini kaldırırsanız iyi seçenekler çoğalır
    • Çoğu "portable" uygulama win32 kullanır. Genelde portable uygulamalar küçük ve basittir; işlevsellik, karanlık mod veya başka stil yeteneklerinden daha önemlidir
  • Başkalarının açık kaynağından çok şey bekleyen biri olarak, yazar kendi çözümünü açık kaynak yapmaya niyetli görünmüyor
  • Ben de bu gereksinimlere uyan bir GUI araç takımı üzerinde çalışıyorum: Slint - https://slint.dev
    • Statik olarak derlenip tek bir .exe haline getirilebilir ve boyutu 40 MB'tan küçük kalabilir. Masaüstünde ücretsiz kullanılabilen bir lisansa sahip. Karanlık/açık stil sunuyor. Ayrıca (üzerinde çalışılan) sürükle-bırak WYSIWYG düzenleyici de içeriyor
  • Tüm kontroller için özel paint fonksiyonları yazmak zorunda olunması, eski win32 felsefesinin yazara uygun olmadığını gösteriyor. win32'nin temel unsuru wndproc'tur. Çoğu kontrol renk bilgisini üst bileşenden ister
    • Rahatsız ediciyse, bunu küçük bir kütüphaneyle sarıp boilerplate'i kaldırmak büyük bir mesele değil
  • Sonuçta ortaya çıkan şey bağımlılığı olmayan ya da en fazla çok az bağımlılığı olan, 40 MB'tan küçük tek bir .exe dosyası olmalı
    • Artık bilgisayarlarda modern bir tarayıcı var. .exe dosyası yerine görseller/css/javascript satır içi gömülü tek bir .html dosyası kullanılabilir