Dear ImGui - Ett modernt sätt att skriva GUI i C++

Permalänk

Dear ImGui - Ett modernt sätt att skriva GUI i C++

Det finns tre stora ramverk för att skapa C++ applikationer i.

- Visual Studio
- QT
- wxWidgets

Dom är bra och pålitliga, men över 30 år gammla. Att skapa GUI-applikationer i C++ är väldigt omständigt och de flesta föredrar python eller JavaScript för man skriver mindre kod för samma funktion.

Jag håller med faktiskt. Jag har programmerat i QT och det blir en herrejösses massa kod. Projektet blir ändå bra, men det blir mycket filer.

Men jag hittade en video på Youtube som introducerade Dear ImGui biblioteket och enligt han så är detta bibliotek revolutionerande då man kan skriva C++ GUI-applikationer på det moderna sättet.

När jag går in på Dear ImGui:s GitHub så verkar det vara ett sätt som allt bygger på att använda statiska funktioner för att göra ett GUI, vilket gör att man använder mindre kod. Man använder färdiga funktioner och färdiga objekt.

Kan Dear ImGui ha inspirerats av JavaScript eller är detta 20-talets nya teknologi?

Jag kör QT idag, tycker ni jag ska testa Dear ImGui?

Permalänk
Medlem

ImGUI är coolt och praktiskt, men mycket mer nichat än QT och WX, om du har en applikation med en snabb uppdatering och renderingsloop och inga behov av att ett UI som ser någorlunda "standard" ut, så funkar det bra, men annars är det ingen vidare lösning. Så för typ spel är det bra.

Men du borde inte se det som någon ny modern generell modell för UI som alla kommer använda sig av i framtiden, och det finns inga likheter med hur man gör hemsidor i JavaScript, om något så är webbläsarmodellen nästan ännu mer retained än vad QT är.

Vad jag vet så kommer både namnet och idén från spelindustrin (och är döpt efter hur grafik-apier fungerade, retained mode vs immediate mode DirectX), och mer specifikt från Rad Game Tools: https://caseymuratori.com/blog_0001

Det är enklare att göra små simpla saker som knappar och scrollbars och sånt med ImGUI, speciellt när du ska interagera det med en redan existerande uppdateringsloop, men när du vill göra mer komplicerade UI kontroller så tappar det sin effektivitet och charm ganska snabbt.

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Skrivet av Myris:

ImGUI är coolt och praktiskt, men mycket mer nichat än QT och WX, om du har en applikation med en snabb uppdatering och renderingsloop och inga behov av att ett UI som ser någorlunda "standard" ut, så funkar det bra, men annars är det ingen vidare lösning. Så för typ spel är det bra.

Men du borde inte se det som någon ny modern generell modell för UI som alla kommer använda sig av i framtiden, och det finns inga likheter med hur man gör hemsidor i JavaScript, om något så är webbläsarmodellen nästan ännu mer retained än vad QT är.

Vad jag vet så kommer både namnet och idén från spelindustrin (och är döpt efter hur grafik-apier fungerade, retained mode vs immediate mode DirectX), och mer specifikt från Rad Game Tools: https://caseymuratori.com/blog_0001

Det är enklare att göra små simpla saker som knappar och scrollbars och sånt med ImGUI
, speciellt när du ska interagera det med en redan existerande uppdateringsloop, men när du vill göra mer komplicerade UI kontroller så tappar det sin effektivitet och charm ganska snabbt.

Fast det är detta videon säger att ImGUI inte är till för.
Han menar att ImGUI är skapat för RIKTIGA badass applikationer.

De denna: https://youtu.be/vWXrFetSH8w?t=332

Jag får en känsla att man skriver väldigt lite C++ kod för att få något gjort med ImGUI. Därför fångar det mitt intresse.

Permalänk
Medlem

Så det där är en snubbe som är enbart i spelbranchen och kodar sin egen motor och applikationen han pratar om är en editor till ett spel, alltså exakt det jag menar att det är bra för eftersom det redan har den uppdateringsloopen, plus att hans program inte har ett standardiserat utseende så det faktum att kan inte kan använda WIN32 komponenter är helt fine för honom. Om du har samma use-case, så sure, toppen. Men det är absolut inte något sorts generellt bra system för exakt allt, i vissa typer av program är det dumt att behöva smälla upp en GPU-accellererad kontext över huvud taget för det är bara slöseri. I andra fall ska UIt nästan aldrig uppdateras ändå så att sitta och rita om det i 60 fps är slöseri på resurser. I yttligare andra fall så vill man ha UIn som är native till OSet vilket inte går med ImGUI. I andra fall kan man av prestandaskäl vilja rendera om bara delar av fönstret (som i typ flash). Du kan ha fall där du vill att en designer som gör själva utseendet i något separat UI-program, då tappar du vissa av fördelarna med ImGUI, etc.

