1

我正在使用 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 字节或更多,所以有很多条目。

我能做些什么来优化这个?

4

2 回答 2

2

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

于 2013-05-20T18:23:27.277 回答
2

如果可能(例如,平台位排序不是问题),您可能希望将每个向量序列化为一个块,而不是一次序列化一个 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-20T18:27:43.690 回答