2010-11-15 4 views
2

Хорошо, у меня есть класс рендерер, который имеет все виды специальных функций, вызываемых остальной частью программы:Renderer Эффективность

  • DrawBoxFilled
  • DrawText
  • DrawLine
  • О 30 подробнее ..

Каждая из этих функций вызывает glBegin/glEnd отдельно, что, как я знаю, может быть очень неэффективным (его даже не рекомендуется). Так или иначе, я планирую полное переписывание рендерера, и мне нужно знать наиболее эффективные способы настройки функций, чтобы, когда что-то называет это, он рисует все сразу или что-то еще, что ему нужно сделать, это будет пробег самый эффективно. Заранее спасибо :)

+0

Что делает ваше приложение? Что нужно делать? Почему вы рисуете текст и линии отдельно? – jalf

+0

Программа установлена ​​в ряд состояний. Каждое состояние должно рисовать различные объекты, такие как Text, Boxes или что-то еще. Подобно Singleton :: get(). DrawText («Yea ...», 10, 10); – Matt

+0

И как часто шанс на сцену? Когда объекты добавляются или удаляются? За кадр или только при изменении состояния (которое, как я предполагаю, несколько редок) – jalf

ответ

4

Самый эффективный способ заключается не в том, чтобы выставлять такие низкоуровневые методы. Вместо этого вы должны создать scene graph, который представляет собой структуру данных, которая содержит представление всей сцены. Вы обновляете график сцены в своем методе «обновления», а затем визуализируете все это одним методом «рендеринга».

Другой, немного другой подход - это перестроить весь график сцены для каждого кадра. Это имеет то преимущество, что как только граф сцены составлен, он не изменяется. Таким образом, вы можете вызвать свой метод «render» в другом потоке, пока ваш метод «обновления» проходит и создает сцену для кадра next.

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

Из ваших имен методов, похоже, вы работаете в 2D, поэтому, хотя отображение теней, вероятно, не очень велико в вашем списке функций, может быть отложено отсроченное рендеринг альфа-смешивания.

6

Эффективный способ визуализации, как правило, использовать объекты буфера вершинного типа (VBE) для хранения ваших данных вершин, но это действительно реально, если вы выполняете рендеринг (в основном) статических данных.

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