Использование OSG :: Node вы можете использовать метод клонирования и определить, какие данные копируются между объектом в процессе клонирования. Посмотрите на пример кода:
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> n = osgDB::readNodeFile(fn);
// n2 will be deep copy of n - all data of n will be copied to n2
osg::ref_ptr<osg::Node> n2 = dynamic_cast<osg::Node*>(n->clone(osg::CopyOp::DEEP_COPY_ALL));
// n3 will be shallow copy of n - all possible data will be shared between n3 and n
osg::ref_ptr<osg::Node> n3 = dynamic_cast<osg::Node*>(n->clone(osg::CopyOp::SHALLOW_COPY));
Использование метода клонирования и copyOp перечисление можно легко определить, какие данные совместно и которая копируется. Подробнее можно найти здесь OSG Documentation.
Я не нашел никаких вариантов предзагрузки для osgDB, но она может быть легко реализовано так:
class GraphFilesManager {
static osg::Node* GraphFilesManager::readNodeFile(std::string file)
{
bool wasLoaded = false;
for (int i=0; i < loadedNodefilenames.size(); i++)
{
if (file.compare (loadedNodefilenames[i])==0)
{
osg::Node* newNode = dynamic_cast<osg::Node*>(loadedNode[i]->clone(osg::CopyOp::DEEP_COPY_NODES));
return newNode;
}
}
osg::Node* newNode = osgDB::readNodeFile(file);
if (newNode)
{
loadedNode.push_back(newNode);
loadedNodefilenames.push_back(file);
}
return newNode;
}
static std::vector <osg::Node*> loadedNode;
static std::vector <std::string> loadedNodefilenames;
}
В моем номере приложения моделей является очень низким, и я должен был сделать глубокую копию. Надеюсь, это помогло.
«osg :: Node» наследуется от osg :: Referenced, поэтому подсчитывается ссылка. Просто загрузите его один раз в начале вашей программы, сохраните его как osg :: ref_ptr где-нибудь и используйте его всякий раз, когда вам нравится (под другими узлами преобразования); не будет дублирования модели, так как вы всегда будете использовать один и тот же экземпляр, и вам не придется снова загружать его. –
osgDB :: Registry поддерживает кэширование загруженных файлов моделей - и различные уровни, геометрию, текстуры и т. Д. Просто передайте флаги реестра в osgDB :: readNodeFile (или другие функции загрузчика osgDB). Одна из «новых» особенностей этого метода (это было внедрено где-то в эпоху osg 2.x) - это возможность написать собственный обратный вызов для читателя, чтобы вы могли настраивать стандартные вызовы с помощью своей собственной системы, если вы не хотите использовать реализацию реестра по умолчанию. – iminyourbrain