什么是保存2D地图的好方法

时间:2013-11-28 15:39:29

标签: c++ file boost file-io

我目前正在开发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);
}

2 个答案:

答案 0 :(得分:2)

如果xml太大,您可以尝试使用json格式保存文件。它比xml更紧凑,可能会节省一些线条。

如果这个解决方案不好,那么你必须编写自己的格式,文本或二进制文件,最快/最小的将是二进制格式。如果您不希望保存是可读的,并且您不需要对这些文件进行版本控制,那么二进制文件是最佳选择。我想你甚至可以找到一些二进制xml的库,所以你不必在你的代码中改变很多。

另一个选项是压缩xml文件。您可以集成zlib并压缩文件,然后保存。这将给出令人惊讶的格式,因为具有大量冗余的文本文件可以很好地压缩。

答案 1 :(得分:1)

您可以使用Boost Serialization。它是一个用于将数据结构序列化为光盘上的二进制格式的库。它不是人类可读的,但应该快速且节省空间。

相关问题