首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >增强大量对象的序列化和向量

增强大量对象的序列化和向量
EN

Stack Overflow用户
提问于 2013-05-21 02:17:29
回答 2查看 483关注 0票数 1

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

代码语言:javascript
运行
复制
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秒通常是反序列化发生的地方

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

代码语言:javascript
运行
复制
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字节或更多,所以有很多条目。

我能做些什么来优化它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-21 02:27:44

如果可能(例如,平台位排序不是问题),您可能希望将每个向量序列化为单个块,而不是一次一个VecN。我不会放弃你对原始浮点结构的良好使用。如果您的VecN类是POD类型(很可能),那么可以使用块中的按位序列化,并且建议这样做。

一些类似的东西(抱歉,如果它不是惯用的--你可以使用一个更简单的std算法):

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2013-05-21 02:23:27

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16655742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档