VB的std :: vector <myclass *>和strides </myclass *>

时间:2013-01-31 23:00:10

标签: c++ opengl stl vbo

我想知道如何获得以下问题没有数据副本的最大数据位置和性能。

我有一个std :: vector&lt; MyClass *&gt;其中MyClass类似于

class MyClass
{
public:
    MyClass(int n,double px,double py,double pz)
    {
        someField=n;
        x=px;
        y=py;
        z=pz;
        anotherField=100;
        anotherUnusefulField=-10.0;
    }

    int someField;
    int anotherField;


    double x;
    double y;
    double z;
    double anotherUnusefulField;
};

std::vector<MyClass*> myClassVector;
// add some values and set x,y,z

for (std::vector<MyClass*>::iterator iter = myClassVector.begin(); iter!=myClassVector.end();++iter)
{
    MyClass *tmp = *iter;
    tmp->x+=1.0;
    tmp->y+=2.0;
    tmp->z+=3.0;
}

我经常迭代这些数据,我也想强制数据局部性。指向MyClass的指针中的数据应该发送到OpenGL顶点数组,其中顶点由x,y,z变量确定 ONLY 。你可能想象很难正确设置步幅,所以我在这里询问是否还有其他(便携式)解决方案。

(p.s。我已经阅读了帖子VBOs with std::vector,但我的情况基本上不同,因为我有指针,我在课堂上也有其他变量。)

1 个答案:

答案 0 :(得分:1)

  

我有指针

这些指针对OpenGL毫无用处,因为它们位于客户端地址空间中。此外,OpenGL不会取消引用二级指针。

  

我在课堂上也有其他变量。

那么,不要这样做。如果您将这些类实例传递给OpenGL,则会复制大量无用的数据。我建议你只需将索引存储到类成员中紧密打包的std :: vector或数组中,并引用vector / array本身。您可以使用getter / setter / referencer成员函数来抽象出对向量的访问,即

class …
{

    // …
    std::vector<v_t> *v;
    size_t index_v;
    x_t getX() const { return (*v)[index_v]; }
    x_t setX(x_t x) { return (*v)[index_v] = x;}
    x_t &x() { return (*v)[index_v]; }

};