我正在使用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字节或更多,因此有很多条目。
我可以做些什么来优化它?
答案 0 :(得分:2)
很有可能实际I / O的成本将大大超过您永远不会注意到的额外构造函数的成本。唯一可以确定的方法是在您的应用程序中试用它并对其进行分析。
答案 1 :(得分:2)
如果可能(例如,平台位排序不是问题),您可能希望将每个向量序列化为单个块,而不是一次一个VecN。我不会放弃你对原始浮子的结构的好用。如果您的VecN类是POD类型(最有可能),可以建议使用块中的逐位序列化。
这些方面的东西(如果它不是惯用的道歉 - 可以使用更简单的标准算法):
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));