聊天系统设计

聊点啥天

提到聊天,我们会联想到QQ,微信,那么游戏中的聊天系统和它们有什么不同?本质上其实是一样的,都是分发聊天消息。很简单嘛,对每个需要通知到的玩家,挨个发消息不就得了。

核心业务需求

收到策划的通知,我们游戏要加个聊天功能,需求很简单,明天就要,应该没问题吧?

  1. 支持玩家与玩家私聊 保存所有历史记录
  2. 支持队伍内聊天 队伍未解散前保留所有历史记录
  3. 支持公会内聊天 保留最新的100条发言
  4. 支持世界聊天 百万在线级别
  5. 支持频道世界聊天 每个频道限制人数2k,支持999个频道
  6. 敏感词过滤
  7. 广告过滤
  8. 玩家举报功能,后台支持查看玩家被举报次数,实施举报行为玩家信息,防止恶意举报
  9. 后台支持玩家历史发言记录查询
  10. 后台支持禁言操作
  11. 支持查看游戏道具链接
  12. 支持在聊天界面选中查看其他发言玩家主要信息

好家伙,我就聊个天,搞这么多需求是要闹哪样?
作为一个业务实力过硬的后端程序员,我们不能慌,将需求逐一分析,总结归纳。

  • 我们总结出核心需求: 发消息。我们可以把队伍,工会,世界也看做一个一个的频道,相应的玩家订阅合适的频道,根据订阅者逐一发消息。对应观察者模式。
  • 世界聊天比较特殊,百万在线玩家全部转发消息,对于带宽压力很大,先做一个估算,通过设置聊天冷却,平均每秒有0.1%的玩家发世界聊天消息,每条消息平均100字节,广播放大1000000倍,那就是800Gb带宽。(⊙o⊙)…这么多带宽,得多少钱?一台机器200Mb带宽,需要4000台!!!太贵了,不行,我得想想办法,把带宽降下来。办法1: 世界聊天成本这么高,可以通过消耗道具或者加大聊天冷却的方式,降低平均消息频率,降到0.01%,平均每秒控制在100条左右。办法2: 聊天消息集中在一起时,可以通过合并消息->压缩 来降低包体的体积,把每秒收集的100条消息合并压缩后变成一条消息,压缩率平均为50%,那么这一条消息大小为5KB,广播放大后为40Gb带宽,需要200台机器。哈哈,一下子省了20倍。办法3: 在线玩家数量也不是一下子到100万,可以灵活伸缩,10万在线时,需要带宽为400Mb,只需要2台机器就够了,在线数量往上涨后,自动扩容用于聊天的服务器。
  • 敏感词过滤,广告过滤,道具链接等等都可以归纳为对聊天文本的处理,而且处理一次即可
  • 后台需要支持一些聊天的功能,我们需要存储数据并预留接口。禁言功能需要预留禁言接口,查询历史发言记录,需要将玩家的发言都记录下来。举报相关信息也要记下来。这些记录都是存储一次,可被查询多次。
  • 玩家对其他玩家的发言可以查看 道具,查看玩家基本信息等功能。这些基本信息都可以存储到缓存中,设置一个合理的过期时间。
  • 玩家的私聊可以直接存储到个人聊天的表记录中。

归纳完毕之后,是不是没有那么复杂了呢?后台的功能我们可以先放一放,先实现优先级更高的消息分发,消息订阅。找策划沟通世界聊天的成本问题。

具体的实现因为不同类型的后端框架也不一样,就不详细展开了。

说点别的

我认为游戏中的聊天有一些特殊性。首先它自带游戏话题属性,游戏中总是有的聊,队伍聊天自带组队下副本话题,工会聊天自带工会事务话题;然后,很多聊天都是临时性的,在游戏玩法结束后失效;其次,游戏中聊天玩家都是以游戏虚拟身份进行,除了某些重度社交游戏,大部分都是代入虚拟身份;再其次,聊天也是游戏官方给所有玩家发消息的单向通道,比如很多游戏都有的跑马灯公告。最后,游戏要展示其核心功能,聊天作为非核心功能,占据的屏幕尺寸会受到限制,和纯聊天软件相比,并不是特别友好。因此很多玩家都会在游戏之外,QQ微信上创建自己的游戏群,方便更多的交流,作为游戏聊天的补充。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值