Som i så mycket annat så handlar det om vad din situation faktiskt är, jag jobbar med spel så jag använder mig en del av ImGUI, men det finns en anledning till att inget OS kör sina native UIn i immediate mode, webbläsarna gör det inte heller, inga större nya UI system (typ WPF och sånt) gör det, det är helt enkelt bara spelindustrin som använder sig av den här modellen i någon större utsträckning, och det är inte för att det är så nytt, Casey Muratori släppte videon jag länkade ovan 2005 och det blev rätt omtalat mer eller mindre direkt, så på 15+ år har det inte spritt sig utanför spel, och det är av en god anledning.

Vad är det för program du faktiskt funderade på att skriva med ett ImGUI?

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Skrivet av Myris:

Vad är det för program du faktiskt funderade på att skriva med ett ImGUI?

Grafer, databas, usb-kommunikation, CRUD.
Jag gör inte spel eller grafik.

Jag är bara intresserad utav funktion, med minimalt med kod. Men jag känner mig bunden till C++ för att jag vill helst ha bra kommunikation med hårdvara så som USB. Jag använder dessutom mycket C-kod.

Permalänk
Medlem

Om du gör program med väldigt komplicerad rendering av grafer så kan det nog ha sina fördelar, det låter som det kan vara ett rimligt användningsområde, fast du måste ju såklart skriva grafrenderingen själv, och på ett ganska jobbigt sätt om du inte jobbat med låg-nivå grafikrendering tidigare. Det andra låter inte som något där du har så mycket att vinna på ImGUI tyvärr.

Om det främst handlar om att du vill göra det lättare för dig så verkar ju många köra på system som Electron och skriva UIt med web teknologi istället, har du testat något sånt? Fast så måste du skicka data mellan JS och C/C++, det är görbart, men om det är komplicerad data så är det nog lite meckigt det med.

Men det är ju inget fel att bara göra ett försök med ImGUI, speciellt om det är små program, testa helt enkelt och se vad du tycker.

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Hedersmedlem

Ja testa gärna (det är kul), men jag tvivlar på att du kommer spara så mycket kod jämfört med till exempel Qt. Qt i sig är förvisso jättestort, men så extremt mycket (mer än förväntat) att skriva själv blir det väl inte?

Permalänk
Skrivet av Myris:

Om du gör program med väldigt komplicerad rendering av grafer så kan det nog ha sina fördelar, det låter som det kan vara ett rimligt användningsområde, fast du måste ju såklart skriva grafrenderingen själv, och på ett ganska jobbigt sätt om du inte jobbat med låg-nivå grafikrendering tidigare. Det andra låter inte som något där du har så mycket att vinna på ImGUI tyvärr.

Om det främst handlar om att du vill göra det lättare för dig så verkar ju många köra på system som Electron och skriva UIt med web teknologi istället, har du testat något sånt? Fast så måste du skicka data mellan JS och C/C++, det är görbart, men om det är komplicerad data så är det nog lite meckigt det med.

Men det är ju inget fel att bara göra ett försök med ImGUI, speciellt om det är små program, testa helt enkelt och se vad du tycker.

Nackdelen med Electron JS är väll att det är segt då den skapar en applikation som är som en webbläsare?
Både Discord och Teams är skapat i Electron JS och dessa program är supersega....men snygga.

Skrivet av Elgot:

Ja testa gärna (det är kul), men jag tvivlar på att du kommer spara så mycket kod jämfört med till exempel Qt. Qt i sig är förvisso jättestort, men så extremt mycket (mer än förväntat) att skriva själv blir det väl inte?

Jag har haft bra stunder med QT, men nackdelen med QT är just att man få mycket filer. Sedan så är varje fil en klass. Objektorienteringen gör det faktiskt överdrivet komplex. Så fort man använder QT så är det alltid QT's klasser man måste använda. Det är inget fel på dom. Men tänk om jag vill bara ha funktioner istället. En hög med funktioner tycker jag är enklare att läsa än massa objekt.

