noslopforever [天堂里的死神]

我浴血奋战,只为了神圣永久不变的传言

用户操作
[即时聊天] [发私信] [加为好友]
noslopforever(天堂里的死神)ID:noslopforever
73181次访问,排名1394好友4人,关注者11
3D、图形学、游戏、哲学、历史、音乐,一个都不能少。
noslopforever的文章
原创 85 篇
翻译 2 篇
转载 4 篇
评论 208 篇
noslopforever(天堂里的死神)的公告

-欢迎大家来到我的空间。这里关注游戏相关学科的问题。
-自我介绍:男,25岁,程序员,喜欢战争、历史和哲学题材游戏。作为一位普通的初学者,希望众位前辈们能多多包涵和帮助。
-欢迎大家拍砖。本Blog原创的文章,如要转载,请注明出处和姓名。本Blog放置的代码,大部分是伪码,不保证能够运行。
*留言本1:没有CSDN帐号的网友留言请点击此链接
*留言本2:CSDN网友请在个人空间留言 ^_^




烽火过千年,往事如烟。争斗一生归何处?黄土青山。 繁华总易逝,回首不堪。敢叫天地换新颜,铁马连天。 ——《无题》 李巍于2008年6月9日

-最近在做:做好自己的项目,安排自己的时间。

-有些栏目的文章是不放在主页显示的,如果有感兴趣的可以到相应栏目查询。杂项和Just As Gamer栏目的,仅作为个人喜好,恕不回复。

最近评论
网民:理想是一种境界,有时需要用一生来努力而见不到结果.
能在寻觅的路上品尝着奋斗的过程,这是最重要的!
johnson3d:很高兴看到你越来越成熟了,无论是技术,还是性格。
性格上,我觉得你应该更加自信一点,你很强!
技术上,我希望你还能够在一点上提高,那就是更快的找到开发(不是性能- -!)主要瓶颈,并且解决他。
这几天有空我们去物美把卡花了哈:)
同行:读完这篇文章内心很有触动!
在还年轻的岁数能悟出如此深而大气的道理,在以后的人生道路上应该没什么事能难倒你!
人生一生不可能什么都做的完美,为目标求大同,有取舍是大智慧!
同行:读完这篇文章内心很有触动!
在还年轻的岁数能悟出如此深而大气的道理,在以后的人生道路上应该没什么事能难倒你!
人生一生不可能什么都做的完美,为目标求大同,有取舍是大智慧!
同行:每个人刚工作时都有这种经历.
人都是在干中学习,都是从弱到强,没有生而知之者.
所谓有经验的人不过是教训或经历比你多些就是了.
即使不成功经验也是收获!
在咱们业内早二三年都是师!不敢太谦虚了!
文章分类
收藏
相册
misc杂项
朝圣者的路途
文档所需图片册
我的书单
我的照片
!飞龙在天!
cproom前辈的Blog
eXtreme 3D —— Dreams的Blog(RSS)
flymemory的Blog
johnson的Blog——我的老师和第一个上司 ^_^
nhsoft——野猪大大的Blog
Nightmare of Design/Dev(RSS)
游戏编程实践——我的老师的Blog
马肝前辈的Blog
!虎狼成群!
亮——同学、引擎程序员
江自流——另一位同学兼才思敏捷的策划
游戏王——同学,一位才思敏捷的策划
推荐网页
Boost——C++准标准库
Boost中文站
GameDev.net
OGRE3D中文站
OGRE3D——开源的3D图形引擎
Sourceforge
有关WOW格式的Wiki
涂鸦软件——一个很牛的国产游戏引擎
喜欢的站点
《闪电战》杂志讨论区
帝国之鹰
德军总部
英雄世界
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 资源系统的管理(估计全世界也只有我不知道了)收藏

新一篇: 方便的boost_python | 旧一篇: Interlocking Tile LOD算法演示(包括部分代码)

GEM4上已经有了,很不错的一套实现。

基于Java垃圾管理机制的程序,基本不需要考虑资源的删除问题,但是C++程序员经常恼火的就是资源的问题。

普通的资源系统的做法,如果像OGRE那样,很多人已经觉得很酷了,但是我总觉得OGRE的资源系统反倒是写的最糟糕的一套系统。到1.0发布版本的前一个版本为止,资源系统仍然有些逻辑没有写完,包括多资源动态调入调出,可能OGRE社群还没遇到像WOW这样动辄数个GB的资源的应用。

在动态调入调出前,需要解决的一个问题,就是明确哪些资源可以调出,再说明白些,就是哪些资源目前没有被使用?

这个问题,COM可以解答,就是“标准的”AddRef、Release机制,但这个机制有一个臭名昭著的问题,就是迫使每个人在进行指针赋值的时候都必须自己自觉地加一个AddRef,指针销毁的时候,都用Release销毁。

例如:
RESOURCE * pRes = GetResMgr()->GetRes("sth");
这是绝对没问题的,sth会被Addref。
但是,您防不住:
RESOURCE * pRes2 = pRes;
而这时候,如果pRes2没有被手动AddRef,哼哼哼哼……

