首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

再问设备丢失的处理能否完全独立于一个DLL模块?该如何处理

2012-03-09 
再问设备丢失的处理能否完全独立于一个DLL模块??假如渲染模块被设计成一个DLL,那设备丢失的处理(资源销毁、

再问设备丢失的处理能否完全独立于一个DLL模块??
假如渲染模块被设计成一个DLL,那设备丢失的处理(资源销毁、设备重置、资源重建)有办法完全脱离应用程序么?

我的资源都是用D3DPOOL_DEFAULT模式,在应用程序里使用接口创建控件啥的。资源的销毁和设备重置在DLL里可以自行处理,但是唯独这个资源创建,要在应用程序里处理。

因为DLL这个模块本身不知道应用程序会创建哪些资源,所以资源的重建工作,我总是要放在应用程序里处理。

请问这种问题有无方法处理呢??

[解决办法]
把资源读取的代码都塞给dll,exe只给dll传一个文件名好了
[解决办法]
应该和程序的整个设计框架有关系吧
开始的时候就要考到程序所要使用的资源,这样就能为处理资源的dll做好接口了。
[解决办法]
我的程序里面,渲染器是显卡的抽象,所以与显卡有关的资源都是由渲染器维护的,设备丢失时渲染器自动释放资源,设备恢复时渲染器自动重新创建资源,所有的操作对外部程序都是不可见的,外部程序完全不需要考虑设备丢失之类的事情,就好像d3d从来不会发生设备丢失一样。


[解决办法]
给资源重建构造一个机制.把这个机制以dll的方式来接入.

如果简单点,或者你定义好你的资源重建函数.dll的函数只通知你的程序里对应的函数或接口名.这样dll不需要知道你要重建哪些东西,只是当丢失时通知此函数,要重建资源.这样的话虽然不能如你所说完全独立.但是可以解决dll不需要知道你创建了哪些资源,只需要知道你是不是丢失了,如果丢失了应该怎么做,具体的重建还是让渲染系统去做.
[解决办法]
简单的例子代码:

C/C++ code
Texture* CRenderer::CreateTexture( const wchar* file_name )        {            Texture* t=new Texture();            //从文件中加载纹理            if(!t->LoadFromFile(file_name))            {                //如果加载失败                delete t;                return 0;            }            //将纹理的指针保存到纹理列表            m_TextureList.push_back(t);            return t;        }            void CRenderer::ReleaseTexture( Texture* texture )        {            //释放纹理            ......        }                bool CRenderer::Begin()        {            //检测设备状态,状态异常则采取相应的操作后返回            int state=GetDeviceState();            switch(state)            {            case 0:                {                    Sleep(30);                    return(false);                }            case -1:                {                    OnLostDevice();                    Sleep(30);                    return(false);                }            case -2:                {                    Reset();                    return(false);                }            }            //准备渲染            if( SUCCEEDED( m_Device->BeginScene() ) )            {                return(true);            }            return(false);        }                void CRenderer::OnLostDevice()        {            //对所有资源进行LostDevice操作            for(uint i=0;si<m_TextureList.size();++i)            {                m_TextureList[i]->OnLostDevice();            }            ......        }                void CRenderer::OnResetDevice()        {            //对所有资源进行ResetDevice操作            for(uint i=0;si<m_TextureList.size();++i)            {                m_TextureList[i]->OnResetDevice();            }            ......        } 

热点排行