再问设备丢失的处理能否完全独立于一个DLL模块??
假如渲染模块被设计成一个DLL,那设备丢失的处理(资源销毁、设备重置、资源重建)有办法完全脱离应用程序么?
我的资源都是用D3DPOOL_DEFAULT模式,在应用程序里使用接口创建控件啥的。资源的销毁和设备重置在DLL里可以自行处理,但是唯独这个资源创建,要在应用程序里处理。
因为DLL这个模块本身不知道应用程序会创建哪些资源,所以资源的重建工作,我总是要放在应用程序里处理。
请问这种问题有无方法处理呢??
[解决办法]
把资源读取的代码都塞给dll,exe只给dll传一个文件名好了
[解决办法]
应该和程序的整个设计框架有关系吧
开始的时候就要考到程序所要使用的资源,这样就能为处理资源的dll做好接口了。
[解决办法]
我的程序里面,渲染器是显卡的抽象,所以与显卡有关的资源都是由渲染器维护的,设备丢失时渲染器自动释放资源,设备恢复时渲染器自动重新创建资源,所有的操作对外部程序都是不可见的,外部程序完全不需要考虑设备丢失之类的事情,就好像d3d从来不会发生设备丢失一样。
[解决办法]
给资源重建构造一个机制.把这个机制以dll的方式来接入.
如果简单点,或者你定义好你的资源重建函数.dll的函数只通知你的程序里对应的函数或接口名.这样dll不需要知道你要重建哪些东西,只是当丢失时通知此函数,要重建资源.这样的话虽然不能如你所说完全独立.但是可以解决dll不需要知道你创建了哪些资源,只需要知道你是不是丢失了,如果丢失了应该怎么做,具体的重建还是让渲染系统去做.
[解决办法]
简单的例子代码:
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(); } ...... }