游戏开发客户端好还是服务端好_服务端游戏

游戏开发客户端好还是服务端好_服务端游戏感觉游戏服务端,除了更新,保存数据啊、生成随机物品啊、都没什么了,好像游戏开发场景中,服务端已经无关紧要了。看着客户端忙成狗,正在摸鱼的你是否也有过这样的疑问?

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

为什么有游戏服务端

因为有需求,我们需要解决需求。 需求一:在家里的电脑打完这一关,去朋友家的电脑上玩,又要重新打一遍。有一个地方存储数据和关卡状态该多好。 需求二:一直都是一个人玩,好希望和朋友一起玩啊。有中转的电脑,转发玩家的操作、状态就可以了。 需求三:卧槽,这个人开挂,怎么一刀把我秒了,不公平,垃圾游戏,我不玩了。有校验玩家操作、反外挂、有裁判,维持公平和游戏性。

从上面的三个需求,可以抽象出游戏服务器的功能应该有如下几点。

  • 网络服务 网络服务就是建立客户端与服务端之间的连接。
  • 玩家数据存取 最常见的就是登录,登录的时候需要取玩家数据。存,一般有三种存储方式,用户下线时写一次 DB。第二种是定时写回 DB。第三种是重要数据立即回写,例如玩家打到一个比较稀有的装备,就应该立刻保存,避免突然宕机导致数据丢失。
  • 游戏逻辑计算 逻辑计算,把以前单机时,前端的计算放到后端,这是为了防止作弊。
  • 玩家行为或状态变化的同步检测 这块可以理解成玩家可以看到他视野范围内看到什么东西。

游戏服务器相比传统的互联网应用有如下特点。

  • 延迟敏感
  • 实时的高强度交互 一般单次请求就会产生复杂逻辑,还有一些广播和同步,比如移动同步,这就是一个很大的压力,假设你在一个二十人左右的场景里面,你发出了 5 个移动包,表示它移动的方向产生改变,目标点发生的改变,那么这个消息量将放大二十倍。
  • 业务逻辑复杂,内部耦合度高 因为延迟和敏感和高强度,那么在服务器维护状态就是一个必然的过程,这样就会导致它的逻辑比较复杂。比如你击杀一个怪物,可能它不仅仅是击杀一个怪物,还会触发一些任务的逻辑。
  • 变更频率高 游戏服务器的幅度一般没有传统的互联网应用幅度大。端游时代还好,但是现在是手游时代,基本上是一周一个小更新,一月一个大更新,所以服务器的灰度和部署需求也在逐渐变高。

游戏模型发展史

第一代游戏服务器

初代目

初代目的游戏服务器就是一个进程单线程物阻塞,接收到玩家的消息后,按照一个消息队列来进行序列化。这种游戏的代表就是 78 年的 MUD 游戏 Multiple User Domain,文字网游的统称,没有图形,通常是在终端与玩家交互,全部用文字和字符画来构成。

游戏开发客户端好还是服务端好_服务端游戏

第二代游戏服务器

第二代游戏服务 初代目由于承载能力的限制,衍生出了第二代游戏服务器,目的就是为了增加并发,开始使用了多线程多进程的模型,逻辑上也开始增加了分区分服的结构。代表作有《UItima》,中文名叫《创世纪》。

UItima

2000年,联众的休闲棋牌。

联众的休闲棋牌

在 2003 年年底,联众游戏世界的注册用户一度超过2亿,月活用户达1500万,中国网络棋牌游戏的绝对霸主,但是 2003 年下半年,腾讯公测 QQ 游戏大厅,功能与游戏门类与联众大同小异,QQ 游戏大厅不同在于,每次你的 QQ 好友在游戏大厅玩游戏时,他的头像下方就会显示他正在玩什么游戏,这个状态栏一点开,你就能跟他一起玩了,就这么一点小细节,让联众游戏世界和 QQ 游戏大厅的用户流量在一两年里发生了戏剧性的此消彼长。2006年,彻底败北的联众创始人辞职,之后他成为投资人,坚持只做腾讯不做的项目。

第三代游戏服务器 – 三层架构

三层架构

第三代游戏服务器就比较百花齐放了,首先就是当时流行的三层架构,抽出 Gate Server 的部分去负责网络 IO 连接的部分,然后 Gate Server 通过一个内部的网络 IDC 的专网跟游戏逻辑服务器之间交互,最后把用户数据的存储放到 DB Server 这一层。 总的来说,三层架构它的主要特点就是把网络 IO 和存储跟逻辑分离,这样可以对每一层进行扩展,增加服务的承载能力。QQ 游戏大厅就是比较典型的代表。

QQ 游戏大厅

第三代游戏服务器 – 服务器集群

服务器集群

这种架构前面同样也是有 Gate Server 这种接入型服务来处理外网连接,然后在游戏 world 里去处理游戏逻辑。它与三层架构不同的是,它会把通用逻辑抽取出来,例如登录、聊天、组队、工会等,放在独立的位置,通过 cluster 集群的方式提供这种游戏服务,调用者通过调用函数来获取对应的功能。大部分的 MMO-RPG(MMO:Massive Multiplayer Online,大型多人在线游戏) 、RPG(Role Playing Game:角色扮演) 游戏都是这种结构。 这种方式,中间肯定就多了一些异步的交互,异步交互就会带来状态维护的问题,开发难度也随之提高。代表游戏有《地下城与勇士》。

地下城与勇士

第三代游戏服务器 – 无缝地图

无缝地图

