找回密码
 点一下
查看: 772|回复: 2

额,大家来讨论下这个东西,我想优化下代码,因为量太大了,不知道什么东西可以改善

[复制链接]
发表于 2011-8-14 12:03:21 | 显示全部楼层 |阅读模式
Ga的大神们,我整理了一下这个问题,我昨天看IceFrog的代码,发现他有这样一些相关的函数,我改的DOTA会出现这样一种状况,要么很快要么过了很久,一些触发就突然没用了,比如幽鬼的大,比如虚空的大,使用物品,连TEST模式的-refresh都没用了。恩,在问一个问题,触发只要一建立,不管是全局的还是局部的,都一直在了么?把他置空都没用?那为什么IF要写这个类似回收的机制,函数见下:
首先我发现的是这样一个函数
Dy是integer全局
Dx是触发全局数组
DX是real全局,XA4这个函数是查看当前游戏流逝的时间 l5这个函数是一个TEXT警告,就是说超过8000就做一个警告
说实话,我修改后触发了这个警告

[jass]function H8I takes trigger t returns nothing
call DisableTrigger(t)
set Dy=Dy+1
set Dx[Dy]=t
set DX[Dy]=XA4()+60
if Dy>8000 then
call l5()
endif
endfunction[/jass]

我的理解 这个函数是停止正在运行的trigger并做数量统计和时间记录

下面看下一个函数
[jass]function l7 takes integer i returns nothing
if i!=Dy then
set Dx=Dx[Dy]
set DX=DX[Dy]
endif
set Dx[Dy]=null
set DX[Dy]=0
set Dy=Dy-1
endfunction[/jass]

这个函数就是对已经回收的触发统计做改变
最重要是下面这个函数
[jass]function l8 takes nothing returns boolean
local real YM4=XA4()
local integer i
set i=1
loop
exitwhen i>Dy
if DX<YM4 then
if Dx==null or IsTriggerEnabled(Dx)then
call l5()
else
call DestroyTrigger(Dx)
endif

call l7(i)
else
set i=i+1
endif

endloop
return false
endfunction[/jass]
YM4是游戏现在的逝去时间,他貌似是在检查他记录的所有触发的时间(+60秒)是不是小于游戏逝去时间,如果是就调用l7函数做减法统计,如果不是就继续检查。内部的if语句是在看这个是不是空的或者这个触发是不是为开启状态,如果是就做警告,不是就摧毁这个触发。
恩,还有l8这个函数他是每15秒运行一次
[jass]set t=CreateTrigger()
call TriggerRegisterTimerEvent(t,15.,true)
call TriggerAddCondition(t,Condition(function l8))[/jass]
请问哪位大神能详细的帮我讲解一下这个的意思和用意,还有IF为什么要这么做,他是想检查一个神马东西?


还有 刚才看了帖子说 动作写在条件里实际上不会永久占用内存,把Trigger置空了就顺便排泄了,如果写在Action里那就会占用内存无法排泄,这.....真是这样么,怎么感觉暴雪这样很鸡肋啊
发表于 2011-8-14 19:12:31 | 显示全部楼层
貌似是它的排泄系统,大约60秒后摧毁指定触发,Dx是个回收站的作用。8000是防止数组越界(8192的上界)。(以上口胡仅供参考)
回复

使用道具 举报

 楼主| 发表于 2011-8-15 11:10:22 | 显示全部楼层

回 1楼(幻之皮卡丘) 的帖子

额  那他这样的意思是说触发只要建立了就必须用Destroy来摧毁?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 09:13 , Processed in 0.060464 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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