Men fördelen med QT är att det är långtidssuport. Det lär man inte se med JavaScript.

Om bara QT hade Dependency Injection...då skulle objektorienterat vara inga problem alls.

Jag har använt mig av Spring Boot och den hade Dependency Injection. Otroligt smidigt. Älskar det. Dock var det Java, vilket inte alls är fel.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Jag har haft bra stunder med QT, men nackdelen med QT är just att man få mycket filer. Sedan så är varje fil en klass.

Det blir väl lite vad man gör det till också? Mängden filer är inte en inneboende egenskap, men om har varje klass i en egen fil och många klasser blir det förstås många filer. Fast man behöver ju inte ha en fil per klass och kanske kan man lösa uppgiften med färre klasser också. Qt är ju objektbaserat, men sin egen kod kan man kanske strukturera på något annat där om man vill.

Permalänk
Skrivet av Elgot:

Det blir väl lite vad man gör det till också? Mängden filer är inte en inneboende egenskap, men om har varje klass i en egen fil och många klasser blir det förstås många filer. Fast man behöver ju inte ha en fil per klass och kanske kan man lösa uppgiften med färre klasser också. Qt är ju objektbaserat, men sin egen kod kan man kanske strukturera på något annat där om man vill.

T.ex. om jag ska göra en ny form, så måste det bli en ny klass, vilket blir en .cpp fil och en .h fil.

Om jag vill ansluta två formar med varandra så måste en av klasserna ha adressen av andra klassen i sin konstruktör. Men med Dependency Injection så blir detta problem löst.

Permalänk
Hedersmedlem
Skrivet av heretic16:

T.ex. om jag ska göra en ny form, så måste det bli en ny klass, vilket blir en .cpp fil och en .h fil.

Om det bara är mängden filer man vill begränsa kan man ju lägga allt i samma fil (eller i alla fall alla h-filer i en och cpp-filerna i en)…

Skrivet av heretic16:

Om jag vill ansluta två formar med varandra så måste en av klasserna ha adressen av andra klassen i sin konstruktör. Men med Dependency Injection så blir detta problem löst.

Man kan väl tänka sig andra former av kommunikation också (till exempel med signaler)?

Permalänk
Skrivet av Elgot:

Om det bara är mängden filer man vill begränsa kan man ju lägga allt i samma fil (eller i alla fall alla h-filer i en och cpp-filerna i en)…
Man kan väl tänka sig andra former av kommunikation också (till exempel med signaler)?

Ja. Man kan ha signals och slots...men det blir väldigt mycket kodskrivande för det. För att få det att fungera så måste man markera att något är en slot och sedan ska man skicka en signal dit via emit. Då måste man använda connect först.

Det är många steg för att få det fungera.

I SpringBoot så säger man bara @AutoWire och sedan är allt klart.

Som du förstår så klagar jag inte på C++ språket. C++ är ett riktigt bra språk. Det är bara QT ramverket som jag anser bör bjuda på sig själv lite mer.

Permalänk
Medlem
Skrivet av heretic16:

Nackdelen med Electron JS är väll att det är segt då den skapar en applikation som är som en webbläsare?
Både Discord och Teams är skapat i Electron JS och dessa program är supersega....men snygga.

Ja absolut, det har hög prestandakostnad och minneskostnad, men ibland kan det vara värt det. Personligen blir jag ofta irriterad på dom programmen, det är frustrerande att bakgrundsprogram som Discord, Skype, Steam, Spotify behöver snurra upp hela webbläsare, men det finns fall där det nog kan vara värt det för utvecklingstiden, men ja det kan vara lite synd för användaren.
Det största programmet jag jobbar på nu med sånt vanligt UI (dvs inte ett spel) är editorn till spelen, där kör jag WX. WX är definitivt ingen favorit att programmera mot, men det är inte så farligt, det har mindre dependencies än QT och mindre tooling runt sig vilket jag tycker är skönt. Det känns inte direkt modernt, men det är mest en fördel för mig

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Skrivet av Myris:

Ja absolut, det har hög prestandakostnad och minneskostnad, men ibland kan det vara värt det. Personligen blir jag ofta irriterad på dom programmen, det är frustrerande att bakgrundsprogram som Discord, Skype, Steam, Spotify behöver snurra upp hela webbläsare, men det finns fall där det nog kan vara värt det för utvecklingstiden, men ja det kan vara lite synd för användaren.
Det största programmet jag jobbar på nu med sånt vanligt UI (dvs inte ett spel) är editorn till spelen, där kör jag WX. WX är definitivt ingen favorit att programmera mot, men det är inte så farligt, det har mindre dependencies än QT och mindre tooling runt sig vilket jag tycker är skönt. Det känns inte direkt modernt, men det är mest en fördel för mig

