Phase 2 ends

The phase 2 comes to an end, finally. It has lasted the same as the summer, from the beginning of May to the end of October (yes, that's the duration of the summer here at the Costa del Sol). Six months of hard work which I’m proud of, although not all goals were reached; so many things learnt, a lot of challenges completed and more steps taken to the construction of a solid, independent and useful infrastructure for the engine. As said many times in previous posts our resources are minute, but a bit of sacrifice is enough to keep pushing forward.

Before exposing some statistics about the project and a summary of the main development milestones, I would like to remark that every component in the code repository (rev. 1398) is ready-to-use; everything is documented and fully tested, and compiles on any of the supported OS (Windows, Linux or Mac). Nevertheless, no effort has been spent on optimization yet; some features may be already optimized and some others may not that much. Examples of this are the containers: they are not currently as fast as STL containers but some experiments revealed that they can be easily improved to be slightly faster than them; this improvement might be included in the next development phase, as it is so cheap to do (just storing a pointer). The same happens to the Math library, which does not make use of SIMD yet despite it’s so simple to include such instructions in the existing code; it is just not a priority at the moment. In closing, just an obvious warning: the public interface of the entire library is prone to change until the first version of the engine is officially published, so please have this in mind if you decide to include it in your projects.

The big picture

Let’s go with some numbers about the current state of the project:

  • 239.092* lines of code, without blank lines or file header comments, counting test code.
  • 68.800* lines of code, without blank lines or file header comments, not counting test code.
  • 350* code files, counting test code files.
  • 208* code files, not counting test code files.
  • 143* classes.
  • 43%* of the lines of code (without tests) are internal or public documentation.
  • More than 7.100 unit tests in total, 1.600 of them written during this phase.
  • 116 revisions in Subversion during this phase (code is committed only when a task is completely done, including unit tests, and after it has passed the review).
  • 73 tasks completed during this phase.
  • More than 450 tasks finished so far in total, from 600 created in the tracker.

*These numbers were obtained by using the Source Monitor tool.

By taking a look to this data, one can get an idea of the importance we give to both testing (three times more test code than tested code) and documentation (43% of the lines of code). If we add these efforts to our concern with usability (which cannot be measured, unfortunately), the result is that the development of new features is slow, but it is worth really. In the end, not spending time to fix serious bugs or having to explain to users, one by one, how things work is a good future investment.

 

Summary of the work done

New classes

  • Containers: QNTree, QDynamicArray, QBinarySearchTree.
  • Iterators: QListIterator, QNTreeIterator, QBinarySearchTreeIterator, QConstArrayIterator, QConstListIterator, QConstNTreeIterator, QConstBinarySearchTreeIterator.
  • System time and date: QDateTimeNow, QLocalTimeZone.
  • Timing: QStopWatch.
  • File system: QPath, QFileInfo, QDirectoryInfo.
  • IO: QMemoryStream, QBinaryStreamReader.
  • Data types: SQTypeExtensions, SQAnyTypeToStringConverter.
  • Logging: SQInternalLogger.
  • Memory allocation: QLinearAllocator.
  • Others: QDelegate, QUri.

Completed pending development and feature extension

  • Containers: QFixedArray, QList.
  • Iterators: QArrayIterator.
  • Date and time: QDateTime, QTimespan.
  • Data types: QStringUnicode, SQInteger.
  • Memory allocation: QPoolAllocator.

Improvements

  • Assertions are now logged, including information about the line number and the file name. They have been also divided in three categories: errors, warnings and deprecations. Besides, they work with Unicode strings through QStringUnicode.
  • Some basic logging utilities that allow sending text from Common and Tools layers, which do not count with logging features (logging classes will be defined in System layer), to any external logging function. Currently, a static member function which sends the text to the active debug console is used by default.
  • Global new and delete operators have been overridden. Now any allocation can be traced.
  • Migration from Code::Blocks 13.12 to CodeLite 6.0.1. The main reason was the poor support of the C::B IDE on Mac OS. Besides, the Clang compiler (version 3.4) along with LLDB were used on Mac instead of GCC + GDB due to many installation problems and bugs (of GDB, mainly). All is much simpler this way and performs better.

 

Pending work

Classes

  • Threading: QThread, QMutex, QSharedMutex, QRecursiveMutex, QScopedExclusiveLock, QScopedSharedLock, QConditionVariable, QScopedLockPair.
  • Call stack tracing: QCallTrace, QCallStackTrace, QCallStackTracePlainTextFormatter, QCallStackTraceConsolePrinter, QCallStackTracer, QScopedCallTraceNotifier.
  • File system: QFile, QDirectory.
  • IO: QTextStreamReader, QBinaryStreamWriter, QTextStreamWriter, QFileStream.
  • Timing: QStopwatchEnclosed.
  • Others: QEvent, QAssertException.

General code improvements

  • Mechanism to enable/disable assertions by their type (error, warning or deprecation).
  • Mechanism to auto-detect the machine’s endianness.
  • Memory allocation tracing.
  • Adapting the code due to some changes in the naming conventions.
  • Performing some text replacements and adding other small features to some classes.

 

It’s time to update the project’s documentation, the road map and the class diagrams. The phase 3 will be planned during this month so it is likely to start on December.

Congratulations to the people who participated during this phase.

 

Phase 1 ends

We have ended this stage, and we have achieved to get one step closer to the upper level layers, we have reinforced the infrastructure, tested new ways of working and updated third-party software. Here you have a summary of what have been developed during this phase, for nearly four months, and other relevant events:

  • Unicode encoding support, through the class QStringUnicode, based on the ICU library. It can be alternated with the string class of the STL if only ASCII encoding is needed, through a compilation flag.
  • Calculation and management of dates and time tools, through QDateTime, QTimeSpan, QTimeZone and SQTimeZoneFactory classes.
  • Memory allocation optimization tools, through QPoolAllocator and QStackAllocator classes. Global 'new' operators overloads have been added too.
  • Data containers design, which implementation is still pending to be completed, through QFixedArray, QDynamicArray, QList, QBinarySearchTree and QNTree classes.
  • Introduction of new concepts in the engine's core, through QObject and QType classes.
  • Mac OS X support, it can be compiled in this platform using GCC.
  • Boost library update to version 1.55.0.
  • CodeBlocks projects updated to version 13.10.
  • Engine's lower layers redesign, Common layer introduced and Core layer moved.
  • Internal testing system improved.
  • Asserts improved.
  • Other minor refactorings.
  • The Test Automation Tool, which we use to automate the unit tests execution, has been improved to expedite the work of developing new tests. Now the results window is separated from the execution window.
  • Reward system, or collaborators ranking, introduced and tested by first time. 3 prizes have been given, 2 digital videogames and 1 physical book. On the march, this system was improved to reward also the effort of reviewing other team mate's code.
  • The team members Thund and AndersonJAG attended to RetroMadrid 2014, where they met in person by first time and represented the project.

It's important to emphasize that all the development has been documented, revised and tested (now we have more than 5.500 tests that cover 16 compilation configurations).

Congratulations to all who participated during this phase and have maintained the project alive. Now, let's go for the next phase!

More information

Project road map

Current status of the project

API reference documentation, till now

How to collaborate?

You can contact us via e-mail ( This email address is being protected from spambots. You need JavaScript enabled to view it. ) or Twitter (@QuimeraEngine). We'll make a written interview to know if the person is adequate to be part of the team.

To know more about what are we looking for, you can visit this section.

 

Second prize

Today finalizes the time limit for opting to the second prize of the collaborators ranking. The prize, chosen by poll at period's beginning, was Battlefield 3 for Origin or the book "Introduction to 3D Game Programming with Directx 11, by Frank D. Luna".

     ||      

And the winner has been Anderson JAG, developer, with 74 points over the minimum of 45, who has chosen the book.

http://ranking.quimeraengine.org/?prize=4

 

Congratulations! Enjoy it.

First prize

Today ends the time limit for opting to the first of many prizes to come, since our collaborator ranking was activated, which aims to reward symbolically Kinesis Team's members, who develops Quimera Engine. The prize, chosen by poll at period's beginning, was Dead Space 1.


And the winner has been Kiba Wolf, translator, with 55 points over the minimum of 50.

http://ranking.quimeraengine.org/?prize=2

 

Congratulations! Enjoy it.



Encouragement for the rest of the team, there will be many more opportunities. Now we have to think about which will be the next prize, that presumably will be given in late March.

Twitter