Timer.lua 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. now = now or 0 --当前时间
  2. d = d or 0 --真实时间的偏移值
  3. local Config = require("Config")
  4. local Log = require("common.Log")
  5. local Monitor = require("core.Monitor")
  6. local ObjHuman = require("core.ObjHuman")
  7. local JjcLogic = require("jjc.JjcLogic")
  8. local FundLogic = require("present.FundLogic")
  9. local LoginSignLogic = require("loginSign.LoginSignLogic")
  10. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  11. local MiddleHeartBeat = require("middle.MiddleHeartBeat")
  12. local MiddleConnect = require("middle.MiddleConnect")
  13. local DrillLogic = require("drill.DrillLogic")
  14. local UnionWarMiddleLogic = require("union.UnionWarMiddleLogic")
  15. local UnionWarLogic = require("union.UnionWarLogic")
  16. local Util = require("common.Util")
  17. local UnionDBLogic = require("union.UnionDBLogic")
  18. local UnionLogic = require("union.UnionLogic")
  19. local BattleLogic = require("battle.BattleLogic")
  20. local CommonDB = require("common.CommonDB")
  21. local UnionWarDBLogic = require("union.UnionWarDBLogic")
  22. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  23. local QQApi = require("platform.QQApi")
  24. local ReportOnline = require("platform.ReportOnline")
  25. local LianyuLogic = require("lianyu.LianyuLogic")
  26. local YunYingLogic = require("yunying.YunYingLogic")
  27. local FcmLogic = require("fcm.FcmLogic")
  28. local SharePlatformLogic = require("present.SharePlatformLogic")
  29. local JjcGodWarLogic = require("jjcGodWar.JjcGodWarLogic")
  30. local JjcLadderLogic = require("jjcLadder.JjcLadderLogic")
  31. local DailyTaskLogic = require("dailyTask.DailyTaskLogic")
  32. local ValleyLogic = require("valley.ValleyLogic")
  33. local YjTreasureLogic = require("yjTreasure.YjTreasureLogic")
  34. local UnionWarLogic = require("union.UnionWarLogic")
  35. local WarReportMiddle = require("warReport.WarReportMiddle")
  36. local ZhanbuLogic = require("zhanbu.ZhanbuLogic")
  37. local BillboardLogic = require("billboard.BillboardLogic")
  38. local ChatRecord = require("chat.ChatRecord")
  39. local HeroGrowUp = require("absAct.HeroGrowUp")
  40. local AbsActLogic = require("absAct.AbsActLogic")
  41. local MoZhuMiddleLogic = require("mozhu.MoZhuMiddleLogic")
  42. local LostTempleLogic = require("lostTemple.lostTempleLogic")
  43. local MainDianLogic = require("MaiDian.MaiDianLogic")
  44. register_timer = {
  45. monitor = 60000, --
  46. offlineCheck = 10000, -- 离线校验
  47. saveChar = 1000, -- 用户存db
  48. onZhengDian = 15000,
  49. humanRefresh = 10000, -- 角色心跳刷新
  50. middleHeartbeat = 3000,
  51. dayCheck = 100, -- 天检测
  52. unionOfflineCheck = 1000, -- 公会会长离线时间检查
  53. paomaHerartbeat = 10000, -- 跑马灯心跳
  54. tenSecond = 10000, -- 10秒1次通用
  55. oneMin = 60000, -- 60秒1次通用
  56. reportOnline = 300000, -- 在线时长上报心跳
  57. fcm = 60000, -- 防沉迷
  58. jjcGodWar = 2000, -- 众神之战
  59. jjcLadder = 2000, -- 天梯争霸
  60. valley = 2000, -- 荣耀峡谷
  61. later = 1000, -- 1秒1次 专门为了一些大数据量的处理延后处理用
  62. }
  63. LATER_DAYA = LATER_DAYA or {} -- {ts,func,param1, param2, param3, param4}
  64. function monitor()
  65. print(_G.collectgarbage("count"))
  66. local humanCnt = ObjHuman.getOnlineCnt()
  67. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), humanCnt)
  68. Monitor.output()
  69. end
  70. function tenSecond()
  71. QQApi.onTimer()
  72. end
  73. function oneMin()
  74. MiddleConnect.onTimer()
  75. ZhanbuLogic.checkRecover()
  76. end
  77. function offlineCheck()
  78. _G.collectgarbage("step", 100000)
  79. ObjHuman.humanOfflineCheck()
  80. end
  81. function saveChar()
  82. ObjHuman.saveCharDB()
  83. end
  84. function humanRefresh()
  85. ObjHuman.refresh()
  86. end
  87. function doZhengDian(hour)
  88. -- 整点的时候刷新逻辑用的内存较多 这里gc一把
  89. _G.collectgarbage("step", 100000)
  90. if hour == 0 then
  91. YjTreasureLogic.onZero()
  92. YunYingLogic.onZero()
  93. for _, human in pairs(ObjHuman.onlineUuid) do
  94. ObjHuman.updateDaily(human)
  95. YunYingLogic.onZeroHuman(human)
  96. DailyTaskLogic.onLogin(human)
  97. end
  98. UnionLogic.onHour()
  99. LianyuLogic.onZero()
  100. SharePlatformLogic.onZero()
  101. WarReportMiddle.onZero()
  102. BillboardLogic.onZero()
  103. ChatRecord.CHAT_RECORD_REPETITION = {}
  104. HeroGrowUp.actLoop()
  105. LostTempleLogic.onZero()
  106. MainDianLogic.MaiDian_OnTime()
  107. end
  108. --if hour == 21 then
  109. -- if _G.is_middle ~= true then
  110. -- JjcLogic.onHour(hour)
  111. -- end
  112. --end
  113. JjcLogic.onHour(hour)
  114. if hour == 2 then
  115. local weekDay = Util.getWeekDay()
  116. if weekDay == 2 then
  117. -- 每周一凌晨2點 斷開鏈接 并且重新取一下php的跨服信息 重新連新跨服
  118. MiddleConnect.autoResetMiddle()
  119. end
  120. end
  121. UnionWarDBLogic.onHour(hour)
  122. AbsActLogic.onHour(hour)
  123. MoZhuMiddleLogic.onHour(hour)
  124. _G.collectgarbage("step", 100000)
  125. end
  126. lastUpDateTime = lastUpDateTime or nil
  127. function onZhengDian()
  128. if lastUpDateTime and (now - lastUpDateTime) < 180000 or 120000 < now % (1000 * 60 * 60) then
  129. return
  130. end
  131. lastUpDateTime = now
  132. local hour = os.date("%H", math.floor(now / 1000)) + 0
  133. print("onZhengDian", hour)
  134. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), 'gc befor')
  135. _G.collectgarbage("collect")
  136. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), 'gc after')
  137. doZhengDian(hour)
  138. end
  139. function dayCheck()
  140. local call = 1
  141. local now = os.time()
  142. local resetTime = CommonDB.getResetTime()
  143. if resetTime == 0 then
  144. CommonDB.setResetTime(now)
  145. return
  146. end
  147. if call == 1 then
  148. local sameDay = Util.isSameDay(resetTime, now)
  149. call = sameDay == nil and 0 or 1
  150. end
  151. if call == 0 then
  152. CommonDB.setResetTime(now)
  153. DrillLogic.dayCheck()
  154. end
  155. end
  156. function middleHeartbeat()
  157. MiddleHeartBeat.heartbeat()
  158. end
  159. function unionOfflineCheck()
  160. UnionLogic.onTimer()
  161. end
  162. function paomaHerartbeat()
  163. ChatPaoMaLogic.onTimer()
  164. end
  165. function reportOnline()
  166. ReportOnline.onTimer()
  167. end
  168. function fcm()
  169. FcmLogic.onTimer()
  170. end
  171. function jjcGodWar()
  172. JjcGodWarLogic.onTimer()
  173. end
  174. function jjcLadder()
  175. JjcLadderLogic.onTimer()
  176. end
  177. function valley()
  178. ValleyLogic.onTimer()
  179. end
  180. function later()
  181. if LATER_DAYA[1] == nil then
  182. return
  183. end
  184. local tempData = LATER_DAYA[1]
  185. local now = os.time()
  186. local ts = tempData.ts
  187. if ts <= now then
  188. table.remove(LATER_DAYA, 1)
  189. tempData.func(tempData.param1, tempData.param2, tempData.param3, tempData.param4)
  190. end
  191. end
  192. last_exe_time = last_exe_time or {}
  193. function handlerTime(msec)
  194. now = msec + d
  195. if not register_timer[last_exe_func] then
  196. last_exe_func = nil
  197. end
  198. local tmp = last_exe_func
  199. while true do
  200. local k, v = next(register_timer, last_exe_func)
  201. if not k then
  202. k, v = next(register_timer)
  203. end
  204. if not k then
  205. return
  206. end
  207. last_exe_func = k
  208. local last_time = last_exe_time[k]
  209. if last_time then
  210. if last_time + v <= now then
  211. last_exe_time[k] = now
  212. Monitor.handleTimer(_ENV[k], now - last_time, k)
  213. break
  214. end
  215. else
  216. last_exe_time[k] = now
  217. break
  218. end
  219. if k == tmp then
  220. return
  221. end
  222. end
  223. end
  224. local function cmpLater(a, b)
  225. return a.ts < b.ts
  226. end
  227. function addLater(laterSec, func, param1, param2, param3, param4)
  228. local tempData = {}
  229. tempData.ts = os.time() + laterSec
  230. tempData.func = func
  231. tempData.param1 = param1
  232. tempData.param2 = param2
  233. tempData.param3 = param3
  234. tempData.param4 = param4
  235. table.insert(LATER_DAYA, tempData)
  236. table.sort(LATER_DAYA, cmpLater)
  237. end