增强许多对象的序列化和矢量
我使用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