经常有知友问我,我很喜欢玩游戏,可以从事游戏开发吗?开发游戏需要哪些技能?一款游戏的开发需要哪些人员参与?诸如此类的问题比比皆是。

本场 Chat 老司机带你弯道超车,以 10 年游戏行业的真实背景和经验为实例,为打算入坑游戏开发的朋友们答疑解惑。你可以学习到:

  1. 游戏开发团队结构
  2. 开发人员技能树及侧重点
  3. 常见的开发流程和工具
  4. 游戏类型及架构选型
  5. 经验教训与建议

引子

经常有网友问我,我很喜欢玩游戏,可以从事游戏开发吗?开发游戏需要哪些技能?一款游戏的开发需要哪些人员参与?诸如此类的问题比比皆是。作者以 10 年游戏行业的从业经验做背书,为打算入坑游戏开发的朋友们答疑解惑。

开发团队构成

首先要明确的一个概念就是网络游戏(或者叫在线游戏)其实也是一种互联网产品,因此,游戏的开发团队也就具有互联网产品开发团队的基本特征。比如,技术上分前后端,有产品经理,有美工等等。早期我在开发社交游戏的时候,团队组成和其他非游戏产品的团队几乎没有区别,因为这种需要嵌入在网页中的游戏和做一个功能性网页需要的人力和技术栈很类似。之后的十多年,网络游戏的复杂性和规模也越来越接近于大型的单机游戏,所以团队形式也从之前类互联网产品团队演变成为了制作人体制

制作人体制

制作人简单来说就是全面掌握游戏设计、开发和运营的总负责人。你可以认为这个角色就是电影行业的导演+制片人。制作人体制,就是以制作人为核心打造的满足游戏开发的职能组织结构。在制作人体制下不同职能的员工都要汇报给制作人(这一点和互联网产品团队的汇报路线有所不同。比如我是开发人员,应该汇报给技术线的负责人例如技术总监,而不是产品的负责人)。

我们用一个图例来说明一下制作人体制下的团队层级关系。

enter image description here

团队职能划分

首先你需要知道:一个游戏的最小核心职能成员只有 3 个:策划、美术、程序。因为游戏开发的几乎全部实体产出都是由这 3 个成员完成的。换句话说,组建一个最小的游戏开发团队只需要 3 个人。甚至说,有同时具备以上技能于一身的人的话,他 1 个人就行。这样的案例并不是没有,比如大名鼎鼎的《Minecraft》,或者是我非常喜欢的夫妻档开发的《Battle Heart》,以及许多在 taptap 上很成功的独立游戏。

enter image description here

策划(Designer)

策划其实就是产品经理,主要工作是设计游戏的背景、故事情节,功能模块等,并一一文档化。其中,内容(系统)策划一般做功能设计、故事情节等,类似电影制作里的编剧;而数值策划是游戏这种互联网产品特有的一种职能,游戏中有大量的数据化的工作,比如经济系统,角色成长系统,都需要有一定数学功底的人进行设计。其设计结果的合理性决定了游戏的一个要素:平衡性。平衡性对游戏的品质和生命周期都有很大影响。星际争霸能畅销 20 年,和其完美的平衡性有很大关系。有些游戏还设置了关卡策划,比如三消类游戏,不再赘述。

不客气的讲,策划谁都能做,因为这个工种是一个几乎不需要特定专业技能的工种(最多需要会 Excel、Word)。一个有经验的游戏玩家,且善于总结和思考,就能够根据自身经验给出一个基本设计。但是话说回来,要想成为一个优秀的策划,难度非常大,对人员素质也有很高要求:创造性、合理性、完整性、平衡性,其工作内容是思维的产物,且极难量化。毫不夸张的说,一个游戏的成功与否,和策划团队的能力有最直接的关系。

我个人认为国内游戏行业优秀的策划人员非常少,这也就是我们很少能看到令人惊艳的国产作品的原因。

策划人员通常是美术和程序共同的敌人,需求变更会导致其他人做无用功或者无休止的加班。一个功能自己都没想明白就让程序去开发,改来改去成了家常便饭。所以不合格的策划特别不受码农的待见。

美术(Artist)

美术主要的工作是对游戏内容进行包装和艺术化。根据游戏类型的不同,一般分为原画、2D、3D、动画等。原画美术主要负责过场画面,为 3D 提供原型,角色设计等。一个游戏推向市场时各种炫酷的海报等都是来源于原画。2D 主要负责界面的总体风格和布局设计,游戏中道具、武器等部件的绘制。3D 顾名思义,就是做 3D 场景、角色。动画一般是做游戏中需要的动态效果、特效,属于锦上添花,比如技能释放时的动画,角色战斗中的动态等等。

在早期,功能比较单一的小游戏或者社交游戏,团队里通常没有固定的美术人员,而是由统一的美术部门进行支持。比如互联网公司的美工需要负责页面的设计,游戏部门有需要就调派美工进行支持。对复杂的游戏来说,美术的工作量是非常大的,而其产出又是阶段性的,完成后不需要维护,所以养一个庞大的美术团队成本上不划算。因此,美术外包是业界比较流行的做法。也有美术团队作为独立部门存在的情况,会同时负责多个游戏,进组干活,完成后再去其他组。

美术是促成游戏成功的另一个主要因素。优秀的美术风格甚至有扭转乾坤的能力。比如我之前参与开发的卡牌游戏《灵异阴阳录》,有大量的忠实玩家是为了收集画师的作品而持续的进行时间和金钱的投入,使得游戏的生命周期也得以延长。

美术人员只和前端程序有交集,和后端程序完全没交集,没有利益冲突,通常情况下都比较融洽。

程序(Programmer)

码农大家都很熟悉了。现在绝大部分游戏都要联网,所以有前后端之分。前端主要负责页面端、App 端的展示逻辑,或者是和展现相关的物理特性处理逻辑,如寻路、碰撞、同步插值计算等等。后端主要负责业务逻辑,但其实无非是对数据进行操作和读写而已。有些逻辑的责任方并不明显,可以选择写在前端或者后端,一般要根据性能、实现难度等情况去判断,保证合理性。

