There has been quite a bit of progress during the past two weeks, in the areas of Home/UI, frameworks and resources, and general optimizations.
Draggable scroll bars. A long-standing minor issue with scrollable widgets has been that even though a scroll bar position indicator has been shown, it has not been possible to drag it with the mouse. Well, now it is! Draggable scroll bar thumbs change color when the mouse is hovered on them, and you can drag them as you please. Note that in Home you can still click the left and right edges of the screen to navigate, although the clickable areas are now much thinner to accommodate possible scroll bars.
Multiple IWAD/add-on folders. You can now set up multiple folders where Doomsday expects to find your game IWADs and add-ons (resource packs, PWADs, etc.). Currently the IWAD folders are managed via the Config menu, and add-on folders are managed via the Packages column’s context menu. (These don’t really need to be separately configured; the current arrangement is a placeholder for more functionality waiting to be added in the Packages context menu.)
Info popup close buttons. When viewing information about a package, there is now a convenient close button in the top right corner for dismissing the popup.
Multiple action buttons in package lists. After a series of refactorings in the widgets, it is now possible to have more than one action button for listed package items. For instance, the Packages dialog now has one button for viewing the info summary of a package and another for adding the package to the game profile.
Game alerts. An unplayable game profile is shown with an Alert icon. (You can hide unplayable games in User Interface settings.)
UI style tweaks. Inverted buttons now have nice rounded edges, and the focus indicator is visible against bright backgrounds.
One of the more challenging issues I’ve tackled recently is the introduction of multithreading in the Doomsday 2 file system. This is very useful when you have a large collection of add-ons, for example, and Doomsday has to check them through and collect information about them. Previously this was done in a single (the main) thread, which made it slow and UI-blocking.
After a number of attempts I now believe I’ve got the implementation right. The key was to perform just the slow tasks in the background (the scanning and parsing of files), and only take results into use after a folder has fully finished processing. This level of granularity (entire folders) makes things more straightforward compared to trying to process individual files separately.
In practice the file system improvements should yield faster launch times when you have lots of add-ons available, and refreshing the files at runtime should not block the UI for long periods of time.
I also made a nice minor improvement in the Doomsday 2 Core library regarding the handling of observers. Observing objects are now automatically unregistered when they are destroyed, or when the target is destroyed, making the system easier to use and significantly more robust.
I spent some more time in the profiler trying to locate a few more basic bottlenecks related to the UI and the Core library. The following issues were fixed:
- There were multiple redundant lookup operations when accessing the contents of ZIP archives. This was particularly bad when reading data a few bytes at a time.
- All UI widgets now use less memory and therefore should also be faster to create.
- More efficient data structure were taken into use in a couple of often-used places (hashes instead of ordered maps).
P.S. We’ve hit build 2000! While these numbers are somewhat arbitary (number of days since January 1, 2011) I’ve always felt that Doomsday 2.0 needs to have a build number in the 2K range. 🙂