Alltså wxWidgets?

Du jobbar med wxWidgets? Är inte opensource bara för hobby och hemmapulare?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Det är många steg för att få det fungera.

Fast i praktiken blir det väl sällan så farligt? Om man använder QtDesigner för att skapa formulären behöver man väl knappt skriva en enda signal/slot/connect och när det väl behövs är det ju inte särskilt besvärligt?

Permalänk
Medlem

Jag använder wxWidgets för editorn i våra spel, ja, jag bara tog vad jag tyckte verkade rimligast. Började försöka mig på Qt men orkade inte hålla på med hela ekosystemet där, dom tycker man ska använda Qt Cretor, men jag föredrar att bara koda det i Visual Studio, och sen är själva Qt libbet så stort vilket jag inte var så sugen på att lära mig, det har så mycket features som jag inte ville använda mig av.

Open Source används mycket av alla möjliga, så länge det inte är GPL använder jag det gärna och wxWidgets är LGPL så sålänge det är kompilerat till en separat dll som jag inte ändrar så är allt okej. Men jag använder en massa annan Open Source kod, gratis är godast så länge det funkar

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Skrivet av Elgot:

Fast i praktiken blir det väl sällan så farligt? Om man använder QtDesigner för att skapa formulären behöver man väl knappt skriva en enda signal/slot/connect och när det väl behövs är det ju inte särskilt besvärligt?

Inte via QtDesigner. Detta program är helt underbart.
Om jag vill skicka en signal från en metod till en annan metod, då måste jag göra en så kallad "connect".
Jag kan importera objektet och anropa metoden, än fast det inte rekommenderas på grund utav UI-trådarna.

Jag tycker QT har lagt otroligt mycket tid på QtDesigner. Detta är orsaken varför jag valde QT.

Men jag tror jag måste göra ett projekt i Dear ImGUI för att verkligen avgöra vad som är bra. Lätt att gissa här på forumet
Men jag vill inte gå bort från C++ för jag gillar C++ då jag kör mycket C.

Men med Dear ImGui så kan man göra detta

Permalänk
Hedersmedlem
Skrivet av heretic16:

Inte via QtDesigner. Detta program är helt underbart.
Om jag vill skicka en signal från en metod till en annan metod, då måste jag göra en så kallad "connect".
Jag kan importera objektet och anropa metoden, än fast det inte rekommenderas på grund utav UI-trådarna.

Ja, men många småprogram kan man väl nästan uteslutande skapa genom att placera ut kontroller i QtDesigner, högerklicka på dem och välja "go to slot"? Då genererar verktyget kopplingarna och man behöver bara bry sig om vad som faktiskt skall hända i varje slot. Det finns ju till och med ett grafiskt connect-verktyg för den hugade (för att till exmpel koppla en checkbox till enabled-egenskapen hos en annan kontroll).
Om man behöver mera avancerade kopplingar får man kanske som sagt skriva dem själv, men det är ju inte jättesvårt och om man tänker igenom designen behöver man kanske inte jättemånga heller.

Det svåraste är förmodligen det som är trivialt i andra ramverk. Kan du få det att se ut som en windows-applikation?

Permalänk
Skrivet av Elgot:

Ja, men många småprogram kan man väl nästan uteslutande skapa genom att placera ut kontroller i QtDesigner, högerklicka på dem och välja "go to slot"? Då genererar verktyget kopplingarna och man behöver bara bry sig om vad som faktiskt skall hända i varje slot. Det finns ju till och med ett grafiskt connect-verktyg för den hugade (för att till exmpel koppla en checkbox till enabled-egenskapen hos en annan kontroll).
Om man behöver mera avancerade kopplingar får man kanske som sagt skriva dem själv, men det är ju inte jättesvårt och om man tänker igenom designen behöver man kanske inte jättemånga heller.

Det svåraste är förmodligen det som är trivialt i andra ramverk. Kan du få det att se ut som en windows-applikation?

Alltså, QT är inte svårt. Det är bara mycket kod att skriva.

Kanske. Jag har ingen aning. Dear ImGui kanske är inte är rätt för mig överhuvudtaget.

Men jag ska nog ge ImGui en chans.