我个人认为,程序的好坏,不能决定游戏的成功,只能决定游戏的失败。代码质量的区别,只有性能、健壮性、扩展性的区别,在功能覆盖点上是一致的。游戏上线初期用户量很小,程序质量的好坏很难被检验,用户完全不知道程序写的是优雅高尚还是狗屎一坨,因为他不能直观的看到。而一旦游戏成功了,DAU 全面飙升,程序的重要性才逐渐显现出来。烂代码会导致大量的 bug、并发能力弱、游戏响应慢等问题,这些因素一旦超过一个阈值,就会让游戏走向失败,或者加快用户流失率,缩短游戏的生命周期。一个很好的例子就是《我叫 MT》在恰当的时间点推出而大获成功,而后才暴露出服务端代码在大用户量时并发处理上的问题,CEO 本人居然在微博上告诫玩家不要在高峰时期登录。不去鞭策团队优化性能,而建议玩家改变游戏行为,实在让人贻笑大方。

程序员是整个团队中最苦逼的一群人,班加的最多,黑锅背的也最多,出了问题也是第一个要出来解决的。前端码农通常比后端好一点,游戏打包完成就没什么事了,而上线之后后端的噩梦才刚刚开始。你在地铁上,公交上,马路上,席地而坐处理线上问题的一定是后端码农。尽管后端没法决定游戏成功,但一不小心就能毁掉一个游戏甚至是整个公司,工作风险极大,需要有强大的心理素质。

支持部门

支持部门的工作职能相对独立,有可能是由多个团队共享的,比如 QA,可以为公司多个游戏开发团队进行测试工作,而不仅仅服务于某个团队。支持部门也会根据游戏的复杂程度和团队规模做一些裁剪。不能说这些职能可有可无,但相对比较灵活。

  • 项目经理(Project Manager):项目经理不管人,管项目,比如进度、成本、质量、各组之间协调等等。不是必须存在,有些公司或团队省略了这个角色,由制作人兼任。
  • 音乐音效(Audio):这部分其实也是游戏实体的一部分,好的音效锦上添花的作用很明显。一般都是外包。比较大的公司有自己的音效师在各团队间共享。
  • 测试工程师(QA):测试常驻开发团队的情况有,但比较少,除非是公司就只有一个游戏项目。游戏和其他的互联网产品不同,很难进行完善的自动化测试,大量的功能点需要人肉测试,比如跑地图。另外,因为游戏产品存在大量功能交错和耦合的特点,单个功能点正常的情况下,组合后就容易出现问题。QA 是游戏质量保障最重要的环节,我很难想象没有完善测试的游戏在玩家手中会是个什么样子。前阵子腾讯仓促上线的吃鸡游戏就因为bug太多不得不回炉重造,这种例子在以前单机和主机游戏上也时有发生。QA 也是比较苦逼的一个工种,每个 release 前基本上都是连轴转,夜里报 bug,白天码农来修,难兄难弟。
  • 运营(LiveOps):运营活动是让游戏利益最大化的重要手段。没有合理的运营活动,游戏在收入上会停滞不前。页游时期有这样一种运营人员,俗称托,假装是个大 R 玩家,在游戏初期领跑,等当前服的生态和用户稳定后立即退出。我在做页游运营支持的时候就干过这样的事。运营人员主要的工作是设计活动内容,拉新或者老用户召回等。通常节假日的活动都是收入的高点。而合理的运营行为也是保证游戏留存、降低流失、延长生命周期的重要手段。

另外,数据分析的相关工作一般也划入 LiveOps,他们主要是根据已有的 BI 数据,分析和给出各个指标,比如 DAU、首日、7 日、30 的留存,收入、充值、道具消耗等等,对运营工作和决策提供参考。

  • 运维(TechOps):很多小公司是没有运维的,反正就是服务器、工具维护,后端码农就兼职干了。国外游戏公司一般会细分出来,让后端更focus在业务逻辑开发上。
  • 市场(BD):BD 的作用也不能小视,谈渠道,谈植入广告,有时候抓住机会就能拯救一个团队。

开发流程和工具

开发流程

这里要讲的开发流程不是指搭建开发环境、写代码、提交代码的这个过程,而是指整个团队如何从 0 开始开发一款游戏需要经历哪些阶段。严格讲这其实算是软件工程方法学的范畴。我们不可能把各种方法学铺开来一一介绍,那样恐怕开个专栏都不够。这里只聚焦在适合游戏开发的软件工程过程。

推荐一种我认为非常适合中大型游戏开发的方法:裁剪过的 Scrum(对 Scrum 还不了解的读者可以阅读官方文档)。为什么是裁剪过的?因为游戏这种产品对变更和故障的响应速度要求很高,很多时候需要跳过各种繁文琐节,快速处理问题。尽管 Scrum 本身就是敏捷开发方法,但有时候依然不够快,需要裁剪。

我们先从宏观上了解一下一个游戏从无到有的产生过程。

enter image description here

一开始,制作人会给出一个愿景,定义需要做一个什么类型的游戏,大概的设计思路是什么。这就好比电影导演说想拍一个电影,它主要的故事梗概是什么,风格是什么。接着,策划团队领会了领导精神,开始细化游戏的需求,并文档化。技术团队根据游戏的类型等信息,可以开始技术栈的准备。比如需要做 MMO 类型的游戏,那就需要前后端有长连接的通讯方式,并以此来选择和搭建开发框架。前端根据需要选择 2d 还是 3d 的引擎。美术团队也可以准备原画了,定义整体 UI 风格、角色等,3D 建模工作也可以开始。

准备工作搞定后,进入具体开发阶段。程序员、美术根据需求文档进行开发、联调、集成等。同时测试团队也可以介入,编写测试用例,demo 开发出来后进行简单的测试。测试通过并且 bug 修复后开发工作算告一段落,可以进行打包和部署并发布。新版本上线后运营团队收集 BI 数据进行决策分析,上线运营活动、道具、功能等等。

