Оптимизировать граф сцены - PullRequest
3 голосов
/ 29 декабря 2011

У меня есть стандартный граф сцены, написанный на opengl с использованием c ++.

В моем графе сцены есть узлы и формы.

Узлы - это матрицы, и после применения их матрицы они рисуют всех своих потомков.

void Node::draw(Affine3f amatrix) const
{
   amatrix = amatrix * matrix;
   for (Drawable* child : childern)
   {
      child->draw(amatrix);
   }
}

Фигуры - это просто упакованные vbos, они берут матрицу из вызова draw, устанавливают ее какединая матрица просмотра модели, а затем нарисовать VBO.

void Shape::draw(Affine3f mat) const
{
   renderer.setModelView(mat);
   myVertices.draw();
}

Мне нравится этот дизайн, он очень прост и гибок.Но это очень неэффективно, с тоннами умножения матриц на стороне процессора и тоннами вызовов отрисовки.

Мой вопрос:

Как я могу оптимизировать этот дизайн, удалив обе ненужные матрицыумножения и ненужные вызовы отрисовки?

Как не пересчитывать матрицы при каждом отрисовке (вычисляются только измененные) и объединять фигуры, чтобы их можно было нарисовать одним вызовом.

Еще немного информации:

  • Фигуры статичны (на данный момент), содержащиеся вершины никогда не изменятся.
  • Существует смесь статической геометрии (в реальном времени в корневом узле без манипуляций) и динамической геометрии (дети манипулируемых узлов)

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Во-первых, я бы передал const & для входящих матриц.Вы передаете по значению, и если у вас есть draw функции, которые не нуждаются в каких-либо специальных действиях с матрицей, это лишнее копирование.если матрица не изменилась, вам понадобится флаг «грязный», чтобы определить, изменилось ли значение матрицы с момента ее последнего использования.RenderWare сделал что-то подобное со своей матрицей.

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

2 голосов
/ 29 декабря 2011

Рисуете ли вы каждый элемент дерева, даже если он не виден? Если это так, вы должны проверить октреи, чтобы отфильтровать невидимые узлы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...