疯人¢衰人 发表于 2009-9-6 09:42:29

简单的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]
查看完整版本: 简单的timer系统(GC,数组两版……)