Почему производительность падает, когда я загружаю, например, 4900 узлов в сцену? Если 125, то нормально, 200 еще нормально, но если их больше, то частота кадров при рендеринге сильно падает? Корневой узел содержит дочерние элементы, которые содержат (модель (в 3ds) + текстура + некоторые научные расчеты), и все они созданы в цикле от 0 до 4899. Я пытался использовать osgUtil::Optimizer в корне после того, как все дочерние элементы были на месте, но до сих пор никаких улучшений . Пытался поместить все узлы в один жеод, но это тоже не помогло. Как мне достичь баланса между производительностью и количеством узлов?
OpenSceneGraph отображает множество узлов
Ответы (1)
4900 узлов кажутся ужасным количеством узлов!
Вы должны начать читать о LOD
и PagedLOD
. PageLOD
улучшит производительность. Идея такова (представьте, что первое изображение намного дальше):
Поскольку вы находитесь далеко, вам не нужно много деталей. Но когда вы увеличиваете масштаб, вы хотите видеть эти детали. Вам нужно будет указать, какие модели входят в каждый уровень LOD
и как вы хотите их активировать. Это сложная часть.
Кроме того, проверьте, можете ли вы делиться узлами. Например, вместо 4 разных колес вы просто создаете одно колесо. Затем добавьте 4 элемента PositionAttitudeTransform/MatrixTransform и добавьте узел колеса к каждому из них. То же самое касается StateAttributes
, делитесь ими, когда это возможно!
Наконец, если у вас много повторяющихся геометрических фигур, взгляните на создание экземпляров геометрии.
OrbitManipulator
и TrackballManipulator
(может быть, и StandardManipulator
тоже). Я изменил значение в методе pan
, чтобы уменьшить «скорость» панорамирования. Это хак и, возможно, было бы лучше добавить свой собственный манипулятор, но... :)
- person Adri C.S.; 07.04.2015