Daemon, the Unvanquished engine is a descendant of Quake3 (1998) through ioQuake3, Xreal, ET:Xreal and OpenWolf. That’s 15 years of tweaks, fixes and features added at random places in the code. What used to be the “final evolution” of John Carmack’s C style has grown into a mess of interdependent modules and special case handling. As a result, Daemon is less maintainable and the apparent lack of clear separation in the codebase scares new developers. Because Unvanquished is a long-term project the developers need to make our engine friendlier for new developers while becoming competitive with other modern engines.
Modernizing & cleaning the codebase
The Quake 3 family of engines is single-threaded, although it can optionally use a second thread for the renderer. The multithreading that would be the least intrusive to implement would be to use worker threads like Doom3 BFG does. However they eventually want to get close to TTimo’s experimental engine in which the inputs, the client side gamelogic and the renderer are in separate threads. Yet, this is not possible without extensive changes, with most modules working like state machines and exposing inner data.
Video by L.G.C.
Progress and prospects
Work has started in the engine-upgrade branch, first by making all the engine compile and work in C++. They have replaced some C modules with empty shells that translate and proxy calls to their new C++ equivalent. The command system, base commands, the console data-structures and cvars are ported, soon to be followed by the filesystem API and the logging API. the developers chose these modules because they are at the basis of the engine and should only depend on each other. In its current state, the engine-upgrade branch is fully functional with minor differences in comparison to the older engine. The wiki page tracks these changes. In addition, they implemented PNaCl sandboxes for the gamelogic and successfully played on a PNaCl server with QVM clients.