Room#
见于 src/server/room 。需要动态创建和释放。可能受Lua依赖。
没持有着其他动态分配释放的类型。
对象创建和管理者#
都是RoomManager。
当Lobby收到 CreateRoom 后,调用RoomManager的接口创建房间。
房间在RoomManager中通过 std::map<int, std::shared_ptr<Room>> 管理。
使用场景#
为大厅分担玩家,玩家不能同时在大厅和房间。
为运行在Lua中的房间提供支持。
释放时机#
不被Lua需要,且房间内不存在socket存活的Player。
实现详情#
关于被Lua需要#
房间有个受mutex保护的 lua_ref_count ,保存Lua的引用计数。当引用计数大于0就不能释放。
当房主按下“开始游戏”后,调用 Room::manuallyStart() ,此时Room必须绑定一个RoomThread,
若满足这一点则游戏开始,引用计数应该立刻+1。
警告
假设Lua一侧的寻找房间和开始游戏必定成功。这里没有错误处理,需要服主把关
当游戏结束后,Lua代码负责减少引用计数。Lua首先将Lua room删除,然后通过rpc调用方法 令房间的引用计数-1(可以认为立刻生效)。引用计数减为0时进行可释放检查。
关于是否存在人类#
在Lua计数为0的前提下,若房间内不存在人类了,则认为应该释放。
因为Lua中也有房间无人则GameOver的机制,因此当房内最后一名人类消失时(掉线、逃跑), 若仍被Lua需要,则通过pushRequest让Lua知道房间可能已经被释放,否则直接释放。
因为主线程可能处理加入房间的请求,因此整套房间的释放条件判定以及释放必须在主线程执行。
关于释放#
释放房内不是人类的玩家。
将旁观者移除房间,若不为人类则释放。
将绑定的RoomThread的引用计数-1。