--scale false 采用deltaTime计时,true 采用 unscaledDeltaTime计时 --初略的版本 以后有时间再优化完善 TimerQuest = TimerQuest or BaseClass() local TimerQuest = TimerQuest local Time = Time local Status = Status local Array = Array local table_insert = table.insert local table_sort = table.sort function TimerQuest:__init() self.timer_list = {} self.update_delta_time = 0 self.timer_list2 = {} self.update_delta_time2 = 0 self.timer_list3 = {} self.update_delta_time3 = 0 self.update_count = 0 self.waitfor_call_back_list = false self.timer_list_index = 0 self.timer_cache_queue = Array.New() LateUpdateBeat:Add(TimerQuest.Update,self) end function TimerQuest:AddPeriodQuest(onLeftTimeHandler,duration,loop,smooth) self.timer_list_index = self.timer_list_index + 1 local timer = nil if Array.GetSize(self.timer_cache_queue) > 0 then timer = Array.PopFront(self.timer_cache_queue) timer.add_time = self.timer_list_index timer.duration = duration timer.loop = loop or -1 timer.func = onLeftTimeHandler timer.time = duration timer.count = Time.frameCount + 1 timer.smooth = smooth --smooth会忽略每一帧跟duration的校正差值,保证每次回调周期都是一致的,但是会导致总时间延长 -- timer.source = PrintFunctionCallPos("AddPeriodQuest") else timer = { add_time = self.timer_list_index, duration = duration, loop = loop or -1, func = onLeftTimeHandler, time = duration, -- source = PrintFunctionCallPos("AddPeriodQuest"), count = Time.frameCount + 1, smooth = false, } end if duration <= 0.6 then self.timer_list[self.timer_list_index] = timer elseif duration <= 2 then self.timer_list2[self.timer_list_index] = timer else self.timer_list3[self.timer_list_index] = timer end return self.timer_list_index end function TimerQuest:AddDelayQuest(onLeftTimeHandler,duration) self.timer_list_index = self.timer_list_index + 1 local timer = nil if Array.GetSize(self.timer_cache_queue) > 0 then timer = Array.PopFront(self.timer_cache_queue) timer.add_time = self.timer_list_index timer.duration = duration timer.loop = 0 timer.func = onLeftTimeHandler timer.time = duration timer.count = Time.frameCount + 1 timer.smooth = false else timer = { add_time = self.timer_list_index, duration = duration, loop = 0, func = onLeftTimeHandler, time = duration, count = Time.frameCount + 1, smooth = false, } end if duration <= 0.6 then self.timer_list[self.timer_list_index] = timer elseif duration <= 2 then self.timer_list2[self.timer_list_index] = timer else self.timer_list3[self.timer_list_index] = timer end return self.timer_list_index end function TimerQuest:CancelQuest(id) if id then local delete_vo = self.timer_list[id] if not delete_vo then delete_vo = self.timer_list2[id] end if not delete_vo then delete_vo = self.timer_list3[id] end if delete_vo then if Array.GetSize(self.timer_cache_queue) <= 20 then Array.PushBack(self.timer_cache_queue, delete_vo) end self.timer_list[id] = nil self.timer_list2[id] = nil self.timer_list3[id] = nil end end end function TimerQuest:HandlerTimer(vo, i, frame_count) if vo.time <= 0 and frame_count > vo.count then if vo.loop > 0 then vo.loop = vo.loop - 1 if vo.smooth then vo.time = vo.duration else vo.time = vo.time + vo.duration end end if vo.loop == 0 then self:CancelQuest(i) elseif vo.loop < 0 then if vo.smooth then vo.time = vo.duration else vo.time = vo.time + vo.duration end end vo.func() end end function TimerQuest:Update() -- if G_DEBUG_STOP_ACTION then -- return -- end local delta = Time.deltaTime local frame_count = Time.frameCount self.update_count = self.update_count + 1 for i,vo in pairs(self.timer_list) do vo.time = vo.time - delta self:HandlerTimer(vo, i, frame_count) end self.update_delta_time2 = self.update_delta_time2 + delta if self.update_count % 9 == 0 then for i,vo in pairs(self.timer_list2) do vo.time = vo.time - self.update_delta_time2 self:HandlerTimer(vo, i, frame_count) end self.update_delta_time2 = 0 end self.update_delta_time3 = self.update_delta_time3 + delta if self.update_count % 29 == 0 then for i,vo in pairs(self.timer_list3) do vo.time = vo.time - self.update_delta_time3 self:HandlerTimer(vo, i, frame_count) end self.update_delta_time3 = 0 end end