Leaf 在消息广播上,没有做任何的优化,使用最简单粗暴的方式。
管理用户
游戏服务器一定需要用户管理,最常见的方式就是建立用户 ID 到用户实例的映射关系(还有可能存在用户帐号 ID、用户名到用户实例的映射关系)。例如:
users = make(map[int]*User)
User 本身为了简单,可以直接组合 Agent:
type User struct {
gate.Agent
}
这样的话,广播消息就是:
for _, user := range users {
user.WriteMsg(msg)
}
一个最简单的广播的例子
本例子只是为了简单演示,而没有任何实际使用意义。
打开 Leafserver game/internel/chanrpc.go 文件,加入一个全局变量:
var agents = make(map[gate.Agent]struct{})
agents 的管理:
// agent 被创建时
func rpcNewAgent(args []interface{}) {
a := args[0].(gate.Agent)
agents[a] = struct{}{}
}
// agent 被关闭时
func rpcCloseAgent(args []interface{}) {
a := args[0].(gate.Agent)
delete(agents, a)
}
由此可见 agents 中保存了当前所有连接,广播的处理:
for a := range agents {
a.WriteMsg(msg)
}