4

我试图防止循环所有三角形并将每个三角形添加到 btTriangleMesh。(只有加载要快,保存速度可以忽略。)

那么从文件中加载碰撞数据的最快方法是什么。这两个怎么样:

  1. 保存 Vertex(bt3Vector) & Index(DWORD) 数组并在加载时调整 btTriangleMesh 的大小并立即设置数据。

  2. 使用 serializeSingleShape() 保存和加载 ReadBulletSample 之类的东西(或初始化一个新的 btDynamicsWorld,使用 BulletWorldImporter 读取文件,获取碰撞对象并清理 btDynamicsWorld var)

如果还有其他方法,请告诉我。模型几何具有以下两个缓冲区:

Vertex = vector<float[3]>
Index = vector<DWORD>
4

2 回答 2

4

我使用了子弹的序列化代码。我相信它已经过优化,看不出你应该重新发明它的理由。

bt_col- 是子弹碰撞对象

    int maxSerializeBufferSize = 1024*1024*5;
    btDefaultSerializer*    serializer = new btDefaultSerializer(maxSerializeBufferSize);

    serializer->startSerialization();
    bt_col->serializeSingleShape(serializer);
    serializer->finishSerialization();

    FILE* file = fopen(filename, "wb");
    fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1, file);
    fclose(file);

    delete serializer;
于 2012-09-01T23:35:26.643 回答
2

如果我是你,我会做以下事情:

  • 如果碰撞文件真的很大,那么分块读取它,直到你得到你想要的。
  • 使用内存池来存储块,以避免在新建/删除时产生堆碎片。
  • 然后进行实际的碰撞测试。

如果您尝试保存数据,可以将它们保存为结构。

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

这正是内存池链接它们的块头的方式。使用指向上一项和下一项的指针,以便您可以两种方式进行迭代

于 2012-09-01T12:47:03.350 回答