源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

132 lines
3.6 KiB

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