我正在使用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字节或更多,所以有很多条目。
我能做些什么来优化它呢?
发布于 2013-05-21 02:27:44
如果可能(例如,平台位排序不是问题),您可能希望将每个向量序列化为单个块,而不是一次一个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));发布于 2013-05-21 02:23:27
很有可能实际I/O的成本将大大超过额外构造函数的成本,以至于你永远不会注意到。唯一确定的方法是在您的应用程序中尝试并分析它。
https://stackoverflow.com/questions/16655742
复制相似问题