2016-05-13 1 views
1

Я потратил много времени, пытаясь понять управление памятью OSG. У меня есть график сцены с несколькими детьми (на самом деле LOD, основанный на октете).Использование памяти OpenSceneGraph при сбросе сцены

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

// Clear main osg::Group root node 
m_rootNode->removeChildren(0, m_rootNode->getNumChildren()); 
m_rootNode->dirtyBound(); 

// Clear Main view scene data from osg::Viewer 
m_viewer->setSceneData(nullptr); 

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

Тем не менее, когда я загрузить другую сцену моего зрителя, память переписывается каким-то образом (то есть, использование памяти не увеличивается, следовательно, нет никакой утечки памяти, но используемая память всегда одинакова)

I не может иметь такого поведения, так как мне нужно тщательно контролировать использование памяти. Как я могу это сделать?

ответ

1

Похоже, что OSG хранит кешированные экземпляры ваших данных, как на стороне процессора, так и на объектах с графическим процессором.

Вы могли бы посмотреть на osgDB's options отключить кэширование в первую очередь (CACHE_NONE, CACHE_ALL & ~CACHE_ARCHIVES), но это действительно может увеличить объем памяти, так как данные не могут быть использованы повторно и повторно загружены несколько раз.

Вы можете указать osg::Texture, чтобы освободить данные текстуры на стороне процессора после их загрузки в OpenGL - в случае, если вам это больше не нужно. Это можно сделать удобно с помощью osgUtil::Optimizer::TextureVisitor, который вы хотите настроить для изменения AutoUnref для каждой текстуры в true. Я думаю, что работает osgUtil :: Оптимизатор с OPTIMIZE_TEXTURE_SETTINGS достигает такого же эффекта.

Затем, после закрытия вашей сцены, как вы делали это в коде вашего вопроса, вы могли бы явным образом проинструктировать пейджер базы данных OSG, чтобы стереть свои кэша:

for(osgViewer::View v in AllYourViews) 
{ 
    v->getDatabasePager()->cancel(); 
    v->getDatabasePager()->clear(); 
} 

Чтобы, наконец, избавиться от всех предварительно выделено GPU- боковых объектов и их представлений на стороне процессора, вам нужно будет уничтожить ваши представления и GLContext.

+0

Благодарим вас за советы. Можете ли вы дать мне дополнительную информацию о следующем: как мне называть osgDB опции деактивировать кеш? Как я могу уничтожить представления и GLContexts специально? – manatttta

 Смежные вопросы

  • Нет связанных вопросов^_^