ogre 引擎 框架追踪 第一章 root的创建

使用ogre引擎很久了,对于渲染过程基本了解,但是没有详细到一定程度。终于有时间整理一下了,顺便达到一个秘密的目的。

版本ogre 1.8.1.
ogre 从流程上分为初始化、场景渲染、渲染结束(关闭场景)。

初始化从root创建开始。

#ifdef _DEBUG
    mRoot = new Root("plugins_d.cfg");
#else
    mRoot= new Ogre::Root("plugins.cfg");
#endif

这种新建方式直接调用了dll的加载。
new Root中,ogre做了什么?

 Root::Root(const String& pluginFileName, const String& configFileName, 
        const String& logFileName)
      : mLogManager(0)
      , mRenderSystemCapabilitiesManager(0)
      , mNextFrame(0)
      , mFrameSmoothingTime(0.0f)
      , mRemoveQueueStructuresOnClear(false)
      , mDefaultMinPixelSize(0)
      , mNextMovableObjectTypeFlag(1)
      , mIsInitialised(false)
      , mIsBlendIndicesGpuRedundant(true)
      , mIsBlendWeightsGpuRedundant(true)
    {
        // superclass will do singleton checking
        String msg;

        // Init
        mActiveRenderer = 0;
        mVersion = StringConverter::toString(OGRE_VERSION_MAJOR) + "." +
            StringConverter::toString(OGRE_VERSION_MINOR) + "." +
            StringConverter::toString(OGRE_VERSION_PATCH) + 
            OGRE_VERSION_SUFFIX + " " +
            "(" + OGRE_VERSION_NAME + ")";
        mConfigFileName = configFileName;

        **// 创建日志**
        if(LogManager::getSingletonPtr() == 0)
        {
            '''
            ***mLogManager = OGRE_NEW LogManager();
            mLogManager->createLog(logFileName, true, true);***
            '''
        }

        // 创建动态库管理器
        mDynLibManager = OGRE_NEW DynLibManager();

        //文件管理器
        mArchiveManager = OGRE_NEW ArchiveManager();

        // 资源管理器
        mResourceGroupManager = OGRE_NEW ResourceGroupManager();

        //工作队列的创建、设置
        // WorkQueue (note: users can replace this if they want)
        DefaultWorkQueue* defaultQ = OGRE_NEW DefaultWorkQueue("Root");
        // never process responses in main thread for longer than 10ms by default
        defaultQ->setResponseProcessingTimeLimit(10);
        // match threads to hardware
#if OGRE_THREAD_SUPPORT
      //多线程支持的设置,要想支持多线程先声明OGRE_THREAD_SUPPORT
        unsigned threadCount = OGRE_THREAD_HARDWARE_CONCURRENCY;
        if (!threadCount)
            threadCount = 1;
        defaultQ->setWorkerThreadCount(threadCount);
#endif
        // only allow workers to access rendersystem if threadsupport is 1
#if OGRE_THREAD_SUPPORT == 1
        defaultQ->setWorkersCanAccessRenderSystem(true);
#else
        defaultQ->setWorkersCanAccessRenderSystem(false);
#endif
        mWorkQueue = defaultQ;

        //后台资源队列
        // ResourceBackgroundQueue
        mResourceBackgroundQueue = OGRE_NEW ResourceBackgroundQueue();

        // Create SceneManager enumerator (note - will be managed by singleton)
        mSceneManagerEnum = OGRE_NEW SceneManagerEnumerator();

        //阴影纹理管理器
        mShadowTextureManager = OGRE_NEW ShadowTextureManager();

        //渲染系统能力管理器,用于获取有些功能渲染系统能否实现的信息及驱动信息等
        mRenderSystemCapabilitiesManager = OGRE_NEW RenderSystemCapabilitiesManager();

        //材质管理器
        // ..material manager
        mMaterialManager = OGRE_NEW MaterialManager();

        // Mesh(模型) manager
        mMeshManager = OGRE_NEW MeshManager();

        // Skeleton (骨骼)manager
        mSkeletonManager = OGRE_NEW SkeletonManager();

        // ..particle system(粒子系统) manager
        mParticleManager = OGRE_NEW ParticleSystemManager();


        //时间管理
        mTimer = OGRE_NEW Timer();

        //ogre中2d界面管理器初始化并且注册面板、文字
        // Overlay manager
        mOverlayManager = OGRE_NEW OverlayManager();

        mPanelFactory = OGRE_NEW PanelOverlayElementFactory();
        mOverlayManager->addOverlayElementFactory(mPanelFactory);

        mBorderPanelFactory = OGRE_NEW BorderPanelOverlayElementFactory();
        mOverlayManager->addOverlayElementFactory(mBorderPanelFactory);

        mTextAreaFactory = OGRE_NEW TextAreaOverlayElementFactory();
        mOverlayManager->addOverlayElementFactory(mTextAreaFactory);
        // Font manager
        mFontManager = OGRE_NEW FontManager();

        // Lod strategy manager(层次细节策略)
        mLodStrategyManager = OGRE_NEW LodStrategyManager();

#if OGRE_PROFILING
        // Profiler
        mProfiler = OGRE_NEW Profiler();
        Profiler::getSingleton().setTimer(mTimer);
#endif
        //文件注册
        mFileSystemArchiveFactory = OGRE_NEW FileSystemArchiveFactory();
        ArchiveManager::getSingleton().addArchiveFactory( mFileSystemArchiveFactory );
#if OGRE_NO_ZIP_ARCHIVE == 0
        //压缩包文件管理注册
        mZipArchiveFactory = OGRE_NEW ZipArchiveFactory();
        ArchiveManager::getSingleton().addArchiveFactory( mZipArchiveFactory );
        mEmbeddedZipArchiveFactory = OGRE_NEW EmbeddedZipArchiveFactory();
        ArchiveManager::getSingleton().addArchiveFactory( mEmbeddedZipArchiveFactory );
#endif
#if OGRE_NO_DDS_CODEC == 0
        // Register image codecs
        //dds图片解码器注册
        DDSCodec::startup();
#endif
#if OGRE_NO_FREEIMAGE == 0
        // Register image codecs(一般图片的)
        FreeImageCodec::startup();
#endif
#if OGRE_NO_PVRTC_CODEC == 0
        //这种没用过
        PVRTCCodec::startup();
#endif
        //高级gpu语言编译器
        mHighLevelGpuProgramManager = OGRE_NEW HighLevelGpuProgramManager();
        //外部纹理资源管理器 
        mExternalTextureSourceManager = OGRE_NEW ExternalTextureSourceManager();
        //混合管理器
        mCompositorManager = OGRE_NEW CompositorManager();
        //脚本编译
        mCompilerManager = OGRE_NEW ScriptCompilerManager();

        // Auto window
        mAutoWindow = 0;
        //注册渲染物的“工厂”,用于以后创建这些“渲染物”
        // instantiate and register base movable factories
        mEntityFactory = OGRE_NEW EntityFactory();
        addMovableObjectFactory(mEntityFactory);
        mLightFactory = OGRE_NEW LightFactory();
        addMovableObjectFactory(mLightFactory);
        mBillboardSetFactory = OGRE_NEW BillboardSetFactory();
        addMovableObjectFactory(mBillboardSetFactory);
        mManualObjectFactory = OGRE_NEW ManualObjectFactory();
        addMovableObjectFactory(mManualObjectFactory);
        mBillboardChainFactory = OGRE_NEW BillboardChainFactory();
        addMovableObjectFactory(mBillboardChainFactory);
        mRibbonTrailFactory = OGRE_NEW RibbonTrailFactory();
        addMovableObjectFactory(mRibbonTrailFactory);
         //加载插件dll
        // Load plugins
        if (!pluginFileName.empty())
            loadPlugins(pluginFileName);

        LogManager::getSingleton().logMessage("*-*-* OGRE Initialising");
        msg = "*-*-* Version " + mVersion;
        LogManager::getSingleton().logMessage(msg);

        // Can't create managers until initialised
        mControllerManager = 0;

        mFirstTimePostWindowInit = false;

    }

