--[[@------------------------------------------------------------------
|
|
说明: 根据外部设定的优先级在每一帧中依次执行所有托管的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
|