源战役客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

131 行
3.6 KiB

  1. --[[@------------------------------------------------------------------
  2. : RunObj
  3. : deadline
  4. ----------------------------------------------------------------------]]
  5. Runner = Runner or BaseClass()
  6. local Runner = Runner
  7. function Runner:__init( )
  8. Runner.Instance = self
  9. local function generateRunner()
  10. local newRunner = {
  11. all_run_obj_list = {}, --用于标记某个模块是否已经注册,避免重复性的注册
  12. id_count = 0,
  13. curr_frame_count = 0, --当前的帧数
  14. --支持1 ~ 16帧的update方法调用频率
  15. priority_run_obj_list = {},
  16. elapse_time = {},
  17. }
  18. for i=1,16 do
  19. newRunner.elapse_time[i] = 0
  20. table.insert(newRunner.priority_run_obj_list, {})
  21. end
  22. return newRunner
  23. end
  24. self.updateRunner = generateRunner()
  25. self.lateUpdateRunner = generateRunner()
  26. end
  27. function Runner:getInstance()
  28. if Runner.Instance == nil then
  29. Runner.Instance = Runner.New()
  30. end
  31. return Runner.Instance
  32. end
  33. --[[@
  34. : Update中调用该方法,Update
  35. :
  36. :
  37. :
  38. : deadline
  39. ]]
  40. function Runner:Update( now_time, elapse_time )
  41. -- if G_DEBUG_STOP_ACTION then
  42. -- return
  43. -- end
  44. local runner = self.updateRunner
  45. runner.curr_frame_count = runner.curr_frame_count + 1
  46. for i, priority_tbl in pairs(runner.priority_run_obj_list) do
  47. runner.elapse_time[i] = (runner.elapse_time[i] or 0) + elapse_time
  48. if runner.curr_frame_count % i == 0 then
  49. for _, v in pairs(priority_tbl) do
  50. v:Update(now_time, runner.elapse_time[i])
  51. end
  52. runner.elapse_time[i] = 0
  53. end
  54. end
  55. end
  56. function Runner:LateUpdate( now_time, elapse_time )
  57. -- if G_DEBUG_STOP_ACTION then
  58. -- return
  59. -- end
  60. local runner = self.lateUpdateRunner
  61. runner.curr_frame_count = runner.curr_frame_count + 1
  62. for i, priority_tbl in pairs(runner.priority_run_obj_list) do
  63. runner.elapse_time[i] = (runner.elapse_time[i] or 0) + elapse_time
  64. if runner.curr_frame_count % i == 0 then
  65. for _, v in pairs(priority_tbl) do
  66. v:LateUpdate(now_time, runner.elapse_time[i])
  67. end
  68. runner.elapse_time[i] = 0
  69. end
  70. end
  71. end
  72. function Runner:AddRunObj( run_obj , priority_level )
  73. Runner.RealAddRunObj(self, self.updateRunner, run_obj, priority_level)
  74. if run_obj["Update"] == nil then
  75. LogError("Runner:AddRunObj try to add a obj not have Update method!")
  76. end
  77. end
  78. function Runner:AddLateRunObj( run_obj , priority_level )
  79. Runner.RealAddRunObj(self, self.lateUpdateRunner, run_obj, priority_level)
  80. if run_obj["LateUpdate"] == nil then
  81. LogError("Runner:AddLateRunObj try to add a obj not have LateUpdate method!")
  82. end
  83. end
  84. function Runner:RealAddRunObj(runner, run_obj, priority_level)
  85. local obj = runner.all_run_obj_list[run_obj]
  86. if obj ~= nil then
  87. --已经存在该对象, 不重复添加
  88. return false
  89. else
  90. --对象不存在,正常添加
  91. runner.id_count = runner.id_count + 1
  92. priority_level = priority_level or 1
  93. runner.all_run_obj_list[run_obj] = {priority_level, runner.id_count}
  94. runner.priority_run_obj_list[priority_level][runner.id_count] = run_obj
  95. end
  96. end
  97. --[[@
  98. : Runner中删除一个run_obj
  99. :
  100. run_obj
  101. :
  102. :
  103. : deadline
  104. ]]
  105. function Runner:RemoveRunObj(run_obj )
  106. Runner.RealRemoveRunObj(self, self.updateRunner, run_obj)
  107. end
  108. function Runner:RemoveLateRunObj(run_obj)
  109. Runner.RealRemoveRunObj(self, self.lateUpdateRunner, run_obj)
  110. end
  111. function Runner:RealRemoveRunObj(runner, run_obj)
  112. local key_info = runner.all_run_obj_list[run_obj]
  113. if key_info ~= nil then
  114. runner.all_run_obj_list[run_obj] = nil
  115. runner.priority_run_obj_list[key_info[1]][key_info[2]] = nil
  116. end
  117. end