c++ - 保存二维 map 的好方法是什么

标签 c++ file boost file-io

我目前正在开发 2D map 编辑器。每个图 block 都有一些属性,比如位置、碰撞等等。当然,我还需要保存 map 的列数和行数。

如果我可以保存 map 并稍后再次加载它,那就太好了。我想将 map 保存为单独的 .png 文件,并将约束保存在另一个文件中(瓷砖的坐标、瓷砖的宽度等...)。为此,我尝试使用 boost 属性树,将 map 保存到 xml 文件中。但这真的很慢,而且 xml 有几千行文本。有谁知道我如何解决这个问题的更好方法?我从来没有做过任何严肃的文件保存/加载。

这是我用来保存 map.xml 的一些测试代码:

注意:tilemap是一个二维 vector

std::vector< std::vector< Tile* > > 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);
}

最佳答案

如果 xml 太大那么你可以尝试使用 json格式来保存文件。它比 xml 更紧凑,可能会为您节省一些行数。

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

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

关于c++ - 保存二维 map 的好方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20270008/

相关文章:

c++ - STL 中的错误代码是否有任何异常?

c++ - 是否可以在 Boost 库中禁用异常和 RTTI?

c++ - 亚信 : Prevent asynchronous client from being deleted?

c++ - 使用 opengl 和抗锯齿投影图像

C++迭代器到集合的最后一个元素

c++ - 如何在exe文件夹中不包含纹理

python - 在 Python 中,有没有比较简洁的方法来比较两个文本文件的内容是否相同?

c++ - 在变量中切换文件 (cpp)

python - 多个文件中的单词匹配

c++ - 是否可以在 CLI 解析完成后添加 boost program_options 和参数?