(Геймдев)
В свое время задолбали споры какой xml реадер быстрее.
Вот гдето полгода-год назад написал такую штуку.
Сейчас вот начал ее обобщать, и выносить как отдельную либу.
Зачем она нужна?
Для девелопминга выгодно иметь XML фаил, в котором настраивать всякие параметры.
Для движка XML фаил это головная боль, ему подавай "адаптированые байты".
что предлагаеться, скомпилировать xml в bin, положить рядом, движек будет смотреть если у нас даты изменения xml и bin разняться, он будет переконверчивать xml -> bin.
В мастер релизе, вообще "отключаем знание" того что xml есть и ищем только bin. Предварительно билдером, перегнали все xml в bin.
Такая технологоия уже больше полугода применяеться в моем движке, и пока небыло никаких нариканий.
Прошу коментировать, и высказывать пожелания, постараюсь адаптировать для нужд.
=============================================================
Это альфа версия, но вроде рабочая.
http://sourceforge.net/projects/xml2bin/
svn —
https://xml2bin.svn.sourceforge.net/svnroot/xml2bin
Как устроен, мы пишем Protocol.xml
<Protocol>
<Node NodeType="Node" AttrName="Name" AttrType="std::string"/>
<Node NodeType="Node" AttrName="Coord" AttrType="vec2f"/>
<Node NodeType="Node" AttrName="Enable" AttrType="bool"/>
</Protocol>
который описыват
<Node Name = "bla" Coord = "1.0; 2.0" Enable = "1"/>
<Node Name = "bla1" Coord = "123.0; 23.0" Enable = "0"/>
<Node Name = "bla2" Coord = "17.0; 24.0" Enable = "1"/>
<Node Name = "bla3" Coord = "16.0; 25.0" Enable = "1"/>
*** Ограничение — xml вида, только атрибуты
с помощью xml2bin мы создаем X2BProtocol.h (X2B::writeHeader) который будет помогать связывать xml ресурсы с внутреним представлением в игре.
# pragma once
namespace X2BProtocol
{
static const int version = 1308932801;
struct Node
{
static const int id = 5;
};
struct Node_Coord
{
static const int id = 4;
typedef vec2f Type;
};
struct Node_Enable
{
static const int id = 6;
typedef bool Type;
};
struct Node_Name
{
static const int id = 2;
typedef std::string Type;
};
}
После чего мы настраиваем сериализации для конвертации xml в bin:
X2B::addSerialization( protocol, "vec2f", &s_writeFloat2 );
static bool s_writeFloat2( X2B::WriteBinaryInterface * _buffer, const char * _str )
{
float value[2];
if( sscanf_s( _str, "%f;%f", &value[0], &value[1] ) != 2 )
{
return false;
}
writeBuffer( _buffer, value, 2 );
return true;
}
Ну и запускаем конвертацию через X2B::writeBinary
На выходе мы получим bin адаптированый к нашему движку.
Перейдем к чтению.
Для этого нам нужно заинклудить сформировавшийся X2BProtocol
загрузить bin
и распарсить с помощью X2B::BinParser, он работает по принцыпу SAX парсера, пример есть в sandbox_parser.cpp