提升序列化和许多对象的向量

时间:2013-05-20 18:17:29

标签: c++ serialization boost

我正在使用boost序列化来序列化/反序列化3d模型网格,如下所示:

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();
};

现在每个载体可以包含数千个Vec3,并且可以有很多包裹用于去马赛克。

我担心因为它是自定义对象的向量,我相信我会花很多时间在Vec3 / Vec2的构造函数中,这可能会影响性能 - 这是真的吗?将它们全部存储为花车会更快吗?

编辑:所以加载一个相当复杂的模型及其纹理等需要5-10秒左右,所以我做了一些分析......

http://i43.tinypic.com/xqansy.png

您可以看到前5-10秒通常是反序列化发生的地方

我相信杀手实际上是反序列化纹理结构

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();
};

每个纹理可以是大约200k字节或更多,因此有很多条目。

我可以做些什么来优化它?

2 个答案:

答案 0 :(得分:2)

很有可能实际I / O的成本将大大超过您永远不会注意到的额外构造函数的成本。唯一可以确定的方法是在您的应用程序中试用它并对其进行分析。

答案 1 :(得分:2)

如果可能(例如,平台位排序不是问题),您可能希望将每个向量序列化为单个块,而不是一次一个VecN。我不会放弃你对原始浮子的结构的好用。如果您的VecN类是POD类型(最有可能),可以建议使用块中的逐位序列化。

这些方面的东西(如果它不是惯用的道歉 - 可以使用更简单的标准算法):

struct Vec3
{
    float x;
    float y;
    float z;
};

vector<Vec3> mesh;
Vec3 v0 = {1,2,3};
Vec3 v1 = {4,5,6};
Vec3 v2 = {7,8,9};
mesh.reserve(3);
mesh.push_back(v0);
mesh.push_back(v1);
mesh.push_back(v2);
std::stringstream ss;
auto ptr = mesh.data();
auto count = mesh.size();
ss << count;
ss.write((char*)ptr, count * sizeof(Vec3));
ss.seekg(0);
mesh.clear();
ss >> count;
mesh.resize(count);
ptr = mesh.data();
ss.read((char*)ptr, count * sizeof(Vec3));