游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2610|回复: 8

d3d9 object可以在d3dDevice object之前Release()掉?

[复制链接]

20

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2009-11-18 22:02:00 | 显示全部楼层 |阅读模式
Direct3D\Tutorials的代码中,d3d9 对象是最后才Release()掉

《DirectX 9.0 3D游戏开发编程基础》的源代码中在InitD3D()函数的最后就release()掉了。

Tutorials中的
------------------------------------------------------------------------------------


LPDIRECT3D9             g_pD3D       = NULL; /// 创建D3D 设备的D3D对象参数
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; /// 渲染中使用的D3D设备




VOID Cleanup()
{
    if( g_pd3dDevice != NULL)
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}



--------------------------------------------------------------------------------------
《DirectX 9.0 3D游戏开发编程基础》的源代码中
--------------------------------------------------------------------------------------
bool d3d::InitD3D(HINSTANCE hInstance,int width, int height,bool windowed,D3DDEVTYPE deviceType,IDirect3DDevice9** device)
{
        //
        // Create the main application window.
        //








        //
        // Init D3D:
        //

        HRESULT hr = 0;

        // Step 1: Create the IDirect3D9 object.

        IDirect3D9* d3d9 = 0;
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

    if( !d3d9 )
        {
                ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
                return false;
        }

        // Step 2: Check for hardware vp.
//...
        // Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

        D3DPRESENT_PARAMETERS d3dpp;
        //...

        // Step 4: Create the device.

        hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwnd, vp,  &d3dpp,device);  
        if( FAILED(hr) )
        {

                        d3d9->Release(); // done with d3d9 object
                        ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
                        return false;

        }

        d3d9->Release(); // done with d3d9 object
       
        return true;
}
------------------------------------------------------------------------
上面可见,d3d9->CreateDevice(...)后,就d3d9->Release()了。记得有些书上说,应该最后才释放d3d9对象的。希望高人解答。

2

主题

683

帖子

687

积分

高级会员

Rank: 4

积分
687
发表于 2009-11-19 09:18:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

com体系的基础就是引用计数

20

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2009-11-19 13:30:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

可是记得有些书上说,要释放完其他的对象,最后才能释放d3d对象的,难道这个说法是错的????

7

主题

48

帖子

128

积分

注册会员

Rank: 2

积分
128
QQ
发表于 2009-11-19 14:06:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

CreateDevice 会将 d3d9->addref()

20

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2009-11-19 14:36:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

d3d9的引用计数不为0,不是无法释放嘛?

7

主题

48

帖子

128

积分

注册会员

Rank: 2

积分
128
QQ
发表于 2009-11-19 14:37:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

device release时会将d3d->release()

7

主题

48

帖子

128

积分

注册会员

Rank: 2

积分
128
QQ
发表于 2009-11-19 14:39:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

其实就是 d3d9->addref() --> createdevice() -->d3d9->addref() --> device->release() --> d3d9->release()-->d3d9->releae() 和d3d9->addref() --> createdevice() -->d3d9->addref() -->d3d9->releae() --> device->release() --> d3d9->release()的区别,都会释放的。

20

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2009-11-19 16:08:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

上面的过程我没有看明白

是不是Direct3DCreate9、CreateDevice都是增加的d3d9引用计数

所以release的顺序不是很关键,反正只要全部都release,最后都会有对d3d9对象的引用计数为0?

7

主题

48

帖子

128

积分

注册会员

Rank: 2

积分
128
QQ
发表于 2009-11-19 17:56:00 | 显示全部楼层

Re:d3d9 object可以在d3dDevice object之前Release()掉?

恩,是的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-19 03:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表