新版Lua服务器下线处理

关于服务器内玩家下线的处理逻辑

本篇文章仅适用于自己公司内的一套服务器框架,是个人笔记,无通用性:


  对于玩家的管理,统一在/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()
发布了47 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/it_wjw/article/details/75947987