找回密码
 点一下
查看: 2918|回复: 6

handle句柄究竟是什么?请高手讲解一下.

[复制链接]
发表于 2010-8-15 03:02:07 | 显示全部楼层 |阅读模式
我刚才在看,GA的jass培训教程.
看到 handle 这点卡住了.
教程里把handle和函数的参数,以及变量放到了一起讲.......我水平有限,感觉handle好像是一个功能类型的变量的统称(我自己也说不清楚我是怎么理解的.不过感觉我理解的肯定不对).... 我自己实在是想不明白.
不能很好的理解.
希望高手能够先单独讲解一下的它的概念,再说下它和参数 变量的关系.
如果能得到你的解答.在下十分感激.

如果感觉麻烦或者不知道从何说起,就看看这个,我把我看到原文给发上来.希望高能够给解释一下.我的字打在中括号里面.

handle句柄:句柄这个概念可能还不太懂是吗?这里粗略的说一下吧。
      在魔兽争霸中很多要描述的物体(对象)都不是简单的变量类型。如unit(单位),ability(技能),item(物品),当一个函数需要以这些对象为参数的时候我们必须填写一个标识符
【问题1 这个标识符最不明白,不知道作者指的是什么。是参数的名字吗?如unit X 这应该参数那么X就是标识符?】
在参数的地方。
        war3中的这种标识符
【参数名字?】
就是handle类展开
【问题2 handle类指的是什么?如Unit Ability 等等都是Handle类?如果是,那么展开我就知道了。如果不是,那他是在说什么?】
的变量。句柄就是这些对象的一个唯一的标识【】。
        war3通过一个句柄
问题3 这里的句柄是不是刚才说的标识符?它和刚才说的Handle以及handle类是什么关系?到这里的我思绪就严重混乱,下面的看不去了,很多词看不懂。】
就可以知道这个句柄代表的是什么?是item还是itemtype(物品类型),是unit还是button(对话框)等等。
        并且能够通过句柄找到该物体(对象)在内存中的地址,对物体(对象)的数据进行访问。
        这一切是通过handle系统(实际上负责维护一个handle到指针的映射)完成的(这里不属于我们的讨论范畴)
        所以,句柄这个东西说白了就是一个标识,通常句柄都是在整型  基础上定义的,也就是说句柄几乎和整型通用。
        但要注意并不是每一个整数都对应了一个句柄,句柄这个东西是在句柄标识的东西存在的情况下才起作用的。如果我们把一个unit删除掉,那么这个unit对应的句柄也就失效了。而且我们删除该unit时恰好是用到unit的句柄来表示该unit。是不是很有趣!
        有很多变量其实都是句柄变量(该变量仅仅存储对象的句柄值):如unit ...



我真的很想看懂,但是能力有限。。。。。。。请高手赐教。
发表于 2010-8-15 04:36:54 | 显示全部楼层
请务必留意区分“类型”和“对象”这两个关键词。

Asd 4 Q1: 这个所说的标识符应该是“可以指向我们想要的那个对象的语句”,可以是变量,也可以是某个函数的返回值。就像call KillUnit(udg_u)或者call KillUnit(GetTriggerUnit())这样... 所以我们还可以说,同一个对象可以拥有多种多样的多个标识符,而你却不能通过对象直接知道它的所有的标识符吧。而句柄(handle)的特别之处就在于这种标识符与对象之间是一一对应的,一个对象只有一个handle,一个handle只对应一个对象。

Asd 4 Q2: 对象的“类型”之间的确存在着继承关系,比如buff继承于ability(技能, 不是技能类型),ability继承于handle,而handle继承于integer(整数)。具体的继承奸情可以看看common.j的最靠前那段。

Asd 4 Q3: handle的“对象”是个“整数值”,你暂时可以把这个值理解为对象在“内存”中所处的位置(虽然并非如此)。当然了,一个单位在内存中所在的位置是唯一的,所以这个单位的handle值就是唯一的,我们用这个唯一的handle值可以在茫茫人海中锁定唯一的那个单位。
而你还可以这样理解,unit类的变量实际上和一个整数型变量花的内存开销一样大。因为它也只是记录了单位的handle值,仅靠这个数值访问到单位的。

至于“war3通过handle知道代表的是unit还是item...”这句话,只能说从handle值里就知道对象的类型,war3能,而我们还不能...
回复

使用道具 举报

发表于 2010-8-15 04:46:31 | 显示全部楼层
每个组件都有他的句柄  我们是通过句柄向 电脑发送请求的
回复

使用道具 举报

 楼主| 发表于 2010-8-15 09:23:40 | 显示全部楼层
引用第1楼Conflux于2010-08-15 04:36发表的  :
请务必留意区分“类型”和“对象”这两个关键词。

Asd 4 Q1: 这个所说的标识符应该是“可以指向我们想要的那个对象的语句”,可以是变量,也可以是某个函数的返回值。就像call KillUnit(udg_u)或者call KillUnit(GetTriggerUnit())这样... 所以我们还可以说,同一个对象可以拥有多种多样的多个标识符,而你却不能通过对象直接知道它的所有的标识符吧。而句柄(handle)的特别之处就在于这种标识符与对象之间是一一对应的,一个对象只有一个handle,一个handle只对应一个对象。

Asd 4 Q2: 对象的“类型”之间的确存在着继承关系,比如buff继承于ability(技能, 不是技能类型),ability继承于handle,而handle继承于integer(整数)。具体的继承奸情可以看看common.j的最靠前那段。
.......


非常感谢LS的解答...........不过我还是没有明白......是我自己的水平有限,我继续努力吧.感激不尽
回复

使用道具 举报

发表于 2010-8-15 09:24:04 | 显示全部楼层
我认为“句柄”这个翻译真是渣到了极点,我刚接触编程时就被“句柄”这个词困扰了很久。直接说是指针不就好了。
回复

使用道具 举报

发表于 2010-8-15 17:19:06 | 显示全部楼层
翻译成“手柄”也不错,不过我又想起小霸王游戏机了
叫“把柄”、“触手”好了... 最通俗不如翻译成“标签”或者“对象ID”好了~

句柄和指针应该是两码事吧...
回复

使用道具 举报

发表于 2010-8-15 21:04:42 | 显示全部楼层
应该不翻译,其实handle就是一个地址的序号,类似目录中的第一章这类的东西。
其实这东西在我看来,是这样的。魔兽的5种基本存储类型(integer,real,handle,code,string)中,主要integer,和real是直接存储的,因为这类变量占用的字节数是固定的,通过不同的变量明和应用范围(全局,局域)确认所在表就可以了,其他三类是相似的存储结构,这三类都能获得一个handle值(一个整值),然后,这个值作为一个序号,在不同的哈希表中获得一个地址,大约是一个整数的大小,这个值就是真正的指针,指向真正的变量值,比如一个timer。当然,timer这些类别也是有各自的表的,比如全部的unit存在一个表中。然后,哈希表(存储handle值)也并非一个,首先code,handle,string就是不同的哈希表。handle类型的子类型也有部分有单独的表,例如漂浮文字和闪电特效。
handle值的初始值也是不同的,
以上内容根据1.20猜测,1.24下新的类型agent不知道有什么特别的,没做过测试,主要是1.24下H2I实际是A2I
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-25 07:45 , Processed in 0.094238 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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