注意,除立项和前期的准备工作外,整个开发周期都是一个迭代过程,每次阶段性发布都有这样的迭代。

接下来我们了解一下,Scrum 是如何运行的,以及如何针对游戏项目进行裁剪。

enter image description here

在 Scrum 方法中,会把所有的需求细化成一个个的 backlog,并形成一个总的产品 backlog,其实就是任务列表。然后根据需求的优先级,在 Planing(就是安排当前阶段做什么事的会议)中把这些任务划分到各个 Sprint(开发迭代周期,时间根据情况长短不一,一般是 1-2 个月)。接着开发团队就可以根据 sprint backlog 领取任务开始工作。通常每天都有一个 daily meeting,每个人讲述自己昨天干了什么今天要干什么,遇到了什么问题,需要什么资源等等。一个 Sprint 结束时会有一次 review,同时还会有一个 Retrospective(说白了就是批评与自我批评,表扬与自我表扬,逼逼这个开发周期那些地方做的好,哪些做的不好)。最后增量的发布这一迭代周期的产品,进入下一个迭代周期。

根据团队、项目大小的不同,甚至是人员特性的不同,每个公司都有自己特有的开发流程,完全教条的遵从某种方法学是不可取的,通常都要根据自身情况进行裁剪

游戏这种需要快速响应变化的 2C 产品,应尽可能的压缩事务性工作和流程性工作,专注在产品开发本身才是最重要的。

首先,游戏团队不需要遵从 Scrum 的团队角色构成。游戏开发人员的职能分工相当明确,PO、Master 这样的角色没有太大必要。策划专注在需求的细化和准确度上,及时和开发团队沟通即可。其次,减少事务性的工作。task 的建立、分配等工作可以交由项目经理并由 Lead 协助完成;daily meeting 可以降低频度,但一周必须至少有一次。程序员不需要编写详细设计文档(也要分情况而定,复杂的功能模块做详细一些的设计很有必要),描述清楚思路,确定设计方案,定义清楚接口就可以。Review 是很有必要的一个环节,整个团队坐在一起检验完成情况,需求实现是否偏差、是否有明显 bug 等等。而 Retro 环节可以只 involve 各 team 的 lead 参加,汇总问题即可。

另一个需要注意的是,游戏产品每次迭代更新都需要看到较明显的变化,这就意味着 Sprint 不能设置的过短。否则一是产品变化不明显发布的意义不大且增加更新风险,二是周期缩短后事务性工作会占用更多时间。通常建议一个迭代周期以 6-8 周比较合适。

这部分推荐的开发流程并不是唯一标准,只是笔者经过多年的积累和实践后,认为比较科学、操作性强、行之有效且能很好的把控进度和质量的一种方法。上面已经解释过,方法千变万化,只有适合自己团队的才是最合理的选择。感兴趣的读者可以去下载一份 Valve 公司(没错,就是那个大名鼎鼎的开发半条命的公司,也是 Steam 平台所属的公司)的新员工手册,了解一下 Valve 的开发流程,相信一定会给你耳目一新的感觉。

工具

使用工具可以帮助你高效的完成工作,这里推荐和 Scrum 流程完美匹配的 JIRA,以及几个辅助开发和部署的工具。

JIRA & WIKI

JIRA 几乎成了敏捷开发的标配工具,你的公司不使用 JIRA 进行项目管理你都不好意思和人打招呼。无论是任务分配、项目追踪还是 Bug 汇报,都和 Scrum 结合的天衣无缝。加上 Confluence 做 wiki,基本上软件开发周期中需要追踪和文档化的东西都齐活了。

enter image description here

Git/SVN

代码管理必备,现在是个码农就没有不会用 Git 的。Git 基本上已经一统天下了,列出 SVN 的原因是游戏项目中的美术资源,甚至是一些大项目的前端代码,因为占用空间太大的原因并不适合用 Git 去管理,SVN 更加适合。

另外推荐一款 Git 的可视化工具 Sourcetree,用它做命令行的辅助,很多使用场景下简单又高效。

enter image description here

Jenkins

Jenkins 也已经成 DevOps 的标配了,CI/CD 的重要集成工具。使用它可以高效的完成代码的打包部署工作。

enter image description here

Sonar

Sonar 是一个代码质量管理工具,能帮助你消除代码中的缺陷和坏味道,保证代码质量并帮你建立良好的编码习惯。

enter image description here

Gmail & Gtalk & Google Doc

Google 的这三个套件并不是必须的,完全可以找到对应的替代品。但当你基于它们进行团队的沟通和信息交流时,你会发现十分的好用,特别是对游戏开发团队。无论邮件,内部的 IM,PPT、Word 文档的共享,一个链接就能搞定一切,省去了传来传去且版本变化后不一致的问题。墙裂推荐这套工具作为公司的信息交互平台,当然前提是需要科学上网。

程序开发人员技能树

前端开发(Frontend)

也叫客户端开发。随着 10 多年网络(在线)游戏的变迁,前端技术栈的变化相对后端要更大一些。最早我们做社交游戏的时候是用 Flash 嵌入在网页中,开发人员主要使用的语言和工具是 ActionScript、Flash Air。而页面部分需要掌握 HTML、CSS、JavaScript 等技术。页游要看载体,大部分还是 Flash,一些 Mud 类的游戏只需要 JavaScript 做处理就够了。

手游的前端技术就大为不同了。对于 2D 游戏来说,cocos2d 是主要的开发工具。严格讲它是一个游戏引擎,以及围绕它构建的一整套开发环境和工具,并不局限于某种语言。通常使用 C++ 进行 iPhone 版本的开发,使用 Java 开发 Android 版本。

随着 3D 游戏的普及,Unity3D 成为主流引擎替代了 cocos 的位置。Unity 的功能非常强大,几乎可以发布全平台的游戏,也就是所谓的开发一次,发布多次。我参与的一个 3D 项目就是用 Unity 同时打包出 iPhone 和 Android 版本。U3d 主流开发语言是 C#。作为一个后端开发,我不得不吐槽几句。Unity 确实强大,但启动缓慢,占用内存极大,内嵌的代码编辑器 Mono Developer 用起来那叫一个蹩脚,不说了,满满的都是泪。

