游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3190|回复: 5

D3D中顶点缓冲区释放的问题

[复制链接]

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2007-10-10 15:48:00 | 显示全部楼层 |阅读模式
大家都知道用完一个接口后就释放掉它,比如一个顶点缓冲区接口p_vb->release();我不知道这里的释放什么含义,是把顶点缓冲区那块内存都删除了吗,本来我一直是这样认为的,直到我看到了下面的一个代码就不确定了:
LPDIRECT3DVERTEXBUFFER9 pVB;
if( SUCCEEDED( g_pMesh->GetVertexBuffer( &pVB ) ) )
    {
        struct VERTEX { FLOAT x,y,z,tu,tv;};
        VERTEX* pVertices;
        DWORD   dwNumVertices = g_pMesh->GetNumVertices();

        pVB->Lock( 0, 0, (void**)&pVertices, 0 );

        for( DWORD i=0; i<dwNumVertices; i++ )
            pVertices.y = HeightField( pVertices.x, pVertices.z );

        pVB->Unlock();
        pVB->Release();//注意这里改完就释放了接口(接口指针指向的数据会释放吗)
    }
g_pMesh是一个已经创建好的MESH对象,已经加载了数据,上面代码的含义是从MESH中读出顶点数据,然后根据顶点的X,Z值修改Y值,然后就释放掉了顶点缓冲区。其实这里就出现问题了,如果把接口简单的当成指针来理解的话, 那么释放掉接口后那整个缓冲区内容就丢失了, 之后我的MESH就不可能渲染出来, 但是事实是释放后MESH依然可以渲染,所以我就想这里的释放不能理解为销毁缓冲区,但是又具体不知道什么含义,请大家说说 [em7]

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2007-10-10 15:52:00 | 显示全部楼层

Re:D3D中顶点缓冲区释放的问题

其实我个人感觉创建接口只是把一个缓冲区和接口指针关联,销毁的时候只是简单的把接口指针和缓冲区的映射关系去掉,但是缓冲区并没有清空,这样假如两个接口指向同一个缓冲区的时候,一个接口指针释放后不影响另一个接口对缓冲区的访问什么的,不知道是不是

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-10-10 16:28:00 | 显示全部楼层

Re:D3D中顶点缓冲区释放的问题

这是COM机制。你可以大概去了解以下。他有一个引用记数。实际上你的Relaese不是立即释放的。他是把引用计数--.如果变成0了就释放。你要看SDK他会说那里是要会增加引用计数了那里没有增加

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2007-10-10 18:12:00 | 显示全部楼层

Re:D3D中顶点缓冲区释放的问题

谢谢, 我也只能大概了解下COM了, 要看完那本书真累啊

66

主题

223

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
发表于 2007-10-11 22:15:00 | 显示全部楼层

Re:D3D中顶点缓冲区释放的问题

在COM编程中约定,任何时候地接口指针赋值(复制),都要AddRef(),在指针变量结束生命期前,再Release().
       

:方式一:不使用AddRef()。和普通指针一样,临时变量是左值,接口指针是右值,直接赋值使用。如:
        pMesh = pMeshData->pMesh;
        这是由于pMesh是局部变量,它只是临时引用一下,没必要为它先AddRef(),后Release()。

             方式二:隐式的使用AddRef()。 由于用到了一些内部有AddRef()动作的函数,就要按照COM约定,在子程序结束前Release()
        pMesh->GetDevice(&pd3dDevice);//此处d3d设备引用计数已经加1
        ....
        SAFE_RELEASE(pd3dDevice);//--此处将引用计数减1,并不是真的释放d3d设备
        在本例中,pd3dDevice在GetDevice()中已经Addref()过了,所以,在退出CreateMeshContainer()前,必须pd3dDevice->Release()

             方式三:显式的使用AddRef()。 如果一个指针值,不是由D3DXCreate出来的,而是通过赋值方式复制给一个全局变量或长期变          量的。 所以,可以通过AddRef()的方式来延迟该对象的释放。因为,如果不AddRef(),极有可能在函数返回该对象就可能释放了。它           就像一个加油站,使得传入对象的寿命延长至自己控制范围内。用了AddRef(),就要在相关的Destroy中添加Release()。

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2007-10-13 10:51:00 | 显示全部楼层

Re:D3D中顶点缓冲区释放的问题

貌似了解了些了,谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-17 12:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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