Timer.lua 8.2 KB

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