Box2D + Opengl ES 2.0 (XCode, iPhone): эффективное обновление местоположений вершин тела - PullRequest
1 голос
/ 30 августа 2011

Если вы использовали 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.

Я понимаю, что управление этими смещениями может быть затруднено при добавлении / удалении в буфер, однако в моем приложении это происходит нечасто, и я хочу выжать из процесса все возможные потери производительности рендеринга.

Мои вопросы:

  1. Позволяет ли Opengl ES 2.0 указывать набор вершин в виде 'shape', которая затем может быть переведена с помощью одной матричной операции, или я должен явно обновлять вершины один за другим таким образом?
  2. Нужно создать уникальный обновляемый объект для назначения каждому b2Body-> userData, или есть более эффективная практика?
  3. Лучше ли обновлять графические объекты на их собственной временной шкале, считывать позиции из связанных экземпляров b2Body или обновлять графические объекты непосредственно в цикле обновления b2Body, указанном выше?

Буду признателен за совет, спасибо.

1 Ответ

0 голосов
/ 01 сентября 2011

-1.Если вы установите вершины в буфере в качестве позиций, которые вы указали при создании осветительных приборов для тел, это должно быть в состоянии сделать это:

b2Vec2 pos = m_body->GetPosition();
float angle = m_body->GetAngle();
glPushMatrix();
    glTranslatef( pos.x, pos.y, 0 );
    glRotatef( angle * RADTODEG, 0, 0, 1 );//OpenGL uses degrees here
    glDrawArrays(GL_WHATEVER, startIndex, vertexCount);
glPopMatrix();

См. http://www.iforce2d.net/b2dtut/drawing-objects для более подробной информации.Глубокая дискуссия.

-2.Обычно вы хотите рисовать только то, что видно.Вышеупомянутый метод может быть выполнен только после того, как вы определили, что этот конкретный объект должен быть нарисован вообще.Код в вашем вопросе выше может без необходимости обновлять позиции для объектов, которые никогда не прорисовываются.

-3.э-э ... я думаю, что только что ответил.Я думаю, что лучше иметь список ваших игровых объектов, каждый из которых содержит указатель на b2Body *, который представляет их в мире физики, а не на список тела Box2D.

...