VBO из std :: vector & lt; MyClass * & gt; и правильные шаги

Мне интересно, как получить максимальную локальность данных и производительность для следующей проблемы без копия данных.

У меня есть 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 переменные. Как вы можете себе представить, трудно правильно установить шаги, поэтому я здесь, чтобы спросить, есть ли другие (портативные) решения этой проблемы.

(с. я уже прочитал пост VBOs с std :: vector но мой случай в основном другой, потому что у меня есть указатели, а также у меня есть другие переменные внутри класса.)

0

Решение

У меня есть указатели

Эти указатели бесполезны для OpenGL, так как они находятся в адресном пространстве клиента. Также OpenGL не разыменовывает указатели второго уровня.

и у меня также есть другие переменные внутри класса.

Ну, тогда не делай этого. Если вы передадите эти экземпляры классов в 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]; }

};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]