除了这些专属于前端的技术外,计算机基础知识也非常重要,比如算法、设计模式。前端需要和后端进行通讯,网络及协议相关的知识要很熟悉,比如 HTTP、socket、web socket、RPC 等。另外,部分数据可能需要存储在客户端本地,文件存储的知识也是必须的。前端开发的一大难点要属性能优化了,手游在各个渠道发布的时候通常会对安装包的大小做限制,这就需要你在游戏加载、资源质量上做文章;而游戏过程中帧数高低、效果的渲染导致的 CPU 占用率问题也是主要要面对的性能问题。

enter image description here

后端开发(Backend)

后端又叫服务器端。网络游戏的大部分业务逻辑都是在后端完成,但实际上游戏的成败和后端的关系比较小,因为它离用户最远,几乎对用户透明。一个看不见摸不着的东西自然不会对用户的评判有影响。好的服务器端就是让用户感觉不到它的存在,好像在玩一个单机游戏一样,没有网络延迟,没有卡顿。什么时候服务器端变得不透明了,让用户感觉到了,就是需要优化的时候了。

既然要完成大部分的业务逻辑,首先需要学会一门功能比较完善的综合性语言。在业界主流的后端开发语言是 C++ 和 Java。使用 C++ 是因为它高效的网络处理能力和性能。使用 Java 是因为它的综合实力和低门槛(和 C++ 比)。我个人更偏向于 Java 作为后端语言,一是生态圈更加成熟完善(Spring 可能是所有语言的框架中最完善最流行的,而各种大数据工具也多是基于 Java 平台);二是相对纯粹的面向对象能力进行建模也更加容易;三是 Netty 这样的网络框架也能弥补性能上的不足,使开发人员聚焦于业务。C++ 太过强大不易掌控,一旦使用不当反而会出现性能问题,对开发人员的要求也更高。除此之外,游戏圈也不乏有其他语言作为后端开发的语言,常见的有 PHP、Node.js、Golang 等。

既然是服务器端开发,就要和服务器打交道,Linux 系统知识、命令、shell 这些东西是必备的技能。它能使你的开发工作更加高效和流畅,是语言外最重要的辅助技能。网络和协议也是必须要掌握的,前后端如何通讯是一大主 题,需要根据游戏特性选择合理的通讯方式。一个比较复杂的游戏,一般长短链接是都要具备的,协议方面使用 gRPC(protobuf)、Thrift 是不错的选择,即高效又简洁。也有自己定义二进制协议的,但维护起来相对麻烦。

除语言外,另一个重要的技能就是持久层知识。本质上,前端的工作就是展示数据,后端的工作就是读写数据。几乎所有的所谓业务逻辑,无非就是读出数据攒一个前端需要的扔过去,或者把用户行为产生的数据保存下来。后端是数据的持有者,如何高效的读写数据就成为后端开发中的重点和难点。所以,对持久层的理解深度就决定了一个后端开发人员水平的高度。首先,要对使用的主要存储有深入的了解,避免出现使用上的低级错误或性能问题。其次,要学会对不同的业务场景使用不同的存储媒介,合理的存储能极大的简化开发难度。比如排行榜这种业务直接使用 Redis 的 zset 会比你自己实现高效的多。

后端是数据的生产者,很多数据的消费方都依赖于它,比如 BI。掌握一定的大数据处理工具能让你的技术栈更全面。

第三个重要的技能就是应用服务器本身了。后端程序通常都是以 Web Server 为容器部署的,所以你需要对常用的容器非常了解,比如 Nginx、Tomcat、Apache 等。另外云服务器的相关使用也需要掌握,现在基本上鲜有部署在实体机房的应用,PaaS 平台是主流。和国内的云服务提供商相比,AWS 有很多自己特有的服务,需要一定的学习曲线。随着 Kubernetes 的普及,Docker 容器的知识也是后端人员需要掌握的。

最后说说架构设计能力。一方面是设计模式在功能模块中的使用。游戏的业务场景中有大量可以使用设计模式的地方,用好模式可以事半功倍。另一方面是系统架构的设计。网络游戏必然是一个分布式系统,分布式系统的特性和问题游戏都一样存在。比如弹性设计、性能设计、服务治理、监控等等。这方面的内容是一个巨大的课题就不展开讲了。一个后端开发工程师要想过渡到架构师就必须具有架构设计的能力。

总结一下后端开发人员的技能树:

  • 精通一门综合性语言,最好是面向对象语言;
  • 持久层知识,深入了解常见的存储系统,比如 MySQL、MongoDB、Redis 等,学会用合理的存储系统组合降低业务开发复杂度;
  • 服务器相关的知识,包括 Linux 系统及命令、Web Server、云服务器、容器等;
  • 系统架构的设计能力,分布式系统、微服务等。

enter image description here

服务器端架构选型

根据游戏的类型、需求不同,服务器端架构也会不同。我个人认为一个比较完善的服务器端架构需要具备下面的功能:

  • 网络通讯及协议:确定游戏使用 HTTP 短连接还是 Socket 长连接和前端交互,协议数据格式使用二进制还是 JSON;
  • 共享数据同步:通过引入分布式缓存等机制实现世界 Boss 这类功能;
  • 通知推送(发布、订阅)能力:任务系统、消息系统等功能需要推送更新;
  • 消息队列:通过它实现数据的异步处理能力;
  • 定时任务系统:每日任务刷新、日更排行榜、奖励、CD 重置等,游戏中大量功能需要定时系统去触发;
  • 逻辑分区;根据时区、地区、用户属性等进行分服、合服的能力;
  • 后台管理:包括玩家信息查询、运营管理、策划数据管理、发布维护等等;
  • 大数据处理:用户行为会产生大量的 BI 数据,用来进行决策和运营活动,大数据处理能力必不可少。包括日志采集、收集汇总,报表等;
  • 灰度发布、A/B Test:游戏中为验证某功能的好坏常常需要进行灰度发布,系统应具有这样的能力;

