`
javahigh1
  • 浏览: 1227501 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

DXUT库,CDXUTDialogResourceManager的一个不太好发现的问题

阅读更多

如果按照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的调用。
再编译连接,成功,不会再在退出时报错了。

结论:
该谁的事情谁自己处理,别让别人擦屁股,否则总会受人牵制。

欢迎大家指正^_^


分享到:
评论

相关推荐

    DXUT库和渲染对象类02

    DirectX 3D HLSL高级实例精讲_DXUT库和渲染对象类

    DXUT编程指南()

    DXUT是一个建立在Direct3D API之上的,被大部分Direct3D指南和例子所使用的层。 它的目标是创建Direct3D例子、原型、工具,更容易的建立坚固、专业的游戏。 • DXUT概观 • 初始化DXUT • 使用基于DXUT的程序窗口 •...

    directX9 DXUT框架剖析

    为了统一管理各个对话框,还需要定义对话框资源管理器类CDXUTDialogResourceManager的一个对象,在程序开始时,调用各个对话框的Init函数和对话框资源管理对象进行初始化 DXUT框架剖析(13) 摘要: DXUT框架对...

    DXUT框架概述.chm

    DXUT提供了一个简单的基于GUI系统的精灵和一个设备设置对话框. 另外, 它还提供了一些摄像机类. 这个指南的结果是一个具有完善功能的GUI 用于更改设备和场景的设置. 它将有按钮, 滑块, 和文本来示范这些功能.

    DXUT下的文理映射

    把DirectX下的示例代码移至DXUT框架下,学习DXUT的同学可以看一下

    DXUT框架剖析 CHM 版

    DXUT(也称sample framework)是建立在Direct3D API之上的Direct3D应用程序框架,有了DXUT这样一个Direct3D程序框架,只需在这个框架的基础上编写相应的代码,从而简化了 windows和Direct3D API的使用,可以高效地...

    DXUT.zip_dxut_dxut d

    &#8226 DXUT概观 &#8226 初始化DXUT &#8226 使用基于DXUT的程序窗口 &#8226 使用DXUT设备 &#8226 使用DXUT主循环 &#8226 处理DXUT的错误 &#8226 DXUT高级设备选择 &#8226 DXUT高级功能

    DXUT框架进阶教程.pdf

    DXUT框架进阶教程.pdf

    DXUT.rar_dxut

    DXUT框架剖析,介绍了DXUT的程序框架的创建以及应用

    02_DXUT库和渲染对象类

    《Direct3D HLSL高级实例精讲》光盘源码。由于整个源码大小超过了CSDN的上传限制,因此将其分章节上传。源码及相关资源版权归原作者所有,仅作学习交流,严禁用于商业目的!

    DXUT设计指南

    DXUT是directx的一个快速开发游戏的框架, 使用它的话可以隐去很多directx的使用细节, 这个指南介绍这个框架是如何运作的, 和如何使用。

    DXUT.rar_2007_DXUT SDK_DXUT.h_dxut

    Microsoft DirectX SDK (November 2007)\Samples\C++\DXUT

    DXUT.rar_directx pdf_dxut

    本PDF详细解析微软DirectX游戏框架程序DXUT。想了解DXUT的朋友不能错过哦。

    Triangle_DXUT_Move.rar_dxut_triangle

    基于DXUT框架的三角形面片操作,使用DXUT框架完成各项基本操作

    DXUT Tutorial Win32 Sample

    DXUT Tutorial Win32 Sample DXUT Tutorial Win32 Sample

    DXUT Win32 范例代码

    DXUT Win32 官方范例代码

    DXUT编程指南 Direct3D的封装

    DXU T 是一个建立 在 Direct3D AP I 之上的 , 被大部 分 Direct3 D 指南和例子所使用的层 。 它的目标是 创建 Direct3D 例子、原型、工具,更容易的建立坚固、专业的游戏。

    DXUT_texture.rar_DXUT Texture example_dxut

    以VC2003为开发环境,在D3D的平台下,实现贴图灯光效果

    DXUT 控件使用程序

    介绍如何使用DXUT框架的控件程序,VC++2005 主要类文件DXUTControl.cpp

    DXUT编程指南.doc

    DXUT是一个建立在Direct3D API之上的,被大部分Direct3D指南和例子所使用的层。 它的目标是创建Direct3D例子、原型、工具,更容易的建立坚固、专业的游戏。

Global site tag (gtag.js) - Google Analytics