Xml2Bin: Конвертация xml в нативный для движка bin
От: IROV..  
Дата: 25.06.11 10:55
Оценка: :))
(Геймдев)

В свое время задолбали споры какой 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
я не волшебник, я только учусь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.