Timer.lua 8.9 KB

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