难道COM的开发者以为共产主义社会已经来临了?自觉?搞笑吧,只要有一个人不自觉,他就会很郁闷。他的郁闷会进而转化为使用他写的程序的人的郁闷。再进而转化为这个人所在公司的郁闷:人们会向这个公司的油箱里塞入成千上万谩骂、威胁的信笺……或许还有通知“法庭上见”的律师函。

如果您开发的是一个引擎,千万不要认为使用引擎的人都是牛人,都是自觉的人。就像当您开发一个游戏的时候,千万不要以为游戏的使用者都是中规中矩的玩家,他们有时候经常会做一些在您眼里奇怪的事情,如果这时候,游戏挂了,您觉得这个错误该让谁来买单呢?让玩家吗?

可以,但是您将因此失去一个玩家,或者,如果这个人是某个BBS的牛人,您将因此失去整个某BBS的人,然后一传十十传百……

请一定要记住一句话:“舆论的最大优势是在于它杀死一个人是如此的高效,而却不必为此承担任何法律责任”。谁说的?……我。

言归正转,看看我们要做的事情:我们肯定不能避免指针对指针的赋值,这是前提;我们不想让人们在这种时候都去记住调一个AddRef,怎么办呢?

学习一下Windows吧,高明的Windows在管理内核对象的时候,用的是什么?恩,对了,Handle。

在C++中,Handle是一个void*指针,无论是HWND、HINSTANCE还是别的,都是一个typedef void* HXX,但是我想我们没必要这么笨的。

我们的Handle可能类似于下面的样子:

class Handle
{
...
public:
 RESOURCE* ptr;
...
};

没甚么啊,您会说,就是一层包装而以。

对,但是包装后我们就可以做很多事情了哦~,比如说在包装上打上商店的商标,呵呵,人们就可以免费为我们做广告了。

我们可以重载拷贝构造子和赋值号,而在构造子、拷贝构造子中、赋值号中,我们可以:
ptr->AddRef()

同理,Handle销毁的时候:
ptr->Release()

这回就算有人能把自己的老婆都忘掉,他也绝对忘不掉去调用AddRef了,虽然他自己都不知道这个AddRef是在哪里调用的。

但您必须保证,在资源系统,以及任何用到这些资源的地方,都只使用Handle,不过我想这应该很容易。

如果还不明白,就去看《游戏编程精粹4》吧,80快钱,不过您不用买,只需要去看中间那个章节就可以了,好像是什么什么“弱引用”什么什么来着。

发表于 @ 2005年10月23日 16:50:00|评论(loading...)|编辑

新一篇: 方便的boost_python | 旧一篇: Interlocking Tile LOD算法演示(包括部分代码)

评论

#天南地北 发表于2005-11-21 11:09:00  IP: 222.40.135.*
  我虽然看不懂你的作品内容,但我要冒昧向你提两点建议:1、不要意味地贬低自己,你的思想有一定的深度,但若过于谦虚就有些虚伪之嫌了。
2、好像本文加议太多了,是乎冲淡了主题。
  班门弄斧了,让你见笑了。
#天南地北 发表于2005-11-21 11:58:00  IP: 222.40.135.*
我虽然看不懂你的作品内容,但我要冒昧向你提两点建议:1、不要意味地贬低自己,你的思想有一定的深度,但若过于谦虚就有些虚伪之嫌了。
2、好像本文加议太多了,是乎冲淡了主题。
  班门弄斧了,让你见笑了。
#noslopforever 发表于2005-12-20 03:37:00  IP: 221.221.211.*
受教,其实,主要是CSDN牛人太多,我确实差得远。^_^

本文确实加议太多,在以后的文章中,我尽量改掉这个毛病。多谢你
#张子龙 发表于2006-02-21 00:32:00  IP: 219.221.110.*
其实在COM里,也就是ATL不是有个智能指针吗,何必自己定义那个Handle类。COM对于游戏开发比较完美,否则DX就不是COM风格。
#noslopforever 发表于2006-03-07 00:24:00  IP: 61.173.67.*
智能指针只能解决自删除问题,不能解决在删除前获知对象是否正在使用的问题,否则也没必要出现COM了。其实广泛使用的那个智能指针出现在C++标准库中,COM里哪个概念是智能指针?这个我还真不太清楚,望告知一二……

另,DX使用COM接口,并不意味着DX就一定是COM风格。COM的完美主要体现在扩展上,扩展在游戏开发中只是一环,相反在引擎开发中则是很重要的部分。 ^_^

COM的接口有很多其它方面乱七八糟的事情,也有一些没有处理的东西,比如说Operator,这也就是Handle存在的动机。
#czlc 发表于2006-04-10 10:02:00  IP: 222.242.130.*
//RESOURCE * pRes2 = pRes;

我用的OGRE是v1.0.6,解决了这个问题,它用智能指针包装了
ResourcePtr pRes2 = pRes;
#noslopforever 发表于2006-04-14 20:23:00  IP: 61.173.67.*
恩,OGRE的新版确实有效地解决了这个问题,这是一个不错的进步。
发表评论  


登录
Csdn Blog version 3.1a
Copyright © noslopforever(天堂里的死神)