游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7203|回复: 25

使用智能指针对纹理对象进行大规模包装,对于底层实现

[复制链接]

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-5-21 23:15:00 | 显示全部楼层 |阅读模式
为了解决纹理共享使用带来的销毁冲突问题,我使用了智能指针,而我发现,我得把所有纹理全部统一成智能指针,要不很麻烦.
但我仔细想来,所有纹理对象都需要用这个指针来包装一下,对于一个引擎的底层实现来讲,是否过于复杂和冗于了?
(我感觉底层实现应该尽可能精简和高效,少用一些封装,特别是大规模数量的对象.)

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2011-5-22 03:03:00 | 显示全部楼层

Re:使用智能指针对纹理对象进行大规模包装,对于底层实现

IDirect3DTexture 是 com 接口吧
提供有 AddRef 和 Release
你只需要在每个引用此纹理时 AddRef
销毁的时候尽情 Release
com 计数就会完美解决了

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2011-5-22 10:16:00 | 显示全部楼层

Re:使用智能指针对纹理对象进行大规模包装,对于底层实现

用智能指针~~你得小心哟~~

1

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2011-5-25 16:47:00 | 显示全部楼层

Re:使用智能指针对纹理对象进行大规模包装,对于底层实现

智能指针的封装并不复杂,我看很多开源引擎的资源管理策略都是用smart_ptr做的.

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-5-25 17:03:00 | 显示全部楼层

Re: Re:使用智能指针对纹理对象进行大规模包装,对于底层

??b我心: Re:使用智能指针对纹理对象进行大规模包装,对于底层实现是否合适??

智能指针的封装并不复杂,我看很多开源引擎的资源管理策略都是用smart_ptr做的.


恩,已经全部应用了智能指针了。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2011-5-25 18:07:00 | 显示全部楼层

Re:使用智能指针对纹理对象进行大规模包装,对于底层实现

楼主现在用的具体是什么智能指针? Boost的? STL的? 自己实现的?

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-5-25 18:43:00 | 显示全部楼层

Re: Re:使用智能指针对纹理对象进行大规模包装,对于底层

游戏阿家: Re:使用智能指针对纹理对象进行大规模包装,对于底层实现是否合适??

楼主现在用的具体是什么智能指针? Boost的? STL的? 自己实现的?


自己随便写的:


  1. //-------------------------------------------------------------------
  2. // CZSharePtr 共享指针
  3. //-------------------------------------------------------------------
  4. enum EMEMORYTYPE
  5. {
  6.         MT_NEW        = 0,
  7.         MT_MALLOC        = 1,
  8. };

  9. template <typename T, EMEMORYTYPE type>
  10. class CZSharePtr
  11. {
  12. public:
  13.         CZSharePtr(int null=0) : m_pPoint(NULL), m_pRefCount(NULL) {}
  14.         ~CZSharePtr()        {        Release();        }

  15.         void Release()
  16.         {
  17.                 if (m_pPoint == NULL)        return;
  18.                 if (--(*m_pRefCount) == 0)
  19.                 {
  20.                         switch (type)
  21.                         {
  22.                         case MT_NEW:
  23.                                 delete m_pPoint, m_pPoint=NULL;
  24.                                 delete m_pRefCount, m_pRefCount=NULL;
  25.                                 break;
  26.                         case MT_MALLOC:
  27.                                 free(m_pPoint), m_pPoint=NULL;
  28.                                 delete m_pRefCount, m_pRefCount=NULL;
  29.                                 break;
  30.                         }
  31.                 }
  32.         }

  33.         void operator = (T* ptr)
  34.         {
  35.                 if (ptr == NULL)        return;
  36.                 if (m_pRefCount == NULL)        m_pRefCount = new int(1);
  37.                 else                        (*m_pRefCount)++;
  38.                 m_pPoint = ptr;
  39.         }

  40.         void operator = (const CZSharePtr& src)
  41.         {
  42.                 m_pPoint=src.m_pPoint, m_pRefCount=src.m_pRefCount;
  43.                 (*m_pRefCount)++;
  44.         }

  45.         bool operator == (T* src)        {        return m_pPoint==src;                }
  46.         T* GetPoint()                {        return m_pPoint;        }

  47.         template <typename type>
  48.         operator type* ()                {        return (type*)m_pPoint;        }

  49. private:
  50.         T*                m_pPoint;
  51.         int*        m_pRefCount;        // 引用计数器
  52. };