这个类型的游戏,最大的代表游戏就是《魔兽世界》,相比以前的《传奇》类型的游戏,它切换地图的时候,客户端会明显的卡顿或者进入 loading 界面。无缝地图的特点就是玩家在游戏中移动时,会看到地图一直都在不停的加载,因为它的场景服务器只负责一部分场景,玩家移动到某个地方时,场景可能存在两个场景服务器上。这些场景服务器会由一个更高层的服务器来决策由哪台服务器加载场景。

魔兽世界

第三代游戏服务器 – 房间型

比较常见的游戏类型都会使用这种模型。它通常有一个大厅集群,它通常负责前面提到的 Gate Server 用户的接入,还有一些大厅的逻辑服务,例如 5V5 匹配,有多个玩家申请进游戏的时候,它会根据匹配规则,等级啊,玩家的技术啊来撮合两个队伍。然后,单局的过程会放到战斗集群,也叫做房间服务。代表游戏有腾讯的《英雄联盟》,《英雄联盟》把电竞行业也推到了一个前所未有的高度,想到以前高中和兄弟们一起开黑,真是快乐。

英雄联盟

核心技术和实现难点

游戏服务器技术跟客户端比较,客户端主要在用户交互和体验表现方面。而服务器则是要面对海量用户,十万到千万的 PCU,PCU 是游戏里面,用户数据的一个指标,Peak Concurrent Users 最高同时在线玩家人数,还有 DAU Daily Active User 每天登录过的用户,PCU 比较考量服务器的性能数据,DAU 更倾向运营数据。

稳定,服务器玩的时候不能宕机,还有就是容忍一些弱网络的问题,网络断了,允许他在短时间内 WIFI – 4G 的切换。

地图&视野同步,地图服务功能,服务器最常用的是九宫格技术,一块九宫格的内容,玩家在其中格,这个格往往比屏幕大一点,会收到这个格里面的内容,一般服务器会认为你在这个九宫格内,所有的玩家、怪物等都是你关注的对象,当你在一个格内移动时,视野是不会发生变化的,但假设移动跨格后,那么就认为玩家放弃了上一个九格宫中关注的内容,在客户端将不可见上一个格子中的内容,在服务器角度仍然可见。目的就是用户在移动的过程中比较平滑的加载数据,减少交互的数量。地图管理还包括一些动态阻挡,比如两个人走到同一个点,能够挤在一起还是重叠。还有就是静态阻挡,一个物件放置在那里,服务器要判断玩家能否走过去。移动中,主要问题还在延迟、拉扯、平滑、差值。

最后游戏中非业务的难点还有存储、缓存、反外挂、网络协议等。我根据目前我的技术栈来列举。如下。

在这里插入图片描述

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13495.html

(0)

相关推荐

  • DDM实践系列丨分布式数据库中间件使用经验分享

    DDM实践系列丨分布式数据库中间件使用经验分享最近公司新项目使用了华为云的DDM分布式数据库中间件服务,通过一段的时间的使用感觉还不错。近段时间发现有许多小伙伴也准备去使用这个服务,所以为大家分享一下使用创建DDM服务的经验,帮助小伙伴们少走弯…

    2023-04-06
    149
  • mysql面试(七)备份恢复类问题[通俗易懂]

    mysql面试(七)备份恢复类问题[通俗易懂]备份方式 逻辑备份(DB 备份到文件) 物理备份(DB 备份到 DB) 全量备份和增量备份以及差异备份 常用备份工具 名称 特点 mysqldump 最常用的逻辑备份工具,支持全量备份和条件备份 m…

    2022-12-17
    138
  • Python时间格式化:strptime的用法

    Python时间格式化:strptime的用法在Python中,处理时间的常用库是datetime。datetime库中除了包含日期和时间的基本类型,还提供了一些常用的函数和方法,如strptime和strftime等。strptime函数是Python中用来将字符串转换成时间格式的函数,其用法如下:

    2023-12-11
    105
  • 提高数据处理效率的Python链表实现

    提高数据处理效率的Python链表实现在数据处理的过程中,链表是一种非常优秀的数据结构,特别是对于需要频繁进行插入和删除操作的场景,链表可以提供较高的效率和灵活性。Python作为一种高效而易用的编程语言,提供了多种数据结构的实现方式,其中链表也是可以用Python实现的。本文将介绍如何使用Python实现链表以及如何提高链表的性能。

    2024-02-17
    91
  • Redis之quicklist源码分析[通俗易懂]

    Redis之quicklist源码分析[通俗易懂]一、quicklist简介 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 一个列表最多可以包含 232 – 1 个元素 (42

    2023-02-18
    151
  • linux版solr-6.5.1配置

    linux版solr-6.5.1配置基础准备 将tomcat和solr压缩包解压到solr文件夹下 配置tomcat的端口号(conf下的server.xml) 启动tomcat 测试tomcat是否可以正常使用 开始配置solr 把…

    2022-12-15
    144
  • memory initialization failed_uncorrectable memory error

    memory initialization failed_uncorrectable memory errorhttps://sqlserver.code.blog/2019/11/26/missing-msi-and-msp-files/

    2022-12-22
    154
  • 数据库SQL-_Sql查询

    数据库SQL-_Sql查询1、基本术语 1)信息:指数据加工处理后有用的数据。 2)信息的3种世界: (1)现实世界:存在于人脑之外的客观世界。 (2)信息世界:现实世界在人脑中的反映。 (3)数据世界:将信息世界中的信息通过

    2023-02-22
    159

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注