wanting to try a GUI toolkit: needing some advice on which one to choose

Ola Fosheim Grøstad ola.fosheim.grostad at gmail.com
Tue Jun 1 21:47:38 UTC 2021


On Tuesday, 1 June 2021 at 20:56:05 UTC, someone wrote:
> Now think for a instant, that you choose D for performance so 
> you expect it to be fast, and you write the hello world app to 
> begin with, and you fire-up a full-framework like Electron or 
> the like just to give you basic GUI controls.

Well, on a Mac I would just embed a WebView which already is 
ready in the OS UI framework. Electron allows you to execute 
native code I think ("Napi" or something?). A better approach is 
probably to use Chromium Embedded Framework v3, which supposedly 
is multithreaded.

> But, why are we, to begin with, stacking layers upon layers of 
> APIs (meaning millions of lines of code and/or degrading 
> performance to extreme levels and/or increasing the attack 
> surface of our lean app) just to say hello world in a window 
> and expecting the user to close it at any given time and ... 
> nothing more ?

Not that much of a performance bottle neck, unless you push a lot 
of data. I wouldn't use it for an audio/graphics editor. Memory 
usage is more of an issue though. Depends on the app, if it is a 
"clock" then it obviously is too much. If it is a full 
application then it is ok.


> Why did we choose to use huge frameworks, embed browsers, etc 
> to write a simple app ?

Primarily because it cuts down on developer time. It is easy to 
change and you can easily configure it for many configurations 
(e.g. easy to create a limited features version).

This trend will increase as web component repos become available. 
At some point it might become prohibitively expensive to develop 
complex user interfaces without web technology.

Right now, drag-and-drop is not as easily supported in browser 
UIs though. That is an argument for using native UI.


> I think someone with the knowledge to write a classical toolkit 
> in pure-D following the classical design principles with the 
> standard controls and nothing more should need deep openGL 
> knowledge to begin with (however a better choice should be 
> start from zero with its Vulkan successor) providing he/she has 
> access to proven code for text input and/or font rendering 
> (quite complex) and besides full-UniCode support (which in D is 
> not a problem at all).

The problem now is that you have to support both Metal, OpenGL 
ES, and Direct X. Vulkan isn't well enough supported to be a 
convenient target.

History also tells us that hardware GPU abstractions tend to be 
weak and not last very long.

So you are still stuck with an abstraction layer like Skia. It is 
just too expensive to support all hardware yourself.

The game industry spends a lot of money supporting/testing 
various hardware drivers and working around bugs in said 
drivers/hardware.

At the end of the day, the user will be upset if the application 
crashes because of a vulkan-bug/hardware-bug. So in that context 
browser-overhead isn't all that bad.


> And of course, feel free to argue on everything you disagree 
> with :)


It is not so much that I disagree, but the hard reality is that 
there are few attractive alternatives that are portable and also 
cuts down on developer time.

I would personally consider the options:

1. Rolling my own using Skia, especially if I only need mouse 
input and no keyboard.

2. CEF or WebView, just to get to a productive stage sooner. 
Assuming the UI is not pushing a large amount of data.

3. Qt/Gtk, but I think they come with a lot of baggage... so I 
personally don't find it more attractive than WebView for basic 
UIs. If you already know webtech it becomes even less attractive 
to learn a framework that is less flexible than a webview. I 
don't see a healthy future for Qt/Gtk, but webtech is there to 
stay.

Note: Many simple GUI toolkits are horribly inefficient as they 
let each object render themselves.  An efficient GUI engine will 
have to replicate some of the browser complexity...




More information about the Digitalmars-d-learn mailing list