关于服务器内玩家下线的处理逻辑
本篇文章仅适用于自己公司内的一套服务器框架,是个人笔记,无通用性:
对于玩家的管理,统一在/common/user_mgr.lua中实现,相对应的玩家掉线处理函数也在这里面注册。
require("event.register").register_handler("ClientDisconnected", on_disconnected)
远程注册的掉线函数,在掉线后会回调on_disconnected()函数,相应的房间清理等逻辑只需要在该函数中实现即可。
local function on_disconnected(session_id)
log:info("Client(%u) disconnected.", session_id)
-- for manager user erase
M.erase(session_id)
-- 由 dispatcher 统一广播到其他服
-- 通知对战房间
local c_util = require("c_util")
local my_svr_id = c_util.get_my_svr_id()
assert(my_svr_id > 0)
local client_id = cid_hlpr.client_id(my_svr_id, session_id)
require("demo.room_mgr").on_disconnected(client_id)
end -- on_disconnected()
在room_mgr中处理相应的内存释放逻辑
-- 玩家下线事件处理器。
function M.on_disconnected(client_id)
log:info("room_mgr:on_disconnected")
local room = M.get(client_id)
if room then
timer_queue:erase(room.frame_time_id) --清空房间定时器
timer_queue:erase(room.colider_time_id)
M.erase(room)
room:on_disconnected() --房间内存清理
if room ~= nil then
room = nil --内存清理
end
log:info("room had erased")
end
-- if room
end -- on_disconnected()