总结新建root时操作就是,创建了各种管理器用于以后的日志、动态库、文件(普通文件、压缩包)、资源管理、工作队列、阴影纹理、材质、mesh、骨骼、粒子、时间、2d界面、层次细节、图片解码、高级gpu语言编程、纹理、脚本、compositor、渲染物体注册等。
东西很多,不着急,先从动态库dll加载开始解析
先看下“plugins_d.cfg”中的内容

PluginFolder=.

 Plugin=RenderSystem_Direct3D9_d
# Plugin=RenderSystem_Direct3D11_d(ogre 1.8.1不支持)
 Plugin=RenderSystem_GL_d
# Plugin=RenderSystem_GLES_d(手机上用)
# Plugin=RenderSystem_GLES2_d(手机上用)
 Plugin=Plugin_ParticleFX_d 
 Plugin=Plugin_BSPSceneManager_d
 Plugin=Plugin_CgProgramManager_d
 Plugin=Plugin_PCZSceneManager_d
 Plugin=Plugin_OctreeZone_d
 Plugin=Plugin_OctreeSceneManager_d

上面的dll如果不用的可以直接用‘#’号注释掉。比如Plugin_OctreeSceneManager_d、Plugin_OctreeZone_d、Plugin_PCZSceneManager_d、Plugin_BSPSceneManager_d
不常用可以不加载。
dx9和gl、cg是必须要加载的。cg用在gpu 的shader程序,gl和dx是渲染底层。

加载 dll的核心代码:

void Root::loadPlugin(const String& pluginName)
    {
#if OGRE_PLATFORM != OGRE_PLATFORM_NACL
        // Load plugin library,底层用的是LoadLibraryEx的形式,一般动态加载dll都用这种形式。
        DynLib* lib = DynLibManager::getSingleton().load( pluginName );
        // Store for later unload
        // Check for existence, because if called 2+ times DynLibManager returns existing entry
        if (std::find(mPluginLibs.begin(), mPluginLibs.end(), lib) == mPluginLibs.end())
        {
            mPluginLibs.push_back(lib);

            // Call startup function,获取入口函数
            DLL_START_PLUGIN pFunc = (DLL_START_PLUGIN)lib->getSymbol("dllStartPlugin");

            if (!pFunc)
                OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot find symbol dllStartPlugin in library " + pluginName,
                    "Root::loadPlugin");

            // This must call installPlugin
            pFunc();
        }
#endif
    }

这种dll的加载方式需要被加载的dll继承自ogre::Plugin,并且一定重写dllStartPlugin、dllStopPlugin、install等虚函数。
如dx 的:

D3D9Plugin* plugin;

    extern "C" void _OgreD3D9Export dllStartPlugin(void) throw()
    {
        plugin = OGRE_NEW D3D9Plugin();
        Root::getSingleton().installPlugin(plugin);
    }

    extern "C" void _OgreD3D9Export dllStopPlugin(void)
    {
        Root::getSingleton().uninstallPlugin(plugin);
        OGRE_DELETE plugin;
    }

dx 中install的代码

void D3D9Plugin::install()
    {


#ifdef OGRE_STATIC_LIB
        HINSTANCE hInst = GetModuleHandle( NULL );
#else
#  if OGRE_DEBUG_MODE == 1
        //看到这儿就熟悉了吧,就是普通的动态加载dll
        HINSTANCE hInst = GetModuleHandle( "RenderSystem_Direct3D9_d.dll" );
#  else
        HINSTANCE hInst = GetModuleHandle( "RenderSystem_Direct3D9.dll" );
#  endif
#endif
        mRenderSystem = OGRE_NEW D3D9RenderSystem( hInst );
        // Register the render system
        Root::getSingleton().addRenderSystem( mRenderSystem );
    }

当然加载的过程中,dx也顺便做了dx的资源管理器的初始化、dx配置的初始化。D3D9RenderSystem有时间的话再深究吧,反正是底层调用dx就对了。

到这儿才发现,我的天呐,才建一个root的操作竟然地下做了这么多东西了。

下一章到了渲染系统设置,root初始化。资源加载、相机啥的等等再说。

猜你喜欢

转载自blog.csdn.net/mansir123/article/details/53300726#comments_24425143