|
|
- --[[@------------------------------------------------------------------
- 说明: 根据外部设定的优先级在每一帧中依次执行所有托管的RunObj
- 作者: deadline
- ----------------------------------------------------------------------]]
- Runner = Runner or BaseClass()
- local Runner = Runner
- function Runner:__init( )
- Runner.Instance = self
- local function generateRunner()
- local newRunner = {
- all_run_obj_list = {}, --用于标记某个模块是否已经注册,避免重复性的注册
- id_count = 0,
- curr_frame_count = 0, --当前的帧数
-
- --支持1 ~ 16帧的update方法调用频率
- priority_run_obj_list = {},
- elapse_time = {},
- }
- for i=1,16 do
- newRunner.elapse_time[i] = 0
- table.insert(newRunner.priority_run_obj_list, {})
- end
- return newRunner
- end
- self.updateRunner = generateRunner()
- self.lateUpdateRunner = generateRunner()
- end
-
- function Runner:getInstance()
- if Runner.Instance == nil then
- Runner.Instance = Runner.New()
- end
- return Runner.Instance
- end
-
-
- --[[@
- 功能: 主Update中调用该方法,触发托管对象的Update
- 参数:
- 无
- 返回值:
- 无
- 其它: 无
- 作者: deadline
- ]]
- function Runner:Update( now_time, elapse_time )
- -- if G_DEBUG_STOP_ACTION then
- -- return
- -- end
- local runner = self.updateRunner
- runner.curr_frame_count = runner.curr_frame_count + 1
- for i, priority_tbl in pairs(runner.priority_run_obj_list) do
- runner.elapse_time[i] = (runner.elapse_time[i] or 0) + elapse_time
- if runner.curr_frame_count % i == 0 then
- for _, v in pairs(priority_tbl) do
- v:Update(now_time, runner.elapse_time[i])
- end
- runner.elapse_time[i] = 0
- end
- end
- end
-
- function Runner:LateUpdate( now_time, elapse_time )
- -- if G_DEBUG_STOP_ACTION then
- -- return
- -- end
- local runner = self.lateUpdateRunner
- runner.curr_frame_count = runner.curr_frame_count + 1
- for i, priority_tbl in pairs(runner.priority_run_obj_list) do
- runner.elapse_time[i] = (runner.elapse_time[i] or 0) + elapse_time
- if runner.curr_frame_count % i == 0 then
- for _, v in pairs(priority_tbl) do
- v:LateUpdate(now_time, runner.elapse_time[i])
- end
- runner.elapse_time[i] = 0
- end
- end
- end
-
-
- function Runner:AddRunObj( run_obj , priority_level )
- Runner.RealAddRunObj(self, self.updateRunner, run_obj, priority_level)
- if run_obj["Update"] == nil then
- LogError("Runner:AddRunObj try to add a obj not have Update method!")
- end
- end
-
- function Runner:AddLateRunObj( run_obj , priority_level )
- Runner.RealAddRunObj(self, self.lateUpdateRunner, run_obj, priority_level)
- if run_obj["LateUpdate"] == nil then
- LogError("Runner:AddLateRunObj try to add a obj not have LateUpdate method!")
- end
- end
-
- function Runner:RealAddRunObj(runner, run_obj, priority_level)
- local obj = runner.all_run_obj_list[run_obj]
- if obj ~= nil then
- --已经存在该对象, 不重复添加
- return false
- else
- --对象不存在,正常添加
- runner.id_count = runner.id_count + 1
- priority_level = priority_level or 1
- runner.all_run_obj_list[run_obj] = {priority_level, runner.id_count}
- runner.priority_run_obj_list[priority_level][runner.id_count] = run_obj
- end
- end
-
- --[[@
- 功能: 从Runner中删除一个run_obj
- 参数:
- run_obj
- 返回值:
- 无
- 其它: 无
- 作者: deadline
- ]]
- function Runner:RemoveRunObj(run_obj )
- Runner.RealRemoveRunObj(self, self.updateRunner, run_obj)
- end
-
- function Runner:RemoveLateRunObj(run_obj)
- Runner.RealRemoveRunObj(self, self.lateUpdateRunner, run_obj)
- end
-
- function Runner:RealRemoveRunObj(runner, run_obj)
- local key_info = runner.all_run_obj_list[run_obj]
- if key_info ~= nil then
- runner.all_run_obj_list[run_obj] = nil
- runner.priority_run_obj_list[key_info[1]][key_info[2]] = nil
- end
- end
|