找回密码
 点一下
查看: 2705|回复: 8

水区找不到,只好来这发问题了,关于 TriggerClearConditions

[复制链接]
发表于 2007-5-20 22:46:58 | 显示全部楼层 |阅读模式
TriggerClearConditions()这个函数不知道能不能达到我的要求
代码如下
function f2 takes nothing returns boolean
   call  TriggerClearConditions(GetTriggeringTrigger())
   call DestroyTrigger(GetTriggeringTrigger())
   return false   
endfunction

function f1 takes nothing returns nothing
    local trigger t=CreateTrigger()
    local triggercondition c = TriggerAddCondition(t, Condition(function f2))
endfunction

假设局部触发通过f1成功注册了,当响应事件执行f2时,能不能通过f2来把局部触发变量t 和条件变量c从内存中释放?
不想造成内存泄露,也不想用游戏缓存,因为要使用大量handle to string  ,造成string的内存泄露....
发表于 2007-5-26 13:29:36 | 显示全部楼层
不能,这个函数只是使条件脱离触发,而并不会删除它,要删除还是要用缓存的,但是这个并不会产生多少string泄露。
"TriggerCondition"只会产生1个string
I2S产生的字符串也是很有限的,并且I2S产生的字符串都是重复利用率很高的
只要注意尽量不要用I2S(h2i(xxx))+"xxx"这种格式,其它string泄漏都可以忽略

function f2 takes nothing returns boolean
    local trigger trg = GetTriggeringTrigger()
    call  TriggerRemoveCondition(trg,i2tc(GetStoredInteger(udg_GC,I2S(h2i(trg)),"TriggerCondition")))
    call DestroyTrigger(trg)
    call FlushStoredMission(udg_GC,I2S(h2i(trg)))
    set trg = null
  return false  
endfunction

function f1 takes nothing returns nothing
    local integer t=h2i(CreateTrigger())
    local integer c = h2i(TriggerAddCondition(t, Condition(function f2)))
    call StoreInteger(udg_GC,I2S(t),"TriggerCondition",c)
endfunction
回复

使用道具 举报

 楼主| 发表于 2007-5-27 00:10:31 | 显示全部楼层
一周的时间没有白等,老狼真是个热心肠的人,万分感谢
回复

使用道具 举报

 楼主| 发表于 2007-5-27 00:28:39 | 显示全部楼层
老狼能不能留下联系方式,想多和你讨论讨论 [s:41]
回复

使用道具 举报

发表于 2007-5-27 01:35:09 | 显示全部楼层
我认为没有泻露.
理由1:
同一个String好像只在内存中生成一个实例.
就是说你调用1000次TriggerAddCondition(function loveyou)也只是生成一个loveyou字符串.
理由2:
最好自己定的函数没有condition,有condition反而不好控制,不如全放到action里.
理由3:
真正要清理的是events.这个东西多了才占资源,events发生的次数直接影响函数运行次数.
尽可量的找到最优的events集.一些发生次数相当高的要想办法不用.
比如:EVENT_PLAYER_UNIT_ATTACKED



上面说的确实有问题,我自己都是经常删trigger,因为我从没想过删condition.
回复

使用道具 举报

发表于 2007-5-28 08:59:33 | 显示全部楼层
1: 会生成1000个triggercondition
2: action的效率和condition是没法比的,所以我向来都不用action,而是把动作写在condition里;而且就算是写T无法做到这点,condition也是越准确越好
3:其实把动作写在condition和这道理是一样的,用以下这种方式在condition里写动作,触发就永远不会被激活,而触发的激活是很占资源的。
function f2 takes nothing returns boolean
  //do anything
  return false  
endfunction
回复

使用道具 举报

发表于 2007-5-28 09:06:27 | 显示全部楼层
引用第3楼leon于2007-05-27 00:28发表的  :
老狼能不能留下联系方式,想多和你讨论讨论 [s:41]

qq:86958186
回复

使用道具 举报

发表于 2007-5-28 10:18:03 | 显示全部楼层
[codes=jass]
function justATest takes unit u returns nothing
             local trigger  attack//注册一个新触发
              call  WriteUnit(u,attack,"attack")//传过去一些必要的参数,有些时候无法用传参,就用GameCache了
              call Trigger.................................//事件
              call TriggerAddCondition............//条件
              call TriggerAddEvent...................//动作(动作里也有删除触发语句)
            
             TriggerSleepAction(XX)//过期删除(这个时间并不要求精确)
              DestroyTrigger(....)
             set attack=null
endfucntion
[/codes]

Red_Wolf,我习惯上都是这么写触发的,这么写有问题么?(我看dota也这么写,地图一样没有问题啊)
回复

使用道具 举报

发表于 2007-5-28 10:55:21 | 显示全部楼层
这并不是有问题。暴雪的地图都是这样写的。

老狼只是因为一个效率的问题。
比如有一量可以开300公里的车子。在城市这种地方能开80已经很快了。
但是如果要追求速度。在高速路上(就当高速路米限制好了),它可以达到最高速度。

但是我们并不会说在城市里开几十公里就是像蜗牛一样慢。当然也不是说几十公里就够了,当然人人都希望速度快了。特别是要赶几千里路的时候。嗯嗯。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 10:26 , Processed in 0.034702 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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