Если вы использовали Box2d, вы знакомы с настройкой свойства b2Body->userData
, которое затем используется для обновления отрисованных координат формы x, y:
// Physics update:
int32 velocityIterations = 6;
int32 positionIterations = 2;
world->Step(timeDelta, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) {
id obj = (id)b->GetUserData();
if ((obj != NULL)) {
Shape *s = (MyType*)obj;
CGPoint newCentre = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
[s drawAt:newCentre];
}
}
Концептуально процедура рендеринга для этого потока данных проста: создайте класс Shape
для представления каждого тела, добавьте метод drawAt
, который использует OpenGL ES 2.0 для визуализации всех желаемых вершин (с атрибутами) для тела, и пусть этот класс перерисовывается при изменении его координат.
Однако я хочу оптимизировать рендеринг, вставляя вершины для всех тел в один буфер вершин. Поэтому я намерен изменить класс Shape
, чтобы включить смещения в буфере для расположения его вершин, тогда он может просто обновить их в буфере при drawAt
.
Я понимаю, что управление этими смещениями может быть затруднено при добавлении / удалении в буфер, однако в моем приложении это происходит нечасто, и я хочу выжать из процесса все возможные потери производительности рендеринга.
Мои вопросы:
- Позволяет ли Opengl ES 2.0 указывать набор вершин в виде
'shape', которая затем может быть переведена с помощью одной матричной операции, или
я должен явно обновлять вершины один за другим таким образом?
- Нужно создать уникальный обновляемый объект для назначения каждому
b2Body-> userData, или есть более эффективная практика?
- Лучше ли обновлять графические объекты на их собственной временной шкале, считывать позиции из связанных экземпляров b2Body или обновлять графические объекты непосредственно в цикле обновления b2Body, указанном выше?
Буду признателен за совет, спасибо.