作为 2C 的互联网产品,游戏有几个非常重要的特点需要考虑到:

  • 可伸缩性:整个系统是弹性的,可伸缩的,且最好能做到自动化。高峰时增加服务器,低谷时减少服务器(AWS 的 auto scaling 可实现这种能力);
  • 安全性:其一是游戏本身的安全性,即防外挂防作弊,玩家触发的数据都要经过后端验证,且设置警戒线,超过警戒线的数据必然是作弊行为;其二是数据安全性,存储的数据应该有备份,且能够快速恢复;
  • 性能:高并发情况下容易出现性能瓶颈,而游戏通常的瓶颈都在持久层。分库分表、读写分离、多级缓存等是解决持久层性能的主要手段。当然,大前提是代码不能写的太烂,否则神仙都救不了。

下面介绍几种不同划分方式下的架构模型。

按通讯方式划分

短连接通讯

即通过 HTTP 进行前后端的通讯。前端发送请求,后端把 response 结果返回给前端。这种模式其实和大部分互联网产品没有本质区别,通讯层比较轻量级,一个逻辑上的 Web Server 就可以搞定,易于维护和扩展。基本上可以满足弱联网游戏的需求。比如社交游戏、部分页游、非实时对战的卡牌游戏等。

短连接的情况下前端获取数据都需要用拉(pull)的方式,所以无法将消息主动从服务器推送(push)给客户端。服务器和客户端之间也无法维持状态。所以,对实时性要求高的游戏,就必须要用长连接的方式了。

长连接通讯

即服务器和客户端维持一个连接不中断。通常底层的通讯协议是 socket。实时性要求高的游戏都必须用长连接进行通讯,因为前后端需要实时的进行数据交互,数据即可以从前端拉取,也可以从后端推送。比如 MMO 类型的游戏,或者是有实时对战功能的游戏,比如炉石传说、皇室战争;再或者有数据推送的需求,比如全服的广播等。

看上去长连接的能力更强,但也有缺点。因为服务器要和客户端一直保持连接,对系统资源的消耗更大。一台标准配置的服务器能支撑 5000-10000 左右的连接就算很不错了;用户量越大,服务器集群规模远大于短连接架构,成本也越大。另外技术实现上也相对复杂,处理不当比较容易出现性能问题。

混合型

一个完善的架构会同时具有长短连接的通讯能力,在对应的场景下使用合适的通讯方式。

值得一提的是,有一些功能是2种连接都可以实现的。比如每日任务,即可以通过长连接的方式主动推送刷新任务到前端;也可以使用短连接方式,当用户进入任务系统界面时发送 HTTP 请求获取任务列表。这样的例子有很多,使用哪种方式需要考虑实现成本。

按网络模式划分

全球同服

顾名思义,游戏只有一个公共的入口,所有进入游戏的玩家都在同一个服,或者说都可以看到、交互。这在早期社交游戏时代是非常普遍的,比如 Zynga 的 CityVille,你就只能通过 Facebook 这一个入口进入,所有的玩家都可见或产生交互。

随着不同的平台、网络环境的增多,全球同服的概念被弱化了,比如 Android 和 iOS 平台下数据是不互通的,再比如中国版本和国际版本也不能互通(原因你懂)。但这种情况本质上也依然算是同服。

分区分服

分区(zone)一般指的是按照一定属性对数据进行逻辑分离,最常见的就是地区分区,比如暴雪的游戏炉石、星际争霸II,分了台服、国服、美服等;或者根据网络运营商分区,比如电信区、网通区等等。

enter image description here

典型的分服起源于页游时期,同一套游戏程序,不断的部署到新开的服中,服务器之间独立,数据也不互通。通常的策略是一个服的生态较为稳定了,收入也饱和了,没有多少新增就开新服。在同一个渠道的一组服通常服务器物理上也在一起,和分区的部署不一定相同(分区模式要根据地区选择最优的网络节点)。

enter image description here

和全球同服的模式相比,分区分服模式下各个区、服的数据都是隔离的,不可见的,你是一区的老大,我是二区的老大,互不影响。这也就促成了一种所谓“洗用户”的赚钱方式:一服玩家差不多了,开新服,继续拉新赚一波,循环往复,这就是为什么能看到很多页游有上百个服的原因。

举例:一个微服务游戏架构

游戏的业务模块和技术模块相对容易分离,非常适合微服务架构。早在微服务流行前,游戏业界的后端架构已经有了模块化的实践,比如分了登录、游戏服务、场景服务、网关服务、聊天服务等等。下面是我绘制的,并且个人认为比较完整、合理的服务端游戏架构。

enter image description here

  • 通讯层:用来和客户端进行通讯,支撑长短连接,长连接使用 gRPC 方式;
  • 业务层:具体的游戏业务逻辑层,每一个模块都是一个服务,在微服务架构中以独立的进程或者集群方式存在。这里列举了一些常用的公共业务,比如登录服务,用户系统,奖励系统,排行榜、战斗系统等等。
  • 中间层:也可以叫基础服务层,为实现业务模块提供必要的技术层面的支持。比如 HTTP server、socket 框架,分区系统,搜索引擎,消息队列,后台任务,定时任务等等;
  • 持久层:具体的数据存储,包括本地、分布式缓存,数据库(可以是关系型或 NoSQL),CDN 等;
  • 支撑系统:为整个架构系统提供公共的支持服务,比如负载均衡、访问控制、配置管理、日志、统计、监控服务等。

经验分享

上线流程

前端代码打包后就发布到各个渠道了,没有太多后续工作。这里要讲的是后端代码的上线流程。一个比较合理的上线流程应该包括本地环境、开发环境、测试环境、预演环境和生产环境这几个阶段。

