为什么写作这个系列

GDC(Game Developers Conference)是游戏界最富盛名的开发者大会,每年有来自全球各地的顶级游戏开发者分享前沿的游戏设计、技术和运营经验。

GDC上的技术分享,以客户端和渲染类的居多,服务器相关的相对小众。不过仔细找找还是能找到不少关于服务器的高质量内容,其中不乏来自知名游戏的干货分享,如《Sky光·遇》《星战前夜## 标题》。中国的腾讯、网易也带来过不少服务器相关的分享。

本系列将会分享近几年(2020——2023)服务器主题下的演讲,通过阅读本系列,读者可以了解业界最新的服务器技术开发前沿,有助于开阔眼界、活跃思路。

本次分享为大家带来的是GDC 2023上的《在《黑道圣徒》的boss工厂中创建可扩展和吸引人的用户生成内容》(Creating Scalable and Engaging User Generated Content in ‘Saints Row Boss Factory’)。PPT和演讲视频可分别点击链接获取。通过学习本分享可以获得以下收获:

  1. 如何设计一个可扩展的UGC系统架构,包括内容存储方案。
  2. 如何对UGC有效监管。
  3. UGC系统上线遇到的技术问题及处理经验分享。

以下为详细内容分享。

基本介绍

《黑道圣徒》是一个经典的犯罪题材RPG游戏IP,玩家可以扮演黑道与其他人进行畅快淋漓的枪战。这次演讲的内容来自最新发售的《黑道圣徒》重启版。在这个版本中,新增了Boss Factory的功能,玩家可以自定义角色的容貌和道具,并允许在线上与他人分享。

演讲人是一位印度哥们,印度口音不重,发音清晰标准。他自述从产品经理转到开发,拥有10多年的跨行业服务器经验,以及4年多的游戏服务器经验。

Boss Factory功能在游戏正式发售前就已经提供给玩家,最高时一天有多于13万的boss创建量,这给服务器架构带来了一定挑战。

架构

线上服务主要包括:

  1. IAM Service:用户服务,包括用户验证、管理和封禁。
  2. UGC Service:用户生成内容服务,包括内容分享、浏览以及点赞、关注等。
  3. Reporting Service:举报服务,包括举报内容、内容监管。

以上所有的服务都用AWS托管,不同服务之间使用Kafka做消息传递。

存储这块按数据类型分为:

  1. UGC元数据:存储在MongoDB中,并对MongoDB做主从读写分离。MongoDB的优势在于灵活的非结构性数据,这对于快速的版本迭代(新增元数据字段)是非常有利的。
  2. UGC文件:包括图片和模型类资源,来自玩家上传的自制角色。这一块使用AWS的S3(Amazon Simple Storage Service)做存储。S3是Amazon提供的对象存储服务,可用于存储各种类型的文件(图片、文本、视频等)。对象存储可以简单地理解为一个加强版的CDN存储,不同点在于:对象存储仅用一个key就能获取到存储的对象(文件),没有传统文件存储中文件夹的概念。而且S3还提供了权限管理、版本管理等普通CDN存储没有的功能。
  3. 策划数据:包括管理员精选的内容和创作者。此处使用的存储方式Cloud Save应该是指Google Play Services为游戏提供的一种轻量级云存储方案。

笔者认为这个系统更像是互联网服务或者游戏中台,而非游戏服务,原因在于它提供的功能都是无状态的。所以在设计上使用了大量的云原生技术,服务器全部托管在AWS上,方便快速弹性扩展。

内容监管

对于一个UGC系统来说,很可能会出现违禁的内容,因此内容监管十分重要。

内容监管以玩家举报加后台管理相结合的方式进行。玩家可以对疑似违禁的内容进行举报,举报生成的流程单会在管理创建,管理员可以据此做出处理决定(删除内容或封禁用户)。管理员也可以自定义处理规则,例如超过5人举报则内容自动删除。

跨平台实现

Boss Factory同时支持在游戏端和网页端访问,因此有不同的用户验证方式。

在游戏端登录,直接使用第一方的账户系统(Epic、Xbox、PS);在网页端登录,需要使用一个叫OIDC的通用账户系统,并把这个系统的账号与游戏中使用的账号绑定。

上线经验

印度哥们认为最有价值的是关于上线经验的分享。他分享了三点,分别对应预发布、demo发布和正式发布三个阶段。

预发布遇到的问题:数据库中超长字段造成的慢查询。问题在于原始的设计把UGC(图片)放在数据库中存储,因此解决办法有三点:

  1. 在请求中去除对超长字段的访问。
  2. 查询请求拆分成两步:先是获取内容列表,再是获取内容预览。
  3. 将图片类数据改为存储在S3中。

demo发布遇到的问题:用S3存储时缺少数据分片。原本是所有内容全部放在一个bucket下面,这样单个bucket中有多达60万个对象,但是单个数据分片仅能处理最高5K TPS。解决办法是:增加一级按上传时间做的数据分片,将每个bucket的TPS减小到1K。

正式发布遇到的问题:太小或者太多的数据库索引会导致慢查询。按tag过滤是一种常用的查询方式,因此原本的设计为tag添加了索引。但是后面发现,按tag查询会返回大量的数据,例如按游戏平台查询可能会返回占总量1/3的数据,在这种情况下使用索引不仅区分度不够高,而且反而性能上是一个累赘,因此又在tag上去掉了索引。进一步的建议是,基于真实的玩家数据分布情况来使用索引,因为设想和真实情况会有差距。

