2013-06-26 4 views
1

Я делаю игру и формат файла ресурсов для загрузки 3D-моделей, с текстурами и сетками и т.д. определены следующим образом:подталкивания сериализации и файл IO крайне медленно

/* PackageHeader definition */ 
    struct PackageHeader 
    { 
     std::string mSignature; 
     uint8_t mMajorVersion; 
     uint8_t mMinorVersion; 


     PackageHeader(); 
    }; 

    /* PackageMesh definition */ 
    struct PackageMesh 
    { 
     std::vector<Vec3> mVertexData; 
     std::vector<Vec3> mNormalData; 
     std::vector<Vec2> mTexCoordsData; 
     std::vector<uint32_t> mIndiceData; 
     uint16_t mMaterialIndex; 
     bool mHasMaterial; 


     PackageMesh(); 
    }; 

    /* PackageTexture definition */ 
    struct PackageTexture 
    { 
     std::string mName; 
     std::vector<uint8_t> mTextureData; 
     uint32_t mTextureWidth;   // width/height in pixels 
     uint32_t mTextureHeight; 
     ITexture::TextureFormat mTextureFormat; 
     ITexture::TextureType mTextureType; 


     PackageTexture(); 
    }; 

    /* PackageMaterial definition */ 
    struct PackageMaterial 
    { 
     std::string mName; 
     PackageTexture mDiffuseTexture; 
     Vec3 mDiffuseColor; 
     Vec3 mAmbientColor; 
     Vec3 mSpecularColor; 
     Vec3 mEmissiveColor; 


     PackageMaterial(); 
    }; 

    /* PackageModel definition */ 
    struct PackageModel 
    { 
     std::string mName; 
     std::vector<PackageModel> mChildren; 
     std::vector<PackageMesh> mMeshes; 
     Mat4 mTransform; 


     PackageModel(); 
    }; 

    /* JonsPackage definition */ 
    struct JonsPackage 
    { 
     PackageHeader mHeader; 
     std::vector<PackageModel> mModels; 
     std::vector<PackageMaterial> mMaterials; 


     JonsPackage(); 
    }; 

Я использую Boost, сериализации для сохранения/load из файловой системы, которая до сих пор была абсолютно интересной, поскольку для этого почти не требуется кода.

Однако после импорта некоторых 3D-моделей, а затем попробуйте загрузить его снова, время загрузки огромно; для загрузки из файловой системы требуется почти 30 секунд, а затем для десериализации.

Это код для сериализации/десериализации:

JonsPackagePtr ReadJonsPkg(const std::string& jonsPkgName) 
    { 
     std::ifstream jonsPkgStream(jonsPkgName.c_str(), std::ios::in | std::ios::binary);  // TODO: support opening of older resource packages 
     JonsPackagePtr pkg(HeapAllocator::GetDefaultHeapAllocator().AllocateObject<JonsPackage>(), boost::bind(&HeapAllocator::DeallocateObject<JonsPackage>, &HeapAllocator::GetDefaultHeapAllocator(), _1)); 

     if (jonsPkgStream && jonsPkgStream.good() && jonsPkgStream.is_open()) 
     { 
      std::stringstream buf(std::ios_base::binary | std::ios_base::in | std::ios_base::out); 
      buf << jonsPkgStream.rdbuf(); 
      buf.seekg(0); 
      jonsPkgStream.close(); 

      boost::archive::binary_iarchive iar(buf); 

      iar >> (*pkg.get()); 
     } 

     jonsPkgStream.close(); 

     return pkg; 
    } 

    bool WriteJonsPkg(const std::string& jonsPkgName, const JonsPackagePtr pkg) 
    { 
     std::ofstream outStream(jonsPkgName.c_str(), std::ios::out | std::ios::binary | std::ios::trunc); 
     bool ret = false; 

     if (outStream.is_open()) 
     { 
      boost::archive::binary_oarchive oar(outStream); 
      oar << (*pkg.get()); 

      ret = true; 
     } 

     return ret; 
    } 

Вот образ Analys производительности VS2012: http://postimg.org/image/smdsnu5gl/

Файл ресурсов Я использую около 26 Мб на диске, содержит 3 пакета и 14 текстур пакетов. Что я могу сделать по этому поводу, мой дизайн формата файлов является тупиком?

ответ

1

Это слишком много времени только для 26 МБ. Я видел, что вы используете это в VS2012. Я рекомендую вам попробовать и запустить программу вне среды VS2012, просто щелкнув ваш .exe непосредственно из проводника файлов.

Также вам не нужно загружать весь ваш файл в память, чтобы десериализировать его содержимое.

Вы можете попробовать следующий код:

std::ifstream file("path.dat"); 
boost::archive::binary_iarchive iar(file); 
+0

Запуск вне VS сделал трюк для меня с той же проблемой. Он все еще поддерживал отладчик даже в выпуске, которого я не понимал. – bossbarber