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