建议

以下是演讲人基于这个UGC系统的上线经验给开发者的建议:

  1. 使用真实的用户数据和游戏场景做压力测试,减小不确定性。
  2. UGC的监管非常重要,需要提前做好监管平台的建设。
  3. 限制用户输入的名字、描述和tag的自由度,以免给监管带来麻烦。

近年GDC服务器分享合集(一):在《黑道圣徒》的boss工厂中创建可扩展和吸引人的UGC相关推荐

  1. 近年GDC服务器分享合集(二): 《太空工程师》中基于预测物理的多人游戏

    客户端-服务端之间的位置同步一直是游戏开发中的一道难题,特别是还涉及到复杂的物理运动时.对于这个话题,来自<太空工程师>游戏的工程师在GDC 2023上为我们带来了他们的分享--<& ...

  2. 嵌入式分享合集115

    一.数字万用表电压.电流.电阻.电容.频率.电池.二极管等测量方法 数字万用表可用来测量直流和交流电压.直流和交流电流.电阻.电容.频率.电池.二极管等等.整机电路设计以大规模集成电路双积分A/D转换 ...

  3. 嵌入式分享合集137

    一.5大电气制图软件 一个电气人的基本从业准则就是要识图.绘图.首先要了解什么是电气图?电气图常用于建筑行业,是建筑内的线路.照明.空调及相关电气设备的平面展示.同时也是建筑工人施工的依据,因此,准确 ...

  4. 嵌入式分享合集105

    一.智能灯光控制系统(基于stm32) 带你走进物联网的世界说一个整天方案哦 这次是基于stm32的 当然你可以用esp "智能光照灯"使用STM32作为系统的MCU,由于单片机I ...

  5. 6位技术大咖11月倾心巨献,大数据+安全主题的技术分享合集【阿里云MVP 干货集锦】...

    为什么80%的码农都做不了架构师?>>>    摘要: 大家好,阿里云 MVP 11月大数据+安全主题分享新鲜出炉,快来一睹为快吧!哪些MVP的分享最吸引你,你最想支持哪个MVP? ...

  6. 2020年PMCAFF大咖分享合集(有回放)

    2020年,PMCAFF共计组织了12次分享直播,累计超过5000次观看,分享主题覆盖职业规划.中台.AI.增长.数据产品.推荐系统.产业互联网.搭建产品架构.用户生命周期-- 感谢所有分享嘉宾和听众 ...

  7. 嵌入式分享合集112

    一.常用电路基础公式 1.欧姆定律计算 计算电阻电路中电流.电压.电阻和功率之间的关系. 欧姆定律解释了电压.电流和电阻之间的关系,即通过导体两点间的电流与这两点间的电势差成正比.说明两点间的电压差. ...

  8. 守望先锋地图工坊分享合集

    地图工坊FOR,IF,WHILE分享 源氏跑酷之球图制作分享 射线命中位置,相距距离,根据射线命中位置和相距距离找到对应实体在数组中的值 工坊规则封禁源式利用表情卡原地小跳 熔火工坊网站:守望先锋地图 ...

  9. 嵌入式分享合集109

    一.八大基础电路,模拟电路分析 在电子电路中,电源.放大.振荡和调制电路被称为模拟电子电路,因为它们加工和处理的是连续变化的模拟信号. 1 反馈 反馈是指把输出的变化通过某种方式送到输入端,作为输入的 ...

最新文章

  1. Cocos生命周期回调
  2. 有道编程的界面做的也太粗燥了吧!
  3. python简单词频统计_python简单词频统计
  4. reactjs中的事件处理
  5. 即将放弃python的app_即将放弃Python 2.7的不止有Numpy,还有pandas和这些工具
  6. System.InvalidOperationException : 不应有 Response xmlns=''。
  7. WordPress主题LensNews模板源码,2.2版本多功能新闻积分商城主题
  8. python距离向量路由算法_互联网中常用路由协议,路由协议基础,一分钟了解下...
  9. 什么是全兼容?DVD主流格式全面解析
  10. 图文:2010中国计算机网络安全年会启明星辰展台
  11. python 中定义的函数 如何在main中调用_在python中,在定义类时自动运行函数的方法?_class_酷徒编程知识库...
  12. Linux--shell编程原理--03
  13. Javascript实现完美继承
  14. cache log:minzip: zlib inflate call failed (zerr=-3)
  15. 元器件——瞬态抑制二极管TVS的选型应用总结(TVS的应用、TVS常用参数、TVS选型注意点、单向和双向TVS)
  16. 按键拨号声音 DTMF MATLAB程序样例
  17. mysql 自动添加创建时间、更新时间
  18. 自助饮品消费系统---------(初学者)
  19. 易语言 如何调用麦谈帮API接口?
  20. 【Python基础】python中的re模块

热门文章

  1. 隐私浏览器 Tor Browser 8.0.7 发布,安全更新版本
  2. CDN网络简介及原理
  3. 如果《让子弹飞》里吃凉粉的是郭德纲,会怎么样?
  4. 什么是spring框架?spring框架到底有什么用?spring框架到底做了些什么?
  5. C++11 chrono 库
  6. JVM笔记十七:执行引擎
  7. 报错:dataSource init error java.sql.SQLException: com.mysql.cj.jdbc.Driver
  8. 基于JAVA与JSP下的网上商城设计
  9. 18个高大上的浏览器小技巧
  10. 叹服,阿里自述 SpringCloud 微服务:入门 + 实战 + 案例,一网打尽