我目前正在开发2D地图编辑器。每个瓷砖都有一些属性,如位置,碰撞等等。当然,我也需要保存地图的列数和行数。
如果我可以保存地图并稍后再次加载它会很好。我想将地图保存为单独的.png文件和另一个文件中的约束(瓷砖的坐标,瓷砖的宽度等等)。为此,我尝试使用boost属性树,将地图保存到xml文件中。但这非常慢,xml有几千行文本。有谁知道我怎样才能接近这个?我从未做过任何严肃的文件保存/加载。
以下是我用于保存 map.xml的一些测试代码:
注意:tilemap是一个二维向量
的std ::矢量<的std ::矢量<平铺*> > m_map;
void TileMap::exportAsXML(std::string &filename)
{
boost::property_tree::ptree pt;
pt.put("map.filename", filename);
filename=filename+".xml";
pt.put("map.size.cols", m_cols);
pt.put("map.size.rows", m_rows);
pt.put("map.size.tile_width", m_tile_width);
pt.put("map.size.tile_height", m_tile_height);
int i=0;
BOOST_FOREACH( std::vector<Tile*> row, m_map )
{
BOOST_FOREACH( Tile* t, row )
{
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".posX", t->getProperty()->getPosX());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".posY", t->getProperty()->getPosY());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".blocks", t->getProperty()->getBlocks());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".width", t->getProperty()->getWidth());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".height", t->getProperty()->getHeight());
i++;
}
}
boost::property_tree::xml_writer_settings<char> settings('\t', 1);
write_xml(filename, pt, std::locale(), settings);
}
答案 0 :(得分:2)
如果xml太大,您可以尝试使用json格式保存文件。它比xml更紧凑,可能会节省一些线条。
如果这个解决方案不好,那么你必须编写自己的格式,文本或二进制文件,最快/最小的将是二进制格式。如果您不希望保存是可读的,并且您不需要对这些文件进行版本控制,那么二进制文件是最佳选择。我想你甚至可以找到一些二进制xml的库,所以你不必在你的代码中改变很多。
另一个选项是压缩xml文件。您可以集成zlib并压缩文件,然后保存。这将给出令人惊讶的格式,因为具有大量冗余的文本文件可以很好地压缩。
答案 1 :(得分:1)
您可以使用Boost Serialization。它是一个用于将数据结构序列化为光盘上的二进制格式的库。它不是人类可读的,但应该快速且节省空间。