如果按照DXUT例子的编码方式,很难出现这个问题的,但是这两日闲来无事,将DXUT分到了一个DLL内,结果……
退出时报错!
不断注释代码,最后发现是CDXUTDialogResourceManager惹的祸。再一检查,有些心得,遂拿来共享。
原因是这样的:
CDXUTDialogResourceManager在析构函数里干掉Cache(Delete):
//--------------------------------------------------------------------------------------
CDXUTDialogResourceManager::~CDXUTDialogResourceManager()
{
inti;
for(i=0;i<m_FontCache.GetSize();i++)
{
DXUTFontNode*pFontNode=m_FontCache.GetAt(i);
SAFE_DELETE(pFontNode);
}
m_FontCache.RemoveAll();
for(i=0;i<m_TextureCache.GetSize();i++)
{
DXUTTextureNode*pTextureNode=m_TextureCache.GetAt(i);
SAFE_DELETE(pTextureNode);
}
m_TextureCache.RemoveAll();
CUniBuffer::Uninitialize();
CDXUTIMEEditBox::Uninitialize();
}
//--------------------------------------------------------------------------------------
而在OnDestroyDevice里真正Release这些资源:
//--------------------------------------------------------------------------------------
voidCDXUTDialogResourceManager::OnDestroyDevice()
{
inti=0;
m_pd3dDevice=NULL;
//Releasetheresourcesbutdon'tclearthecache,asthesewillneedtobe
//recreatedifthedeviceisrecreated
for(i=0;i<m_FontCache.GetSize();i++)
{
DXUTFontNode*pFontNode=m_FontCache.GetAt(i);
SAFE_RELEASE(pFontNode->pFont);
}
for(i=0;i<m_TextureCache.GetSize();i++)
{
DXUTTextureNode*pTextureNode=m_TextureCache.GetAt(i);
SAFE_RELEASE(pTextureNode->pTexture);
}
SAFE_RELEASE(m_pSprite);
}
//--------------------------------------------------------------------------------------
一般说来,在例子中,这个RM都是以全局变量形式存在的:
extern CDXUTDialogResourceManagerg_DialogResourceManager;//managerforsharedresourcesofdialogs
这就有一个问题,OnDestroyDevice和析构函数究竟哪个在先?这就要看OnDestroyDevice的最终调用者DXUTState这个全局变量和g_DialogResourceManager这个全局变量的析构先后顺序了。
一般,如果这些代码和您的代码都编译到一个EXE,则顺序大凡是先State析构,调用DestroyDevice再RM析构,这就对了,既Release又Delete。
而在将DXUT封到Dll后,便发生了位于Dll的State后于位于EXE的RM析构的情况,这导致了先调用了RM的析构函数,然后才调用了State析构和OnDestroyDevice!!!
这意味着先调用了Delete,然后在Release的时候就找不着北了,资源没有Release,DXUT自然会报错!
由此得出一个结论:VC的CRT在退出时,先干掉了EXE本身的全局变量,然后才去释放各个DLL……
写到这里后,又发现DXUTState是一个非导出类,遂导出之,结果依旧……
不知对否,遂又作测试,发现凡是EXE中的全局变量,全都在Dll的State前析构。
extern CDXUTDialogg_HUD;//dialogforstandardcontrols
extern CDXUTDialogg_SampleUI;//dialogforsamplespecificcontrols
皆如此。
解决的方案就近乎简单了,DialogRM既然都析构了,何不调用自己的Release?为何一定要在State析构时才调用呢?
因此为增加一句:
CDXUTDialogResourceManager::~CDXUTDialogResourceManager()
{
[color=blue] /////////////////////////////////////////////////
OnDestroyDevice();
/////////////////////////////////////////////////
[/color]
inti;
for(i=0;i<m_FontCache.GetSize();i++)
{
DXUTFontNode*pFontNode=m_FontCache.GetAt(i);
SAFE_DELETE(pFontNode);
}
m_FontCache.RemoveAll();
for(i=0;i<m_TextureCache.GetSize();i++)
{
DXUTTextureNode*pTextureNode=m_TextureCache.GetAt(i);
SAFE_DELETE(pTextureNode);
}
m_TextureCache.RemoveAll();
CUniBuffer::Uninitialize();
CDXUTIMEEditBox::Uninitialize();
}
去掉其他地方对RM的OnDestroyDevice的调用。
再编译连接,成功,不会再在退出时报错了。
结论:
该谁的事情谁自己处理,别让别人擦屁股,否则总会受人牵制。
欢迎大家指正^_^
分享到:
相关推荐
DirectX 3D HLSL高级实例精讲_DXUT库和渲染对象类
DXUT是一个建立在Direct3D API之上的,被大部分Direct3D指南和例子所使用的层。 它的目标是创建Direct3D例子、原型、工具,更容易的建立坚固、专业的游戏。 • DXUT概观 • 初始化DXUT • 使用基于DXUT的程序窗口 •...
为了统一管理各个对话框,还需要定义对话框资源管理器类CDXUTDialogResourceManager的一个对象,在程序开始时,调用各个对话框的Init函数和对话框资源管理对象进行初始化 DXUT框架剖析(13) 摘要: DXUT框架对...
DXUT提供了一个简单的基于GUI系统的精灵和一个设备设置对话框. 另外, 它还提供了一些摄像机类. 这个指南的结果是一个具有完善功能的GUI 用于更改设备和场景的设置. 它将有按钮, 滑块, 和文本来示范这些功能.
把DirectX下的示例代码移至DXUT框架下,学习DXUT的同学可以看一下
DXUT(也称sample framework)是建立在Direct3D API之上的Direct3D应用程序框架,有了DXUT这样一个Direct3D程序框架,只需在这个框架的基础上编写相应的代码,从而简化了 windows和Direct3D API的使用,可以高效地...
• DXUT概观 • 初始化DXUT • 使用基于DXUT的程序窗口 • 使用DXUT设备 • 使用DXUT主循环 • 处理DXUT的错误 • DXUT高级设备选择 • DXUT高级功能
DXUT框架进阶教程.pdf
DXUT框架剖析,介绍了DXUT的程序框架的创建以及应用
《Direct3D HLSL高级实例精讲》光盘源码。由于整个源码大小超过了CSDN的上传限制,因此将其分章节上传。源码及相关资源版权归原作者所有,仅作学习交流,严禁用于商业目的!
DXUT是directx的一个快速开发游戏的框架, 使用它的话可以隐去很多directx的使用细节, 这个指南介绍这个框架是如何运作的, 和如何使用。
Microsoft DirectX SDK (November 2007)\Samples\C++\DXUT
本PDF详细解析微软DirectX游戏框架程序DXUT。想了解DXUT的朋友不能错过哦。
基于DXUT框架的三角形面片操作,使用DXUT框架完成各项基本操作
DXUT Tutorial Win32 Sample DXUT Tutorial Win32 Sample
DXUT Win32 官方范例代码
DXU T 是一个建立 在 Direct3D AP I 之上的 , 被大部 分 Direct3 D 指南和例子所使用的层 。 它的目标是 创建 Direct3D 例子、原型、工具,更容易的建立坚固、专业的游戏。
以VC2003为开发环境,在D3D的平台下,实现贴图灯光效果
介绍如何使用DXUT框架的控件程序,VC++2005 主要类文件DXUTControl.cpp
DXUT是一个建立在Direct3D API之上的,被大部分Direct3D指南和例子所使用的层。 它的目标是创建Direct3D例子、原型、工具,更容易的建立坚固、专业的游戏。