2013-01-31 21 views
0

我想知道如何獲得最大的數據局部性和性能爲以下問題沒有數據拷貝。VBO的標準::矢量<MyClass*>和正確的步幅

我有一個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的頂點數組,其中,所述頂點ONLYx,y,z變量確定。正如你可能想象的很難正確設定步伐,所以我在這裏問是否有其他(便攜式)解決方案來解決這個問題。

(PS我已經閱讀後VBOs with std::vector但我的情況是根本不同的,因爲我有一個指針,我也有類中其他變量。)

+0

哪部分數據拷貝?你能詳細說明嗎? – billz

+1

如果'MyClass'只包含成員變量像你這樣的說明,然後直接將它們存儲在一個向量會令他們最友好的數據局部性。隨着指針的方法,你需要在這裏,我懷疑你是在顛簸的CPU緩存,更不用說如何無用的數據是OpenGL的。 – radical7

+0

什麼是「VBO」? –

回答

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]; } 

}; 
相關問題