如果我是你,我会做以下事情:
- 如果碰撞文件真的很大,那么分块读取它,直到你得到你想要的。
- 使用内存池来存储块,以避免在新建/删除时产生堆碎片。
- 然后进行实际的碰撞测试。
如果您尝试保存数据,可以将它们保存为结构。
struct Triangle
{
float vertices[9]; // 3x3
int index;
};
如果结构的大小不同,那么它会变得更复杂一些。
struct Triangle
{
int prevOffset; // Offset to the beginning of the previous struct in bytes .. ie. 20 bytes
int nextOffset; // Offset at the beginning of the next struct
std::vector<float[3]> Vertices;
int index;
};
阅读:
int offset = 0;
char* m_Data; // Pointer to the contents of the file
Triangle *getTriangle(){
Triangle* tri = (Triangle*)( m_Data+offset );
offset = tri->Next;
return tri;
}
您在存储偏移量时将结构写为字节。
// Writing the pool
tri->next = ( (int)tri-(int)m_Data )+tri->Vertices.size()*4+16;
// For a 32bit system
// +12 for the ints (next/prev/id)
// *4 for the floats
这正是内存池链接它们的块头的方式。使用指向上一项和下一项的指针,以便您可以两种方式进行迭代。