2013-11-28 2 views
0

В настоящее время я разрабатываю 2D-редактор карт. Каждая плитка имеет некоторые свойства, такие как положение, столкновение и некоторые другие. Конечно, мне нужно также сохранить количество столбцов и строк карты.Что такое хороший способ сохранить 2D-карту

Было бы хорошо, если бы я мог сохранить карту и загрузить ее позже. Я думал о сохранении карты как отдельного файла .png и ограничений в другом файле (координаты плиток, ширина плитки и т. Д.). Для этого я попытался использовать дерево свойств boost, чтобы сохранить карту в xml-файле. Но это очень медленно, и xml получает несколько тысяч строк текста. Кто-нибудь знает, как я могу подойти к этому? Я никогда не делал никаких серьезных сбережений/загрузки файлов.

Вот некоторые тестового кода я использовал для сохранить map.xml:

Примечание: Приведенный tilemap представляет собой 2 мерный вектор

станд :: вектор < станд :: вектор < плитки *>> 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

вы можете попробовать формат josn, он более компактный, чем xml, если не идти, двоичный – Raxvan

ответ

2

Если XML является слишком большим, то вы можете попробовать использовать формат json, чтобы сохранить файл. Это более компактно, чем xml, и может сэкономить вам несколько строк.

Если это решение не очень хорошо, тогда вы должны написать свой собственный формат, текст или двоичный файл, самым быстрым/наименьшим будет бинарный формат. Если вы не хотите, чтобы сохранение было доступно для чтения, и вам не нужно управлять версиями в этих файлах, тогда двоичный файл является лучшим выбором. Я думаю, что вы даже можете найти библиотеку для двоичного xml, чтобы вам не приходилось много менять в коде.

Также еще один вариант - закрепить файл xml. Вы можете интегрировать zlib и сжать файл, а затем сохранить его. Это даст удивительный формат, потому что текстовые файлы с большим количеством избыточности могут быть сжаты очень хорошо.

1

Вы можете использовать Boost Serialization. Это библиотека для сериализации структур данных в двоичном формате на диске. Он не читается человеком, но должен быть быстрым и эффективным по пространству.

Смежные вопросы