2013-06-26 57 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(); 
    }; 

我使用升压序列化保存/从文件系统加载,直到现在一直是绝对令人惊叹的,因为它几乎不需要代码来完成它。

但是进口一些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; 
    } 

这里是VS2012性能analys的图像: http://postimg.org/image/smdsnu5gl/

我使用的资源文件是上盘约26 MB,包含3个封装模型和14个封装纹理。我能做些什么呢,我的文件格式设计是死胡同吗?

回答

1

这只是26MB的时间太多。我看到你在VS2012中运行。我建议您尝试在VS2012环境之外发布并运行该程序,只需直接从文件资源管理器中单击您的.exe即可。

而且你不需要加载你的整个文件在内存中进行反序列化的内容。

您可以用下面的代码试试:

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

VS的运行之外的伎俩,我同样的问题。它仍然附加调试器,即使在我没有意识到的发布中。 – bossbarber