Timer.lua 8.4 KB

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