Для описания игровых ресурсов, локализаций и настроек игры я использую XML. Поэтому в движке реализован класс для работы с ним. Он позволяет получить доступ к произвольной ноде и к произвольному атрибуту ноды.
Интерфейс класса выглядит приблизительно так:
class ageXmlNode final { public: ageXmlNode* first(const char* name = nullptr) const; ageXmlNode* next(const char* name = nullptr) const; template<typename T> T getValue(const char* name, const T& def) const; };
Что позволяет прочесть значение любого атрибута, представив его как нужный тип – int, float, struct/class…
В качестве парсера я долгие годы использовал стабильный и широкоиспользуемый TinyXML.
Но пришло время заменить TinyXML на что-то более шустрое. Выбирал между TinyXML-2, pugixml и RapidXml.
Согласно бенчмарков pugixml, он самый быстрый из протестированных автором. Следом идет RapidXml и с большим отставанием за ним идет TinyXML-2.
Я не стал доверять бенчмаркам автора pugixml и провел свои тесты на том наборе данных, которые использую я в реальных проектах. И в моем случае pugixml оказался не столь быстр. Поэтому свой выбор остановил на проверенном ранее решении в лице TinyXML-2.
Результат переходна на TinyXML-2 я доволен – время парсинга XML сократилось в 5-10 раз.