enter image description here

  • 本地环境(Local):程序员自己的本地开发环境,主要完成功能的开发和单元测试;
  • 开发环境(Development):通常是给前后端集成、联调使用的,本地环境并不稳定,需要有这样一个中立的环境进行集成,或者是 demo 演示;
  • 测试环境(Testing/QA):Dev环境主要的使用者是前后端程序员,在集成过程中很可能频繁改动,所以如果测试人员使用 Dev 机器进行测试的话,很有可能影响测试的准确率。比如本来是正常的功能后端重启的服务而 QA 并不知情,就出现了一个不存在的 bug。所以对于一个有正规测试流程的团队来说,测试环境很有必要。如果是很小规模的团队或者是小的游戏,测试环境也可以和 Dev 环境合并;
  • 预演环境(Staging):一个在架构上和线上环境完全一致的环境,唯一的不同就是集群规模、机器性能、数据量等。线上的架构都是分布式的,而 Dev 这样的环境因为便捷性的考虑都是一个 all in one 的模式,很多在分布式系统中存在的问题没法在 Dev 环境下测试出来。Staging 是上线流程中最后的一环,相当于守门员,不可或缺。
  • 线上环境(Producation):最终的生成环境,交付给用户使用。

保证上线流程的完整性非常重要,它能以一个渐进的方式逐步提高代码质量直到交付阶段,是保证游戏尽可能不出现问题的重要手段。

代码安全

代码安全一方面是物理上的安全,即代码是否会被泄漏,被人 copy 走。这方面每个公司都有自己的做法,比如机器没有外网环境,不能使用U盘等(我个人非常唾弃这种缺乏信任的做法)。这里主要讲逻辑上的安全,即团队协同开发模式下代码在进行 merge 时不会丢失、被覆盖、被删除的问题。

借助 Git 的分支管理能力可以最大限度的保证代码合并的安全性。下面是我比较推荐的一种分支管理方式。

enter image description here

首先,我们有一个 master 主线分支,每个开发周期开始,从它 checkout 出 dev 分支;负责不同功能模块的程序员基于 dev 分支再打出自己的 feature 分支进行开发;有需要集成和依赖时 merge 回 dev 分支;整个开发周期的开发任务结束并准备上线时,从 dev 分支打出 release 分支,此分支即为线上环境运行的代码,并 merge 回 master。如果遇到了 bug 需要临时修复,就从 master 拉出一个 hotfix 分支,更新后再 merge 回 master。

通过这样一个科学的分支管理方法,基本上就可以避免代码 merge 上的绝大部分问题。

数据安全

数据可以说是互联网产品最宝贵的资产,特别是用户产生的数据(UGC)。抛开黑客攻击这种问题不谈,我们只讲如何避免操作失误造成的数据丢失问题。

给大家讲一个真实的例子。2010 年左右我还在某 SNS 网站做社交游戏,我们当时有一款品质非常好的农场类游戏,几千万用户,百万级别的 DAU,各方面数据都很稳定。有一次有个新来不久的同事为了做一些验证测试,打算把自己线上的用户金币数进行调整,于是他在mysql终端中写下了这样的代码:

update user set money = 10000;

不知道是疏忽了还是当时迷糊了,在没有加 where 条件的情况下就回车执行了。对于一个千万量级的表来说这样的更新操作是很慢的,由于经验不足他也没有对半天都没响应的情况深究,转头去忙别的事。最终的结果,所有的玩家金币被更新成了一样的数量,游戏的经济系统和生态完全崩溃。更倒霉的是数据库的备份是按周而不是按天,只能回滚到一周前的数据。对于这种数据级的游戏,一周时间在数据上的 gap 是巨大的。整个团队没合眼花了三天两夜通过 log 等各种方式进行数据修复,但结果并不理想。从此之后这款游戏的各项数据指标一路下滑,提早的结束了生命周期。

这样严重的事故告诉我们,需要在以下几个方面建立完善的制度和流程:

  • 权限管理:服务器和数据库的访问权限需要层层设置,逐步收敛到最终负责人;
  • 数据库操作:避免对线上数据的直接操作,如需要可使用从库(slave)替代;重要的写操作需要有人 review;
  • 备份机制:备份的间隔在容许的范围内尽可能短,主从两台是不够的,master 的误操作也会被同步到 slave,还需要单独的 backup 做增量备份(这一点可以参考 MongoDB 的 3 台为一组的 shard 结构);
  • 日志系统:完善日志,对关键数据的变更进行记录(change history),保证数据可追踪。

线上环境更新与维护

这部分简单介绍一下游戏的更新、新代码部署上线的问题。早期实体服务器没什么特别,老老实实一台台的更新。云服务器下就有了更多选择,主要有 2 种:

  • 滚动式更新:和实体机时代类似,在当前的实例上进行更新操作,通常要依靠脚本进行。这种方式没有实例切换的风险,实例相对稳定;但如果是热更新的话需要新老代码的兼容,保证请求的幂等性。否则的话要么需要停服维护,要么就没法使用这种方式。
  • 替换式更新:即完全启动一套新的实例,运行新的代码,集群建立完成后通过负载均衡进行网络切换,把流量打到新的集群,完成更新后老集群再 terminate 掉。这种方式需要先准备好一套新的实例,新实例的稳定性也需要多关注。相对滚动更新来说不容易出错或遗漏,也不用考虑兼容的问题。

另外需要注意的是,热更新,即不停服情况下,一定要注意服务的上下兼容问题;如果是停服更新,避免生硬的强行把用户踢下线,应尽可能做的友好,提前通知,快要停服前进行重复间隔性通知。

故障处理

软件系统出现故障是难免的,本篇最后再介绍一下如何处理故障。

系统恢复的几个方法
  • 重启:重启一般不能根本性的解决问题,但有些情况下确实可以作为一个缓冲之计,为修复争取时间。
  • 回滚:包括代码和数据层面的回滚。快速、简单,解决新上线问题的备用方案,但缺点是会给人带来比较大的挫败感。
  • 降级:暂停出问题的模块,停止服务并告知用户。我们在 LOZ 项目中就使用了降级来保证模块可以 switch off,效果不错。
  • 紧急更新: 大多数正规公司都有繁琐的上线流程。而紧急更新需要勇气和魄力,还需要有强大的自动化部署工具做支持。我个人非常支持这种打破常规的 hotfix,这是把事故影响范围降低到最小的最快方法。所谓特殊情况特殊对待,和破坏流程的hotfix可能带来的潜在风险相比,不更新是否会导致产品生命周期结束甚至公司蒙受巨大损失?两相权益取其轻。
