小编Kim*_*rak的帖子

函数返回后指向无效内容的指针

我在返回这个 const 指针时遇到了问题。使用调试器向我展示了场景已正确导入并存储在可变场景中。返回scene后,scene指向的内容丢失,调用loadData()的类无法访问。

const aiScene* IOHandler::loadData(const std::string& pFile){
    Assimp::Importer importer;

    const aiScene* scene = importer.ReadFile(pFile,
    aiProcess_CalcTangentSpace      |
    aiProcess_Triangulate           |
    aiProcess_JoinIdenticalVertices |
    aiProcess_SortByPType);

    return scene;
}
Run Code Online (Sandbox Code Playgroud)

Importer并且aiScene(struct)是assimp库的一部分,不能修改)

我假设场景存储在堆栈中,返回调用重置堆栈指针并且内容丢失。如何在c++中处理这样的问题?

c++ assimp

2
推荐指数
1
解决办法
579
查看次数

填充unordered_set太慢了

我们有一个给定的3D网格,我们试图消除相同的顶点.为此我们使用一个自定义的结构,包含顶点的坐标和相应的法线.

    struct vertice
    {
        float p1,p2,p3,n1,n2,n3;

        bool operator == (const vertice& vert) const
        {
            return (p1 == vert.p1 && p2 == vert.p2 && p3 == vert.p3);
        }
    };
Run Code Online (Sandbox Code Playgroud)

在用数据填充顶点之后,将其添加到unordered_set以删除重复项.

    struct hashVertice
    {
        size_t operator () (const vertice& vert) const
        {
            return(7*vert.p1 + 13*vert.p2 + 11*vert.p3);
        }
    };

    std::unordered_set<vertice,hashVertice> verticesSet;

    vertice vert;

    while(i<(scene->mMeshes[0]->mNumVertices)){

            vert.p1 = (float)scene->mMeshes[0]->mVertices[i].x;
            vert.p2 = (float)scene->mMeshes[0]->mVertices[i].y;
            vert.p3 = (float)scene->mMeshes[0]->mVertices[i].z;

            vert.n1 = (float)scene->mMeshes[0]->mNormals[i].x;
            vert.n2 = (float)scene->mMeshes[0]->mNormals[i].y;
            vert.n3 = (float)scene->mMeshes[0]->mNormals[i].z;

            verticesSet.insert(vert);

            i = i+1;
    }
Run Code Online (Sandbox Code Playgroud)

我们发现它对于像3.000.000顶点这样的数据量来说太慢了.即使运行15分钟后程序也没有完成.是否存在我们没有看到的瓶颈,或者是否有更好的数据结构用于此类任务?

c++ performance unordered-set

1
推荐指数
1
解决办法
1237
查看次数

标签 统计

c++ ×2

assimp ×1

performance ×1

unordered-set ×1