0

次の問題に対して、データのコピーなしでデータの局所性とパフォーマンスを最大限に引き出す方法を考えています。

私は std::vector< MyClass* > を持っていますが、どこ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ご想像のとおり、ストライドを正しく設定するのは難しいため、この問題に対する他の (移植可能な) 解決策があるかどうかを尋ねるためにここにいます。

(ps std::vector を使用して投稿 VBO を既に読んだことがありますが、ポインターがあり、クラス内に他の変数があるため、私の場合は基本的に異なります。)

4

1 に答える 1

1

ポインタがあります

これらのポインタはクライアントのアドレス空間にあるため、OpenGLには役に立ちません。また、OpenGLは第2レベルのポインターを逆参照しません。

また、クラス内には他の変数もあります。

さて、これをしないでください。これらのクラスインスタンスをOpenGLに渡すと、多くの役に立たないデータがコピーされます。クラスメンバーの密集したstd::vectorまたは配列にインデックスを格納し、ベクトル/配列自体への参照を格納することをお勧めします。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]; }

};
于 2013-01-31T23:15:18.840 に答える