简单的timer系统(GC,数组两版……)
用GC做存储的系统的话很容易因为使用过多的计时器而导致string泄露
恩恩……
这个泄露实际上就是用了过多的timer
于是用于存储的handle值字符串过多而出现的
于是做了个简单的系统:
globals
integer udg_Head = 0
integer udg_Exist = 0
timer array udg_TimerList
endglobals
function LoadTimer takes nothing returns timer
set udg_TimerList = null
if udg_Exist == 0 then
return CreateTimer()
endif
set udg_Head = udg_Head + 1
if udg_Head == 8190 then
set udg_Head = 0
endif
set udg_Exist = udg_Exist - 1
return udg_TimerList
endfunction
function SaveTimer takes timer t returns nothing
if udg_Exist == 8190 then
call DestroyTimer(t)
return
endif
set udg_TimerList[(udg_Head + udg_Exist) - (udg_Head + udg_Exist) / 8190 * 8190] = t
set udg_Exist = udg_Exist + 1
endfunction
如以上函数
使用也很简单
用LoadTimer获得timer
用SaveTimer排泄即可
如果想使用数组的存储系统
globals
integer udg_Head = 0
integer udg_UsedTimerNum = -1
timer array udg_UseTimer
timer array udg_TimerList
endglobals
function StartDoing takes nothing returns nothing
local integer i = 0
loop
set udg_UseTimer = CreateTimer()
set i = i + 1
exitwhen i == 8190
endloop
endfunction
function LoadTimer takes nothing returns timer
if udg_Head == 0 then
if udg_UsedTimerNum == 8190 then
return null
endif
set udg_UsedTimerNum = udg_UsedTimerNum + 1
return udg_UseTimer
endif
set udg_Head = udg_Head - 1
return udg_TimerList
endfunction
function SaveTimer takes timer t returns nothing
call PauseTimer(t)
set udg_TimerList = t
set udg_Head = udg_Head + 1
endfunction
游戏初始化时执行StartDoing,
此系统存储结构类似handle,有数组8192上限
然后使用方法同GC的
用获得的timer的handle值对8190的模的余数作为存储数组的序号即可
GC版无同时运行timer上限,数组的有8191个timer为上限
以上函数未经测试……
纯属虚构……
如有问题……
纯属失误……
页:
[1]