OpenSceneGraph отображает множество узлов

Почему производительность падает, когда я загружаю, например, 4900 узлов в сцену? Если 125, то нормально, 200 еще нормально, но если их больше, то частота кадров при рендеринге сильно падает? Корневой узел содержит дочерние элементы, которые содержат (модель (в 3ds) + текстура + некоторые научные расчеты), и все они созданы в цикле от 0 до 4899. Я пытался использовать osgUtil::Optimizer в корне после того, как все дочерние элементы были на месте, но до сих пор никаких улучшений . Пытался поместить все узлы в один жеод, но это тоже не помогло. Как мне достичь баланса между производительностью и количеством узлов?


person Azraith Sherkhan    schedule 03.04.2015    source источник
comment
На самом деле, чтобы сделать лучшие предложения, нам нужно знать, что это за узлы и что они представляют. Различные стратегии (создание экземпляров и т. д.) используются для разных ситуаций.   -  person XenonofArcticus    schedule 06.04.2015


Ответы (1)


4900 узлов кажутся ужасным количеством узлов!

Вы должны начать читать о LOD и PagedLOD. PageLOD улучшит производительность. Идея такова (представьте, что первое изображение намного дальше):

Низкая детализация

Высокая детализация

Поскольку вы находитесь далеко, вам не нужно много деталей. Но когда вы увеличиваете масштаб, вы хотите видеть эти детали. Вам нужно будет указать, какие модели входят в каждый уровень LOD и как вы хотите их активировать. Это сложная часть.

Кроме того, проверьте, можете ли вы делиться узлами. Например, вместо 4 разных колес вы просто создаете одно колесо. Затем добавьте 4 элемента PositionAttitudeTransform/MatrixTransform и добавьте узел колеса к каждому из них. То же самое касается StateAttributes, делитесь ими, когда это возможно!

Наконец, если у вас много повторяющихся геометрических фигур, взгляните на создание экземпляров геометрии.

person Adri C.S.    schedule 04.04.2015
comment
Большое спасибо! Похоже, производительность сильно возросла, но когда я добавляю все узлы в сцену, поведение камеры становится странным. Например, если я получаю радиус ограничивающей сферы камеры до того, как добавляю целую кучу узлов в сцену, он равен примерно 12,5f, но когда все узлы в сцене становятся равными 18000,0f. И во-вторых, есть ли способ установить камеру немного дальше от окна просмотра (немного уменьшить масштаб). - person Azraith Sherkhan; 05.04.2015
comment
Что касается камеры, посмотрите здесь; принятый ответ содержит очень полезные комментарии к камере. О другой вашей проблеме: что плохого в поведении при изменении радиуса камеры? не совсем понимаю :) - person Adri C.S.; 06.04.2015
comment
Я попробую объяснить. У меня есть манипулятор трекбола, когда сцена пуста, движение камеры в порядке, я могу очень хорошо панорамировать ее средней кнопкой мыши, но когда я добавляю узлы в сцену и нажимаю среднюю кнопку, все исчезает из камеры. Единственное, что я заметил, это происходит, когда радиус камеры достигает безумного значения 18k. Я могу предположить, что движение манипулятора трекбола связано с радиусом камеры, но я не могу понять, где эта граница на самом деле. Другие вещи, такие как правая кнопка и левая кнопка, работают нормально. - person Azraith Sherkhan; 07.04.2015
comment
У меня тоже были проблемы с манипулятором, и я сразу перешел к коду. Я не помню, где это было, но файлы, которые я трогал, где классы OrbitManipulator и TrackballManipulator (может быть, и StandardManipulator тоже). Я изменил значение в методе pan, чтобы уменьшить «скорость» панорамирования. Это хак и, возможно, было бы лучше добавить свой собственный манипулятор, но... :) - person Adri C.S.; 07.04.2015