Sonntag, 24. August 2014
Simple Directmedia Wrapper
Bei Grafikprogrammierung habe ich mich bislang immer auf Allegro (https://www.allegro.cc) verlassen; die Bibliothek kann ich immer noch empfehlen, gerade für Einsteiger, aber an vielen Ecken könnte sie schneller, portabler oder ausgereifter sein. In dieser Hinsicht ist Simple Directmedia Layer oft deutlich überlegen, weshalb ich jetzt zu SDL2 wechsle. Beide sind jedoch reine C-Bibliotheken, was bei Programmierern die C++ und RAII* gewohnt sind regelmäßig für Kopfschmerzen sorgt. Also mussten ein paar Wrapper-Klassen her, um die Arbeit zu erleichtern und Ressorcenmanagement zu übernehmen.
Das Ergebnis ist der Simple Directmedia Wrapper, eine header-only-Bibliothek die dem Anwender die ganze nervige Buchhalterarbeit abnimmt.
Ein anderer beklagenswerter Mangel sind schnelle, vielseitige und einfache Widget-Bibliotheken die reibungslos mit SDL zusammenarbeiten. Die meisten Programmierer scheinen CEGUI zu benutzen, aber in der Praxis ist es oft unnötig groß und komplex. GWEN und KiWi sehen auch vielversprechend aus, aber beide neigen zu Abstürzen und scheinen nicht mehr weiterentwickelt zu werden. Mein Ansatz hierfür sind die Quick&Dirty Widgets, eine weitere header-only-Bibliothek die zusammen mit SDW benutzt werden sollte. Sie können mit SDL's Software- oder Hardware-Renderer benutzt werden; man kann das GUI aber auch als OpenGL-Textur binden, irgendwo auf den Bildschirm projizieren und mit shaderbasiertem OpenGL oder Immediate Mode mischen. Der Skin wird aus einer Bilddatei geladen und kann angepasst werden; Ein Win98-artiges Design ist standardmäßig dabei.
Beide Bibliotheken verwenden C++11 (insbesondere shared_ptr und Lambdas) und erfordern daher einen modernen Compiler; ich habe sie auf Ubuntu 12.04 mit GCC und Windows 7 mit MinGW getestet. Außerdem benötigen sie SDL2 mit Image- und TTF-Plugins und (wenn OpenGL benutzt werden soll) GLEW**.
Die erste Alphaversion gibt's hier, mit einem Beispielprogramm das die verschiedenen Anwendungen zeigt:
sdw-qdw-alpha1 (zip, 590 KB)

QDW Screenshot

Until recently, I mostly used Allegro (https://www.allegro.cc) for graphics. I can still reccomend it, especially to beginners, but I often found it not fast, portable or mature enough. I find Simple Directmedia Layer superior in this regard, which caused me to switch to SDL2. Both, however, are pure C libraries, which causes frequent headaches for programmers used to C++ and RAII*. What I needed was a bunch of Wrapper Classes to simplify my work and take care of the resources. This resulted in the Simple Directmedia Wrapper, a header-only-library that handles all the bookkeeping for you.
Another thing I missed was a fast, versatile and simple Widget library that plays well with SDL. Most people seem to use CEGUI, which I find too large and compex for most uses. GWEN and KiWi also look promising, but both are prone to crashes and development seems to have ceased. My solution are the Quick&Dirty Widgets, another header-only-library for use with SDW. They can be drawn using SDL's Software- or Hardware-Renderer, but you can also bind the GUI to an OpenGL-texture, project it somewhere to the screen and mix it with shader-based or immediate-mode OpenGL. The skin is loaded from an image file and can be modified freely; a Win98-like look is included.
Both libraries use C++11 (especially shared_ptr and lambdas) and thus require a modern compiler; I tested them on Ubuntu 12.04 with GCC and Windows 7 with MinGW. They also require SDL2 with the Image- and TTF-Plugin and, if they are to be used with OpenGL, GLEW**.
This is the first alpha version, compete with an example program to show how it can be used:
sdw-qdw-alpha1 (zip, 590 KB)

---
* http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

** The example also uses GLM, but the libraries themselves don't.

... comment