降低或消除故障的方法
  • 故障演练:这个不多说了,去搜索一下 Netflix 的 Chaos Monkey 你就知道有多牛逼,以及你自己的公司有多 low 逼。
  • 灰度发布:指先小范围的发布,等稳定后再逐步扩大更新范围,减少受影响用户的范围,降低更新风险。有一种是分地区分布,还有一种是 AB Test,根据用户属性对不同的用户执行不同的更新策略甚至是不同的业务逻辑。比如要上线一个新道具,对尾号单双数的用户使用不同的价格策略,通过收集到的 BI 数据分析哪种定价更加合理。这在游戏行业非常常用。

出现故障是需要复盘的,不能解决完了就完了,要对故障进行分析总结。一般的复盘步骤如下:

  • 找出问题的根源(Root cause),分析出现原因;
  • 总结故障解决步骤,并文档化;
  • 提出改进策略,避免同类问题再次发生。

最后说一下故障的惩罚机制。惩罚和故障本身是没有任何因果关系的,对责任人的惩罚也许根本无法弥补公司受到的损失,带来的后果则是大范围的恐慌情绪,进而影响员工的积极性。做事就会犯错,为了不受罚,那我干脆不做事打酱油好了。如果员工都抱着这种心态,恐怕公司也没有存活下去的希望了。所以,对于开发人员,故障并不可怕,只要积极面对,避免同样的错误发生,通过故障不断学习成长才是最重要的。

结语

我们通过一个漫长的篇幅,从游戏的开发团队构成讲起,介绍了开发流程,游戏开发人员所需要的技术知识体系;接着介绍了游戏的服务器端架构的选型,并用一个示例说明;最后一部分是作者 10 多年游戏行业开发的一些经验分享。相信看到这里,你对游戏开发已经有了一个初步的理解和认识。欢迎随时和我进一步沟通交流,祝想入坑游戏行业的工程师们都能开发出自己喜欢的游戏!


本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。

