下面是我的代码。
Point3* LASReader::GetPoint(int index)
{
if (m_index == m_header.NPointRecords)
return 0;
stream.seekg(GetOffset(index));
m_index++;
LASPOINTF1 p0;
LASPOINTF1 p1;
LASPOINTF2 p2;
LASPOINTF3 p3;
LASPOINTF4 p4;
LASPOINTF5 p5;
Vector3 position;
// Get the point values
switch (m_header.PointDataFormat)
{
case 0:
stream.read((char *)&p0, sizeof(LASPOINTF0));
position = Vector3(p0.X, p0.Y, p0.Z);
break;
case 1:
stream.read((char *)&p1, sizeof(LASPOINTF1));
position = Vector3(p1.X, p1.Y, p1.Z);
break;
case 2:
stream.read((char *)&p2, sizeof(LASPOINTF2));
position = Vector3(p2.X, p2.Y, p2.Z);
break;
case 3:
stream.read((char *)&p3, sizeof(LASPOINTF3));
position = Vector3(p3.X, p3.Y, p3.Z);
break;
case 4:
stream.read((char *)&p4, sizeof(LASPOINTF4));
position = Vector3(p4.X, p4.Y, p4.Z);
break;
case 5:
stream.read((char *)&p5, sizeof(LASPOINTF5));
position = Vector3(p5.X, p5.Y, p5.Z);
break;
}
// Calculate the real coordinates of the point
position = position * *m_scale + *m_offset;
return new Point3(position.GetX(), position.GetY(), position.GetZ());
}
// Main
int main()
{
VertexPosColF* pcmVertices = new VertexPosColF[reader->GetHeader().NPointRecords];
while (!reader->AllPointsRead())
{
pcmVertices[i].Position = reader->GetPoint()->GetPosition()->GetD3DXVECTOR3();
pcmVertices[i].Color = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f);
i++;
}
}
这是我的问题。我正在使用 GetFromFile() 之类的方法读取文件(我知道这还不够,但它只是一个示例),也许我称之为百万次,所以 if else 条件运行百万次。我希望在调用方法之前调用它一次。我该如何处理不同的类型?我认为 switch case 块不能被调用百万次。
我的第二个问题是当我调用 GetFromFile 方法一百万次时,有很多大约 4gbs 的内存分配。在我的原始代码 A、B、... 结构中,总大小接近 200-300 字节,当我调用 GetFromFile 方法 20.000.000 次时,我可以清楚地看到有 5GB 的内存分配。为什么?当方法结束时,结构 A a 和 B b 是否不能从内存中释放?它们不是指针,所以我不能手动删除。
它是一个包含使用 DirectX 渲染的点云的 las 文件。编辑:更新的代码和解释