osgDB::Registry在一个osg应用中只有一个实例,保证了不同对象访问到的是同一个东西。
osgDB/Registry.cpp
Registry* Registry::instance(bool erase)
{
static ref_ptr<Registry> s_registry = new Registry;
if (erase)
{
s_registry->destruct();
s_registry = 0;
}
return s_registry.get(); // will return NULL on erase
}
通过osgDB::Registry的成员变量可以看出其作用,主要是用于存放文件的读写器的。osgDB::Registry中有很多ReadFunctor(struct ReadObjectFunctor;struct ReadImageFunctor;struct ReadHeightFieldFunctor;struct ReadNodeFunctor;struct ReadArchiveFunctor;struct ReadShaderFunctor;struct ReadScriptFunctor;),它们利用doRead函数解析不同类型的内容。
osgDB/Registry
class OSGDB_EXPORT Registry : public osg::Referenced
{
OpenThreads::ReentrantMutex _pluginMutex;
ReaderWriterList _rwList;
ImageProcessorList _ipList;
DynamicLibraryList _dlList;