【问题标题】:Boost serialization and vector of lots of objects提升大量对象的序列化和向量化
【发布时间】:2013-05-20 18:17:29
【问题描述】:

我正在使用 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,并且可以有很多 packagemeshes 需要反序列化。

我担心由于它是自定义对象的向量,我相信我会在 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 字节或更多,所以条目很多。

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

【问题讨论】:

    标签: c++ serialization boost


    【解决方案1】:

    如果可能(例如,平台位排序不是问题),您可能希望将每个向量序列化为一个块,而不是一次序列化一个 VecN。我不会放弃你对原始花车结构的良好使用。如果您的 VecN 类是 POD 类型(很可能),则可以并推荐按位序列化块。

    类似这样的事情(如果它不是惯用的,请道歉 - 您可以使用更简单的 std 算法):

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

    【讨论】:

    • 我该怎么做呢?网上有参考吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 2021-06-12
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多