Мне интересно, как получить максимальную локальность данных и производительность для следующей проблемы без копия данных.
У меня есть 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 но мой случай в основном другой, потому что у меня есть указатели, а также у меня есть другие переменные внутри класса.)
У меня есть указатели
Эти указатели бесполезны для 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]; }
};
Других решений пока нет …