阅读全文: http://gitbook.cn/gitchat/activity/5b97b9d4fc12340db79e25ab

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Android Fragement学习笔记(三)----PreferenceFragment使用

    我相信每个人都Perference大家都比较熟悉,这就是我们常说的偏好,首选项设置,一些数据可以保存。例如,一些元件的,我们使用上次。希望下次启动后仍然生效,烦。一般这个时候我们便会使用perference键值对的方式来处理,在android3.0之前,我们一般去继承Preference这个基类…...

    2024/4/29 3:57:35
  2. js字符串处理—是否包含某个字符串以及截取字符串

    1、字符串内是否包含某个字符串——indexOf() indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,若某个指定的字符串不存在于原来的字符串,则返回-1,存在的话就返回指定的字符串的首字符在原字符串第一次出现的位置。 用法实例示例: var oldString="t…...

    2024/4/26 9:40:48
  3. Linux串口编程——清空输入输出缓存

    背景在我们的工作中,串口是一种比较常用的数据传输方式。在某些应用场景下,当程序启动并打开串口后,我们不希望读出串口打开之前的输入缓存数据(即内核驱动已接收但是并未被应用层读出的数据),因此需要对输入缓存数据进行清空(刷清、丢弃)操作。下面以Linux系统上串口编…...

    2024/4/21 8:23:41
  4. VS Installer 多个安装包程序打包安装 .

    目前的项目开发的程序是有两个依赖程序(A,B),第三方软件公司开发好了依赖程序的独立安装包A.exe 和B.exe,目前的项目方要求将我们自己开发的主程序和依赖的第三方程 序安装包打包在一起通过我们的安装包直接将其也安装了。本人初次开发做安装包,没有经验,因为之前做的测…...

    2024/4/21 8:23:40
  5. linux PL011串口驱动修改为支持rs485

    在海思hi3516使用的linux 4.9内核中修改PL011串口驱动,支持rs485,并可通过dts配置哪些串口为485模式以及使用的io口。https://github.com/Tvirus/pl011_rs485注意:默认串口0不能配置为485模式。在115200波特率下150us的延时较为合适,如果使用其他波特率可能要自己用示波器看…...

    2024/4/21 8:23:40
  6. 盘点WinCE6.0下的小游戏

    以下介绍的所有游戏在下面平台下测试OK! 软件平台:WinCE6.0 硬件平台:深圳友坚恒天科技ARM11开发板(UT-S3C6410开发板)http://www.urbetter.com 当前,基于ARM核的CPU性能越来越高,比如三星的ARM11 CPU S3C6410,其主频支持533/667MHz,最高甚至可以达到800Mhz,同时,还…...

    2024/4/21 8:23:38
  7. js截取固定长度中英文字符串

    //js截取字符串,中英文都能用 //如果给定的字符串大于指定长度,截取指定长度返回,否者返回源字符串。 function cutstr(str,len) {var str_length = 0;var str_len = 0;str_cut = new String();str_len = str.length;for(var i = 0;i<str_len;i++){a = str.charAt(i);str…...

    2024/4/21 8:23:37
  8. vs2017 C#程序打包安装部署之创建Windows安装项目

    目前文档主要内容有:一:创建创建Windows安装项目二:添加内容文件三:添加项目输出四:添加注册表信息五:创建快捷方式六:生成Windows安装程序获取打包工具,使用微软自带工具,获取步骤如下,若已安装请忽略此步。 点击:工具—>拓展和更新(U),然后在弹出的页面 联机…...

    2024/4/21 8:23:36
  9. Linux下编译安装驱动的两种方式

    linux 编译安装驱动有两种,动态加载与静态加载 动态加载 一,编译,在指点内核树下编译,生成.o文件或.ko文件 二,将生成的.o或.ko文件拷到相应目录,一般是/lib/module/kernel下面 三,用insmod命令加载,用rmmod命令卸载 静态加载 静态加载主要就是编译内核。就是将编…...

    2024/4/21 8:23:35
  10. js截取字符串中的一部分

    js截取字符串中的一部分 1、slice() 截取 stringObject.slice(start, end)start(必需):规定从何处开始选取。如果是负数,那么它规定从字符串尾部开始算起的位置。 end(可选):规定从何处结束选取,即结束处的字符下标。如果没有指定该参数,那么截取的字符串包含从 start…...

    2024/4/21 8:23:34
  11. VS C++程序打包成可安装文件

    创建setup and deployment 工程在既有项目解决方案内添加 setup and deployment工程如下图 添加项目需要的文件1. 在Application Folder添加 Project Output 选择exe工程(主输出,包含所需dll等) 此时需要使用的dll会被自动打包进来,另外程序所需的 db文件数据库文件需要收…...

    2024/4/21 8:23:33
  12. 网狐荣耀棋牌最新版源码:含PC全套源码+部分手机端lua源码(含10多个... )源码下载

    (1)Cocos2d-lua 引擎打造,完美实现热更新荣耀版手机棋牌平台采用Cocos2d-lua引擎开发,解决了当今市面上诸多游戏平台频繁出现的闪屏退问题,并且LUA开发支持热更新技术,无需重新下载,即可实现游戏和功能程序的快速更新。(2)推广代理系统完善,强化全作渠道手机版荣耀平…...

    2024/4/20 18:31:52
  13. 菜鸟的安卓实习之路---采用preferenceFragment布局

    上一篇说了,可以调整Activity的大小,使之显示成dialog的样式,所以今后,选项神马的小窗布局都可以采用preferenceFragment 但是要将他放在Activity上面来显示,然后属于该选项的记录文件被自动创建。 这一条用来在你的preference中来添加你的布局资源, addPreferencesFr…...

    2024/5/1 23:20:29
  14. 将java程序打包成安装版exe

    将java程序打包成安装版exe注意是将其打包成安装版的exe而不是可执行的exe首先需要写好java程序,然后打包成可执行jar,接下来使用exe4j将其打包成可执行exe,详见:https://blog.csdn.net/rico_zhou/article/details/79868129虽然打包成了可执行exe但是依然需要jre的运行环境…...

    2024/5/1 22:26:34
  15. linux中串口传输剔除错误数据的方法

    串口传输中有些朋友可能会经常遇到数据丢失的情况,像我遇到情况是:数据没传输个几十次,收到的数据就会有一个有问题。 出现这种现象的原因主要是波特率的原因,我这里主要是因为我的485转串口电路中用的光耦是til117,这种光耦的波特率是多少我到网上查了下,可惜资料里面好…...

    2024/4/20 18:31:49
  16. js 截取字符串后几位,字符串反转

    function getStr(str){//截取后8位//return str.match(/.*(.{8})/)[1] ;//截取后2位return str.match(/.*(.{2})/)[1] ;}字符串反转str.split().reverse().join();...

    2024/5/1 21:59:51
  17. Neo4j的安装及一些报错的解决

    基本的安装的步骤见下面的链接 链接: link 与这一篇 遇到的问题: 1启动beo4j时遇到下面的问题。 2018-11-04 05:45:24.783+0000 ERROR Failed to start Neo4j: Starting Neo4j failed: Component org.neo4j.server.database.LifecycleManagingDatabase@1d05cbae was su ccessf…...

    2024/4/28 18:15:50
  18. PreferenceFragment & DialogFragment & Spinner & NumberPicker

    PreferencFragment解析:http://blog.csdn.net/lmj623565791/article/details/37970961/ billing_cycle.xml<?xml version="1.0" encoding="UTF-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"…...

    2024/4/20 18:31:47
  19. QtIFW:制作程序安装包

    程序发布方式一般有两种:(1)静态编译发布。这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中。其优势是简单单一,所有的依赖库都集中在一起,其缺点也很明显,可执行程序体量较大。(2)制作安装包发布。这种方式的原理也简单,就是将可执行程序和其依…...

    2024/4/20 18:31:46
  20. cocos2d-x学习笔记(18)--游戏打包(windows平台)

    cocos2d-x学习笔记(18)--游戏打包(windows平台)本文出自https://shuwoom.com博客,欢迎访问!之前做好的游戏,都是在vs2008下编译运行的。如果说想把游戏发布到网上或者和其他人一起分享游戏,那就得对游戏进行打包。下面我就向大家介绍一款程序打包工具----Enigma Virtual …...

    2024/4/21 8:23:33

最新文章

  1. Day28-Java基础之Arrays类和lambda表达式

    Arrays类 //Arrays类 int[] arr{1,2,3,4,5,6}; System.out.println(Arrays.toString(arr)); System.out.println(Arrays.binarySearch(arr,3));//不存在返回&#xff0d;插入点再-1 int[] newArrArrays.copyOf(arr,10); System.out.println(Arrays.toString(newArr)); int[] n…...

    2024/5/1 23:31:00
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. MQ死信队列

    面试题&#xff1a;你们是如何保证消息不丢失的&#xff1f; 1、什么是死信 在 RabbitMQ 中充当主角的就是消息&#xff0c;在不同场景下&#xff0c;消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式&#xff0c;这些场景包括&#xff1a; 1. 消息被拒绝访问&…...

    2024/5/1 22:32:17
  4. 【Locust分布式压力测试】

    Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...

    2024/5/1 5:19:39
  5. 同一个pdf在windows和linux中的页数不一样

    之前认为PDF的格式&#xff0c;至少页数是不会变化的&#xff0c;结果最近发现一个文档在windows和linux中的页数不一样&#xff0c;linux中的pdf进入像word一样排版变得紧凑了&#xff0c;原本在下一页的几行进入了上一页的末尾。问了gpt后得到这样的回答&#xff1a; PDF文档…...

    2024/4/30 1:35:16
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57