复制代码


写的不太好,以后用的频繁了,再具体修改。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2011-5-25 19:27:00 | 显示全部楼层

Re: 使用智能指针对纹理对象进行大规模包装,对于底层实

[em4].........你是引用计数是对应于一个智能指针而不是一个对象???.............




  1. template <typename T, EMEMORYTYPE type>
  2. class CZSharePtr
  3. {
  4. public:       
  5.         CZSharePtr(int null=0) : m_pPoint(NULL), m_pRefCount(NULL) {}
  6.         ~CZSharePtr()        {        Release();        }       

  7.         void Release()       
  8.         {               
  9.                 if (m_pPoint == NULL)       
  10.                         return;               
  11.                 if (--(*m_pRefCount) == 0)               
  12.                 {                       
  13.                         switch (type)                       
  14.                         {                       
  15.                         case MT_NEW:                               
  16.                                 delete m_pPoint, m_pPoint=NULL;
  17.                                 delete m_pRefCount, m_pRefCount=NULL;
  18.                                 break;                       
  19.                         case MT_MALLOC:                               
  20.                                 free(m_pPoint), m_pPoint=NULL;                               
  21.                                 delete m_pRefCount, m_pRefCount=NULL;                               
  22.                                 break;                       
  23.                         }               
  24.                 }       
  25.         }

  26.         void operator = (T* ptr)       
  27.         {               
  28.                 if (ptr == NULL)       
  29.                         return;               
  30.                 if (m_pRefCount == NULL)       
  31.                         m_pRefCount = new int(1);               
  32.                 else                       
  33.                         (*m_pRefCount)++;               
  34.                         m_pPoint = ptr;       
  35.         }

  36.         void operator = (const CZSharePtr& src)       
  37.         {               
  38.                 m_pPoint=src.m_pPoint, m_pRefCount=src.m_pRefCount;               
  39.                 (*m_pRefCount)++;       
  40.         }       

  41.         bool operator == (T* src)       
  42.         {       
  43.                 return m_pPoint==src;
  44.         }

  45.         T* GetPoint()               
  46.         {       
  47.                 return m_pPoint;
  48.         }

  49.         template <typename type>        operator type* ()               
  50.         {       
  51.                 return (type*)m_pPoint;
  52.         }

  53. private:       
  54.         T*                m_pPoint;        int*        m_pRefCount;        // 引用计数器
  55. };

  56. class CTexture
  57. {
  58. public:
  59.         CTexture()
  60.         {
  61.                 cout << "Construct Texture " << this << endl;
  62.         }

  63.         ~CTexture()
  64.         {
  65.                 cout << "Destruct Texture " << this << endl;
  66.         }
  67. };


  68. // 对象不会被删除
  69. {
  70.         CZSharePtr<CTexture, MT_NEW> texturePtr;
  71.         texturePtr = new CTexture();
  72.         texturePtr = texturePtr.GetPoint();
  73. }

  74. // pTextureA和pTextureB都没有被删除
  75. {
  76.         CZSharePtr<CTexture, MT_NEW> texturePtr;
  77.         CTexture * pTextureA = new CTexture();
  78.         CTexture * pTextureB = new CTexture();
  79.         texturePtr = pTextureA;
  80.         texturePtr = pTextureB;
  81. }

复制代码

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-5-25 19:55:00 | 显示全部楼层

Re: Re: 使用智能指针对纹理对象进行大规模包装,对于底层

游戏阿家: Re: 使用智能指针对纹理对象进行大规模包装,对于底层实现是否合适??

[em4].........你是引用计数是对应于一个智能指针而不是一个对象???.............


[code]

template...


1:只用于一个new或malloc的指针。
2:该智能指针只绑定一个纹理,不支持已经指向一个纹理的情况,再指向下一个纹理。
仔细一想,的确,当智能指针已经指向一个纹理时,再指向其他纹理时,应该解除上一次的引用计数,且当引用计数为0则销毁。
谢谢了。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2011-5-25 20:01:00 | 显示全部楼层

Re:使用智能指针对纹理对象进行大规模包装,对于底层实现

.......楼主不禁让我想起一些执著的"黑客",他们从来不屑于学习已有的东西,而是热衷于自己去探索,有一天某个"黑客""发明"了一个算法令其颀喜不已,然而他并不知道,教科书里早就有这种方法了.

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

本版积分规则

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

GMT+8, 2025-6-9 14:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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