找回密码
 点一下
查看: 2990|回复: 3

[已解决]关于set  null的一个问题--jass区没有解决分类.

[复制链接]
发表于 2011-4-5 19:37:51 | 显示全部楼层 |阅读模式
提问前我已经搜索了...但是还不是很明白.
先感谢一下 zhuzeitou  大.


我想问的是.如果我大量对同一 局部变量 赋值.并且这些对应的单位是不能清除的.因为还要用到...那么只能set null了.
我是只set null 1次?还是 赋值一个单位就set null一次?
话说我用WE创建的单位...
里面创建的单位的函数明明使用了local unit u ,
可最后竟然没有set null.....
本来是想看暴雪是什么写的....谁知道他们竟然不写..只好来提问了.

如果是只用set null一次的话.是不是也仅限于单位变量? - 还是说点.特殊.单位组都可以set null一次...

    set u = CreateUnit( p, 'hgyr', -290.0, 44.1, 59.405 )
    set u = CreateUnit( p, 'hgyr', -199.2, -63.0, 131.873 )
    set u = CreateUnit( p, 'hgyr', -195.8, -168.1, 279.094 )
    set u = CreateUnit( p, 'hgyr', -249.0, -243.2, 85.619 )
    set u = CreateUnit( p, 'hgyr', -285.5, -324.0, 30.862 )
    set u = CreateUnit( p, 'hgyr', -177.4, -404.5, 205.374 )
    set u = CreateUnit( p, 'hgyr', -25.0, -388.8, 65.448 )
    set u = CreateUnit( p, 'hgyr', 144.0, -194.4, 207.263 )
    set u = CreateUnit( p, 'hgyr', 164.5, 1.5, 275.535 )
    set u = CreateUnit( p, 'hgyr', 118.8, 94.3, 129.071 )
    set u = CreateUnit( p, 'hgyr', 2.2, 166.1, 139.278 )
    set u = CreateUnit( p, 'hgyr', -205.1, 84.7, 209.779 )
    set u = CreateUnit( p, 'hgyr', -306.1, -152.0, 348.167 )
    set u = CreateUnit( p, 'hgyr', -295.2, -285.4, 44.166 )
    set u = CreateUnit( p, 'hgyr', -219.8, -406.7, 133.894 )
    set u = CreateUnit( p, 'hgyr', 37.8, -486.5, 318.339 )
    set u = CreateUnit( p, 'hgyr', 162.6, -386.5, 123.150 )
    set u = CreateUnit( p, 'hgyr', 187.2, -122.0, 53.670 )
    set u = CreateUnit( p, 'hgyr', -108.8, -4.5, 235.224 )
    set u = CreateUnit( p, 'hgyr', -398.8, -116.5, 282.225 )
    set u = CreateUnit( p, 'hgyr', -393.4, -222.9, 62.888 )
    set u = CreateUnit( p, 'hgyr', -328.8, -342.8, 171.853 )
发表于 2011-4-5 21:37:27 | 显示全部楼层
看来你还没有明白为什么需要set null:
        魔兽里面的物体每次被变量储存的时候,它的引用数都会增加一,当这个物体被删除时,如果它的引用数不为零,那么它占用的内存将不会被释放。
        这时候我们就需要将储存该物体的变量重新赋值,用来减少它的引用数,直到它的引用数为零的时候,物体占用的内存才能得到释放。
       反之,如果没有对变量进行重新赋值,那么这个物体将一直占用内存(即使他已经被删除),直到这个变量被重新赋值为止。

那么,根据以上内容,我们可以总结出以下几点:
①并不是set null减少了变量指向的单位的引用数,而是重新赋值减少了引用数。(set null也是重新赋值的一种)
如:
    set u = CreateUnit( p, '步兵', -290.0, 44.1, 59.405 )
    set u = CreateUnit( p, '骑士', -199.2, -63.0, 131.873 )
    set u = CreateUnit( p, '火枪', -195.8, -168.1, 279.094 )
此三句运行的最后结果:
    步兵引用数:0
    骑士引用数:0
    火枪引用数:1
结论:
    不需要每次赋值都set null一遍,只需要在变量的定义域结尾为其set null,对于局部变量来说,我们只需要在函数结尾处set null,因为只有变量最后指向的单位会增加引用数,因此:
    set u = CreateUnit( p, '骑士', -199.2, -63.0, 131.873 )
    set u = null
    set u = CreateUnit( p, '火枪', -195.8, -168.1, 279.094 )

    set u = CreateUnit( p, '骑士', -199.2, -63.0, 131.873 )
    set u = CreateUnit( p, '火枪', -195.8, -168.1, 279.094 )
的效果是一样的。
而楼主那一大串set u=CreateUnit()如果不set u=null的话,也只有最后一个单位泄露了。

②全局变量的定义域是从游戏开始到游戏结束,因此从①可知,对于全局变量,我们可以不用set null,因为我们可能还会用到它,在对其重新赋值的时候,前物体占用的内存就能得到释放。
(而由于WE储存预设单位的变量都是全局变量,暴雪并没有set null的语句。但是,由于这些全局变量没有能得到重新利用,因此在单位死亡之后,它所占用的内存并不会得到释放,也就是泄露了……这也是为什么我们最好减少预设单位的数量的原因)


③单位是物体,点也是物体,“引用数”是物体的共性,而不是单位的特性……因此单位和点是一样的…………
        
回复

使用道具 举报

 楼主| 发表于 2011-4-5 22:28:46 | 显示全部楼层
引用第1楼希瓦于2011-04-05 21:37发表的 :
看来你还没有明白为什么需要set null:
        魔兽里面的物体每次被变量储存的时候,它的引用数都会增加一,当这个物体被删除时,如果它的引用数不为零,那么它占用的内存将不会被释放。
        这时候我们就需要将储存该物体的变量重新赋值,用来减少它的引用数,直到它的引用数为零的时候,物体占用的内存才能得到释放。
       反之,如果没有对变量进行重新赋值,那么这个物体将一直占用内存(即使他已经被删除),直到这个变量被重新赋值为止。

.......

[s:202] [s:202]
表示激动....希瓦好耐心. 可以说是完全明白了.
谢谢.
有句话都忍不住了.....短信发给你好了...
回复

使用道具 举报

发表于 2011-10-11 23:37:32 | 显示全部楼层
原来是这样
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:55 , Processed in 0.041655 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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