繁体   English   中英

在不同时间访问C ++向量元素是不同的

[英]C++ vector element is different when accessed at different times

我正在使用Eclipse CDT在Ubuntu 9.04上使用SDL和OpenGL开发3D游戏。 我有一个类可以将每种类型的网格数据保存在矢量中。 例如顶点,法线,UVcoord(纹理坐标)以及面向量。 每个面孔都有3个int向量,这些向量保存着指向其他数据的索引。 到目前为止,我的游戏在以良好的速率进行渲染方面一直表现良好。 但是话又说回来,出于测试目的,我在两个对象之间只有不到一百个顶点。

访问此数据的循环如下所示:

void RenderFace(oFace face)
{
    /*
    * More Stuff
    */

    oVertice gvert;
    oUVcoord tvert;
    oNormal nvert;

    for (unsigned int fvIndex = 0; fvIndex < face.GeoVerts.size(); fvIndex++)
    {
        gvert = obj.TheMesh.GetVertice(face.GeoVerts[fvIndex] - 1);
        tvert = obj.TheMesh.GetUVcoord(face.UV_Verts[fvIndex] - 1);
        nvert = obj.TheMesh.GetNormal(face.NrmVerts[fvIndex] - 1);

        glNormal3f(nvert.X, nvert.Y, nvert.Z);
        glTexCoord2f(tvert.U, tvert.V);
        glVertex3f(scale * gvert.X, scale * gvert.Y, scale * gvert.Z);
    }

    /*
    *  More Stuff
    */
} 

有一个循环调用renderFace()函数,其中包括上述for循环。 减去一是因为对Wavefront .obj文件进行了1​​索引(而不是c ++ 0索引)。 无论如何,我发现一旦您拥有约3万张面孔,对glVertex3f()所有此类调用都会使游戏速度降低至约10 FPS。 我不允许的 因此,我了解了顶点数组,该数组需要指向数组的指针。 按照NeHe教程的示例,我继续使用oVertice类和其他类。 它们只是floats x,y,z或u,v。因此,我在OnLoad()函数中添加了与上面相同的函数,以构建只是“ oVertice* ”等类似的数组。

这是代码:

bool oEntity::OnLoad(std::string FileName)
{
    if (!obj.OnLoad(FileName))
    {
        return false;
    }

    unsigned int flsize = obj.TheMesh.GetFaceListSize();

    obj.TheMesh.VertListPointer = new oVertice[flsize];
    obj.TheMesh.UVlistPointer = new oUVcoord[flsize];
    obj.TheMesh.NormListPointer = new oNormal[flsize];

    oFace face = obj.TheMesh.GetFace(0);
    oVertice gvert;
    oUVcoord tvert;
    oNormal nvert;
    unsigned int counter = 0;
    unsigned int temp = 0;

    for (unsigned int flIndex = 0; flIndex < obj.TheMesh.GetFaceListSize(); flIndex++)
    {
        face = obj.TheMesh.GetFace(flIndex);

        for (unsigned int fvIndex = 0; fvIndex < face.GeoVerts.size(); fvIndex++)
        {
            temp = face.GeoVerts[fvIndex];
            gvert = obj.TheMesh.GetVertice(face.GeoVerts[fvIndex] - 1);

            temp = face.UV_Verts[fvIndex];
            tvert = obj.TheMesh.GetUVcoord(face.UV_Verts[fvIndex] - 1);

            temp = face.NrmVerts[fvIndex];
            nvert = obj.TheMesh.GetNormal(face.NrmVerts[fvIndex] - 1);

            obj.TheMesh.VertListPointer[counter].X = gvert.X;
            obj.TheMesh.VertListPointer[counter].Y = gvert.Y;
            obj.TheMesh.VertListPointer[counter].Z = gvert.Z;

            obj.TheMesh.UVlistPointer[counter].U = tvert.U;
            obj.TheMesh.UVlistPointer[counter].V = tvert.V;

            obj.TheMesh.NormListPointer[counter].X = nvert.X;
            obj.TheMesh.NormListPointer[counter].Y = nvert.Y;
            obj.TheMesh.NormListPointer[counter].Z = nvert.Z;

            counter++;
        }
    }

    return true;
}

unsigned int temp变量用于调试。 显然,我没有oFace的默认构造函数,该构造函数没有要初始化的内容。 无论如何,如您所见,它几乎是完全相同的例程。 仅将数据添加到三个数组中,而不是调用gl函数。

这是踢球者:

我正在加载由三角形制成的典型立方体。

当我从RenderFace()函数访问UV_Verts矢量的元素16(索引为0)时,得到12。

但是,当我从OnLoad()函数访问相同UV_Verts向量的元素16(索引为0的元素)时,我得到的信息类似于3045472189

我感到很困惑。

有谁知道是什么原因造成的? 如果可以,该如何解决?

一种可能的原因可能是您正在创建大小为flsize数组:

obj.TheMesh.VertListPointer = new oVertice[flsize];
obj.TheMesh.UVlistPointer = new oUVcoord[flsize];
obj.TheMesh.NormListPointer = new oNormal[flsize];

但使用索引最大为flsize * face.GeoVerts.size

for (...; flIndex < obj.TheMesh.GetFaceListSize(); ...) { // flsize = GetFaceListSize
  for (...; fvIndex < face.GeoVerts.size(); ...) {
    ...
    obj.TheMesh.UVlistPointer[counter].U = ...;
    ...
    counter++;
  }
}

所以你的数组创建代码实际上应该更像

obj.TheMesh.VertListPointer = new oVertice[flsize * face.GeoVerts.size()];
obj.TheMesh.UVlistPointer = new oUVcoord[flsize * face.GeoVerts.size()];
obj.TheMesh.NormListPointer = new oNormal[flsize * face.GeoVerts.size()];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM