• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Cpper
            C/C++高級(jí)工程師 Android高級(jí)軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語(yǔ)言 程序猿
            插件系統(tǒng)是游戲引擎中一個(gè)比較大的子系統(tǒng)
            這個(gè)系統(tǒng)的目的就是動(dòng)態(tài)增加引擎的功能而不必修改引擎接口

            之前雖然做過(guò)插件這塊‘
            但是感覺(jué)設(shè)計(jì)的不好
            這次總算弄了一個(gè)比較完備的插件系統(tǒng)

            相關(guān)對(duì)象和結(jié)構(gòu)
            1.插件 Plugin
            ///////////////////////////////////////////////////////////
            /// 定義引擎插件數(shù)據(jù)結(jié)構(gòu)
            ///////////////////////////////////////////////////////////
            class Plugin
            {
            public:
                Plugin()
                {   
                    Reset();
                }   
                
            ///////////////////////////////////////////////////////
                
            /// 插件重啟
                
            ///////////////////////////////////////////////////////     
                void Reset();
                
            ///////////////////////////////////////////////////////
                
            /// 插件名字
                
            ///////////////////////////////////////////////////////     
                engine_string name;
                
            ///////////////////////////////////////////////////////
                
            /// 插件作者
                
            ///////////////////////////////////////////////////////     
                engine_string maker;
                
            ///////////////////////////////////////////////////////
                
            ///插件描述
                
            ///////////////////////////////////////////////////////     
                engine_string description;
                
            ///////////////////////////////////////////////////////
                
            /// 插件版本
                
            ///////////////////////////////////////////////////////     
                ushort  vermain;
                
            ushort  versub;
                
            ushort  verpitch;
                
            ///////////////////////////////////////////////////////
                
            /// 插件類型
                
            ///////////////////////////////////////////////////////     
                ushort  type;
                
            ///////////////////////////////////////////////////////
                
            /// 插件合法性標(biāo)記
                
            ///////////////////////////////////////////////////////     
                ushort  valid;
            };
            插件數(shù)據(jù)結(jié)構(gòu)只包含了插件的一些基本信息 比如名字,描述,作者,功能類型等

            2.PluginLoader
            ////////////////////////////////////////////////////////
            /// 定義插件載入類
            ////////////////////////////////////////////////////////
            class PluginLoader
            {
            public:
                
            /////////////////////////////////////////////////////
                
            /// 構(gòu)造,析構(gòu)插件載入
                
            /////////////////////////////////////////////////////
                PluginLoader();
                
            ~PluginLoader();
            public:     
                
            /////////////////////////////////////////////////////
                
            /// 載入插件和卸載
                
            /////////////////////////////////////////////////////
                bool  Load(const engine_string &plugin);
                
            void  Free();     
                
            /////////////////////////////////////////////////////
                
            /// 獲取插件指定符號(hào)地址
                
            /////////////////////////////////////////////////////     
                void* GetAddress(const engine_string &name);
                
            /////////////////////////////////////////////////////
                
            /// 檢測(cè)插件是否合法
                
            /////////////////////////////////////////////////////     
                bool  IsValid()const{return handle != NULL;}
                
            /////////////////////////////////////////////////////
                
            /// 獲取插件句柄
                
            /////////////////////////////////////////////////////
                void* GetHandle(){return handle;}
                
            void* GetHandle()const{return handle;}   
                
            /////////////////////////////////////////////////////
                
            /// 獲取插件名
                
            /////////////////////////////////////////////////////
                engine_string GetPluginName()const{return pluginame;}   
            private:     
                
            void*         handle;
                engine_string pluginame;   
            };

            PluginLoader主要是載入插件文件并獲取給定符號(hào)的函數(shù)指針
            這個(gè)并沒(méi)沒(méi)有暴漏出來(lái)供用戶調(diào)用
            3.PluginFactory

            ///////////////////////////////////////////////////////////
            /// 定義引擎插件工廠基類
            ///////////////////////////////////////////////////////////
            class GAPI PluginFactory : public Object
            {
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 構(gòu)造和析構(gòu)引擎插件工廠基類
                
            ///////////////////////////////////////////////////////
                PluginFactory();
                
            virtual ~PluginFactory();
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 注冊(cè),反注冊(cè)插件
                
            ///////////////////////////////////////////////////////
                virtual bool ENGINE_CALL RegisterFactory(const engine_string& plugin) = 0;
                
            virtual void ENGINE_CALL UnregisterFacory() = 0;
            public:     
                
            ///////////////////////////////////////////////////////
                
            /// 獲取對(duì)應(yīng)插件類型標(biāo)識(shí)
                
            ///////////////////////////////////////////////////////     
                virtual ushort GetPluginType()const = 0;
            private:
                DECLARE_OBJECT(PluginFactory)        
            };

            插件工廠是一切需要從插件中獲取功能的對(duì)象工廠
            她主要提供了插件的注冊(cè)和反注冊(cè)以及獲取插件工廠所對(duì)應(yīng)的插件類型

            4.PluginManager 插件管理器
            ///////////////////////////////////////////////////////////
            /// 定義引擎插件管理器
            ///////////////////////////////////////////////////////////
            class GAPI PluginManager
            {   
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 獲取,設(shè)置插件目錄
                
            ///////////////////////////////////////////////////////
                engine_string GetPluginFolder()const;
                
            void SetPluginFolder(const engine_string& folder);
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 插件裝載和卸載
                
            ///////////////////////////////////////////////////////
                void InstallPlugin();   
                
            void UnstallPlugin();   
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 注冊(cè),反注冊(cè)插件工廠
                
            ///////////////////////////////////////////////////////        
                bool RegisterPluginFactory(PluginFactory* factory);
                
            bool UnregisterPluginFactory(PluginFactory* factory);
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 獲取插件個(gè)數(shù)
                
            ///////////////////////////////////////////////////////        
                ushort ENGINE_CALL GetPluginNumber()const;
                
            ///////////////////////////////////////////////////////
                
            /// 獲取給定索引插件信息
                
            ///////////////////////////////////////////////////////
                Plugin ENGINE_CALL GetPluginByType(ushort index)const;
                
            ///////////////////////////////////////////////////////
                
            /// 獲取給定索引的插件名
                
            ///////////////////////////////////////////////////////  
                engine_string ENGINE_CALL GetPluginNameByType(ushort index)const;   
                
            ///////////////////////////////////////////////////////
                
            /// 獲取給定插件類型的插件載入類
                
            ///////////////////////////////////////////////////////      
            private:
                PluginManagerImpl  
            *impl;
                DEFINE_SINGLETON(PluginManager);
            };

            }

            //! 定義插件管理器單件
            #define GLOBAL_PLUGINMANAGER_PTR (core::PluginManager::GetInstance())
            插件管理器是插件系統(tǒng)的核心,充當(dāng)了插件管理者的角色
            要使用插件線需要設(shè)置插件目錄
            然后裝載插件
            然后注冊(cè)特定的插件工廠
            然后就可以通過(guò)插件工廠獲取插件對(duì)象指針咯

            在這里插件管理器是作為一個(gè)單間使用的
            具體的宏 DEFINE_SINGLETON(PluginManager);
            展開(kāi)之后為:
            #define DEFINE_SINGLETON(SingletonObject)\
            private:\
                
            static std::auto_ptr<SingletonObject> instance;\
            protected:\
                SingletonObject();\
            public:\
                
            ~SingletonObject();\
                
            static SingletonObject* GetInstance(){\
                
            if(!instance.get())\
                {\
                    instance 
            = std::auto_ptr<SingletonObject>(new SingletonObject());\
                }\
                
            return instance.get();\
            }

            #define IMPLEMENT_SINGLETON(SingletonObject)\
            std::auto_ptr
            <SingletonObject> SingletonObject::instance(NULL);
            下面是具體的一個(gè)插件對(duì)象---攝像頭捕獲類
            如下:通過(guò)調(diào)用CaptureImage就可以把攝像頭所見(jiàn)程序保存為image了
            ///////////////////////////////////////////////////////////
            /// 定義攝像頭捕獲類(以插件形式提供之)
            ///////////////////////////////////////////////////////////
            class GAPI CapturePicture : public Object
            {
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 構(gòu)造和析構(gòu)
                
            ///////////////////////////////////////////////////////
                CapturePicture();
                
            virtual ~CapturePicture();
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 獲取攝像頭圖形數(shù)據(jù)
                
            ///////////////////////////////////////////////////////
                virtual bool CaptureImage(RefPtr<Image> &image);
            private:
                DECLARE_OBJECT(CapturePicture)        
            };

            通過(guò)調(diào)用CaptureImage就可以把攝像頭所見(jiàn)程序保存為image了

            下面這個(gè)是對(duì)于的工廠:
            ///////////////////////////////////////////////////////////
            /// 定義攝像頭捕獲工廠類
            ///////////////////////////////////////////////////////////
            class GAPI CapturePictureFactory : public PluginFactory
            {
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 構(gòu)造和析構(gòu)
                
            ///////////////////////////////////////////////////////
                CapturePictureFactory();
                
            virtual ~CapturePictureFactory();
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 獲取攝像頭捕獲指針
                
            ///////////////////////////////////////////////////////
                CapturePicture* Create();
                
            ///////////////////////////////////////////////////////
                
            /// 注冊(cè)插件
                
            ///////////////////////////////////////////////////////
                bool ENGINE_CALL RegisterFactory(const engine_string& plugin);
                
            void ENGINE_CALL UnregisterFacory();
                
            ///////////////////////////////////////////////////////
                
            /// 獲取對(duì)應(yīng)插件類型標(biāo)識(shí)
                
            ///////////////////////////////////////////////////////     
                ushort GetPluginType()const;
            private:
                PluginLoader
            * loader;
                DECLARE_OBJECT(CapturePictureFactory)
            };
            這個(gè)只是多了一個(gè)函數(shù)Createer而已

            然后再說(shuō)具體的插件部分
            插件3函數(shù):
            extern "C" void    GAPI Plugin_Info(Plugin &plugin);         
            extern "C" Object* GAPI Plugin_Install();
            extern "C" void    GAPI Plugin_Unstall(void*);  
            具體為通過(guò)Plugin_Info
            通過(guò)Plugin_Install獲取插件實(shí)際對(duì)象指針
            通過(guò)Plugin_Unstall卸載插件

            最后一個(gè)部分是插件的使用小例子:
            #include <cstdlib>
            #include 
            <iostream>
            #include 
            <GEngine/Header.hpp>

            using namespace std;

            int main(int argc, char *argv[])
            {
                GLOBAL_PLUGINMANAGER_PTR
            ->SetPluginFolder("plugin");
                GLOBAL_PLUGINMANAGER_PTR
            ->InstallPlugin();
                std::cout
            <<"插件個(gè)數(shù):"<<GLOBAL_PLUGINMANAGER_PTR->GetPluginNumber()<<std::endl;
                core::CapturePictureFactory factory;
                std::cout
            <<"注冊(cè)視頻捕獲插件工廠:"<<GLOBAL_PLUGINMANAGER_PTR->RegisterPluginFactory(&factory)<<std::endl;
                core::CapturePicture
            * capturepicture = factory.Create();
                std::cout
            <<"插件工廠產(chǎn)品標(biāo)識(shí):"<<factory.GetPluginType()<<std::endl;
                core::RefPtr
            <core::Device> device = core::InitDevice("插件測(cè)試");
                
            if(!capturepicture)
                {
                    std::cout
            <<"生成攝像頭捕獲指針失敗了"<<std::endl;
                    system(
            "PAUSE");
                    
            return -1;
                }
                core::RefPtr
            <core::ResourceManager> resmgr = device->GetResourceManager();
                core::RefPtr
            <core::ImageManager> imagemanager = resmgr->GetImageManager();
                core::RefPtr
            <core::Image> image = imagemanager->CreateObject("capturepicture");
               
                capturepicture
            ->CaptureImage(image);
                std::cout
            <<"save image is:"<<image->Save("capture.bmp")<<std::endl;
               
                BEGIN_LOOP(device)
                   glClearColor(
            0.1,0.3,0.2,1.0f);
                   glClear(GL_COLOR_BUFFER_BIT 
            | GL_DEPTH_BUFFER_BIT);     
                END_LOOP(device)   
               
                GLOBAL_PLUGINMANAGER_PTR
            ->UnregisterPluginFactory(&factory);
                GLOBAL_PLUGINMANAGER_PTR
            ->UnstallPlugin();
                
            //system("PAUSE");
                return EXIT_SUCCESS;
            }
            題后話:
            當(dāng)前引擎支持xp,vista,win7環(huán)境
            在編譯器支持vc7.1,vc8,vc9,devc++,codeblock
            也許在不久的將來(lái)我會(huì)弄一個(gè)linux版本的
            posted on 2010-07-29 16:40 ccsdu2009 閱讀(2543) 評(píng)論(17)  編輯 收藏 引用 所屬分類: Game引擎
            Comments
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2009
              Posted @ 2010-07-29 16:41
              有問(wèn)題的話 請(qǐng)同志們指針  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              路青飛
              Posted @ 2010-07-29 17:09
              看起來(lái)不錯(cuò),等我把王爽老師的匯編語(yǔ)言看完了,學(xué)習(xí)一下你的引擎。  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2009
              Posted @ 2010-07-29 18:50
              @路青飛
              謝謝支持  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2009
              Posted @ 2010-07-29 18:55
              @路青飛
              @路青飛
              有問(wèn)題請(qǐng)教你匯編問(wèn)題啊 呵呵我不懂  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              issingle@gmail.com
              Posted @ 2010-07-30 09:24
              插件系統(tǒng)中,最關(guān)鍵和最難點(diǎn)是插件之間的通信.  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              napolen
              Posted @ 2010-07-30 10:30
              我覺(jué)得你這背景應(yīng)該改一下,看文章看起來(lái)太別扭了。  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)[未登錄](méi)
              ccsdu2009
              Posted @ 2010-07-30 10:48
              @issingle@gmail.com
              這個(gè)不是當(dāng)前的問(wèn)題
              我做東西喜歡循序漸進(jìn)
                回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              Husiwa
              Posted @ 2010-08-02 16:13
              這個(gè),貌似不能夠自動(dòng)檢測(cè)到有多少插件吧?
              我的意思是,用戶寫個(gè)插件,放到你的插件目錄下,
              PluginManager能夠自動(dòng)檢測(cè)出來(lái)嗎?  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2009
              Posted @ 2010-08-02 16:46
              @Husiwa

              但是要按照給定插件格式寫  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              Husiwa
              Posted @ 2010-08-03 10:53
              @ccsdu2009
              哦,上面的代碼貌似沒(méi)有體現(xiàn)出這一點(diǎn)。  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2004
              Posted @ 2010-08-03 10:56
              @Husiwa
              ///////////////////////////////////////////////////////
              /// 獲取插件個(gè)數(shù)
              ///////////////////////////////////////////////////////
              ushort ENGINE_CALL GetPluginNumber()const;  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              Husiwa
              Posted @ 2010-08-04 18:14
              @ccsdu2004
              哦,這樣,看的不仔細(xì),不好意思。
              這樣的話,是否需要配置文件呢?
              C#可以通過(guò)反射機(jī)制來(lái)獲取插件信息,C++呢?  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2009
              Posted @ 2010-08-04 20:41
              @Husiwa
              可以通過(guò)載入插件來(lái)獲取插件信息  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)

              Posted @ 2010-08-08 01:44
              最近在研究插件系統(tǒng), 能否提供例子代碼下載???  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              BoYue
              Posted @ 2010-08-08 13:48
              @Husiwa
              可以通過(guò)配置文件,也可以通過(guò)搜索插件的接口名來(lái)確定有哪些插件. 把多個(gè)插件的DLL放在目錄下.然后搜索這些DLL,用GetProcAddress即可確定哪些是插件.   回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)
              ccsdu2009
              Posted @ 2010-08-08 16:16
              @楊
              過(guò)段時(shí)間吧 O(∩_∩)O~  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎-插件系統(tǒng)

              Posted @ 2010-08-12 10:10
              謝謝,等你。  回復(fù)  更多評(píng)論   
             
            久久午夜羞羞影院免费观看| 久久久久久久女国产乱让韩| 久久青青草原综合伊人| 久久精品视频网| 久久国产香蕉视频| 青青草国产97免久久费观看| 久久WWW免费人成一看片| 久久精品国产精品亚洲毛片 | 波多野结衣久久精品| 中文字幕热久久久久久久| 99久久国产热无码精品免费| 久久99国产精品成人欧美| 久久久久亚洲av成人网人人软件| 精品久久久噜噜噜久久久| 久久国产精品无码网站| 亚洲国产另类久久久精品黑人| 亚洲国产二区三区久久| 日本五月天婷久久网站| 69SEX久久精品国产麻豆| 色综合合久久天天给综看| 精品人妻久久久久久888| 亚洲午夜福利精品久久| 久久线看观看精品香蕉国产| 中文字幕无码久久精品青草 | 精品久久综合1区2区3区激情| 欧美一区二区久久精品| 久久国产精品久久| 日韩精品无码久久久久久| 久久久亚洲精品蜜桃臀| 国内精品久久久久久99| 久久精品桃花综合| 91亚洲国产成人久久精品| 人妻精品久久无码专区精东影业 | 久久国内免费视频| 精品久久久久久国产三级| 色综合久久无码五十路人妻| 无码乱码观看精品久久| 91超碰碰碰碰久久久久久综合| 久久w5ww成w人免费| 亚洲精品美女久久777777| 伊人久久大香线蕉综合5g|