增强许多对象的序列化和矢量

我使用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字节或更多,这样就有很多条目。

我可以做些什么来优化这个?


如果可能的话(例如平台位顺序不是问题),您可能想要将每个矢量作为一个单独的块而不是一次一个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));

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

链接地址: http://www.djcxy.com/p/45663.html

上一篇: Boost serialization and vector of lots of objects

下一篇: Caching responses with JSON