Timer.lua 8.7 KB

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