淦!那些程序员必备的知识技能:游戏网络知识

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

这是一篇翻译文章,主要针对游戏的网络设计,目前主流的网络游戏实现方案都有讲解。文章来源于网络。

作为一个程序员,你有没有想象过多人游戏是如何实现的?

在外行人看来游戏很神奇:两个或者更多的玩家在网络上分享共同的经历,就像他们真实的存在于相同的虚拟的世界一样。游戏看起来犹如一个巨大的魔术,奇妙而又刺激,但作为一个开发人员我们知道,真实的情况和我们所看到的并不一样,那只是一种错觉。你感受到的共享现实,实际上是在那个时刻内,由你自己的独特视角和位置所感知的近似情况。

Peer-to-Peer 帧同步

最初的游戏是通过peer-to-peer来联网的,每个计算机通过网状拓扑的结构的彼此连接并交换信息。你仍然可以看到这种模型存在于RTS游戏中,而且基于某些原因它还很有趣,也许是因为它是大多数人认为游戏网络工作方式的第一种方式。

处理游戏信息的基本思想就是把游戏的数据抽象并转换成一系列命令消息,当处理每个转换的时候就直接演变为游戏的状态。比如:移动单位、攻击物体、建造建筑。这一切都需要在线的每个玩家机器,从一个初始化命令开始之后,都运行完全相同的命令和转换数据。

当然了,这只是一个过于简单的解释,同时也隐去了很多细节,不过我们通过这个基本的思路可以知道RTS游戏的网络是如何工作的。

这些看起来是如此简单和优雅,但不幸的它们有几个因素限制者我们。

第一个限制,要保证游戏状态完全确定一致的是异常困难,特别是保持每台机器上每个转换输出都保持相同。比如,一个单位在两台机器上有略微不同的路径,在一台机器上早一些到达并开始了战斗,结果反败为胜,而在另一台机器上,由于稍微晚一些到达而失败。就像一只蝴蝶扇动了翅膀,然后在世界的另一边导致了飓风的出现,随着时间的推移,一个微小的区别就会导致两边完全的不同步。

第二个限制,为了保证游戏的所有玩家输出一致,这就需要等到所有玩家的当前回合数据都到达之后才可以模拟播放这一回合动作。这就意味着游戏中的每一个玩家都需要等待网络延迟最高的那个玩家。RTS游戏通常代表性地通过立即提供音频反馈与(或是)播放吟唱(过渡)动画来掩盖这段延迟,但是最终真正影响游戏的动作要在这段延迟过去之后才能进行。

第三个限制,因为游戏中状态改变的同步是通过发送命令信息来同步的。所以为了游戏中玩家状态都一致,需要所有的玩家都要从相同的初始状态来开始游戏。这意味着每个玩家必须在开始游戏之前先加入房间然后一起开始游戏,尽管理论上也可以支持让某些玩家晚些加入游戏,但是在一场进行中的游戏中获得一个完全确定的起始点的难度相当大,所以这种情况并不常见。

尽管有这些因素限制困扰者我们,不过这个模型还是很适合RTS游戏的,并且它仍然存在于今天的游戏当中,例如“Command and Conquer”、“Age of Empires”与“Starcraft”等。原因就是在RTS游戏中,里面包含了上千多的单位,这些单位都有自己的状态需要同步,而且他们数据量都太大了,很难用来在玩家之间交换。别无选择,我们只能通过这些游戏状态改变的命令来同步。

所以以上这些就是 peer-to-peer 帧同步的网络游戏模型的介绍了,对于其他类型的游戏,最先进的技术已经开始出现了。让我们现在从DoomQuake 以及 Unreal经典游戏中开始一起观察动作游戏的技术演化。

客户端/服务器(c/s架构)

在动作游戏的时代,以上帧同步的限制在Doom 游戏中变得更加明显,尽管在局域网中体验还不错,但在对于互联网的用户来说它体验太糟糕了:

尽管可以使用一个猫(调制解调器)把两个Doom 机器通过互联网连接在一起,但他们一起游戏会异常缓慢。范围从无法游戏(例如:14.4Kbps PPP 连接)到稍微可以玩(例如 :28.8Kbps 猫运行一个被SLIP驱动压缩的数据)之间游戏联机都异常缓慢。由于这些连接方式只是边际效用,本文将仅关注直接的网络连接。

这个问题是因为Doom网络部分本来就是只为局域网而设计的,并且使用了前面介绍的peer-to-peer 帧同步模型。每一回合每个玩家的输入的信息(比如关键按键等)都与其他人进行同步通知,并且任何玩家在播放这一帧动画之前,必须得等到所有其他玩家的关键按键信息都被接收到,才可以去模拟播放。

也就是说,在你可以转身(转换),移动或者射击之前,你必须等待延迟最大的猫(调制调解器)玩家的输入。只是想想上述那个人所写的“这些连接方式只是边际效用”就会让人咬牙切齿和沮丧了。

为了改变这种现状,只能在局域网以及大学网络和大型企业才能获得良好连接而进行游戏,是需要改变这种网络模型了。在1996年,这变成了现实并被实现了,John Carmack当时 发布雷神之锤,他采用客户端/服务器(C/S)架构代替了P2P模型。

如今游戏中的玩家可以不必再运行相同的代码以及直接相互通信,每个玩家的机器是都是一个“客户端”,他们都通过一台叫做“服务器”的机器进行通信交互。游戏的最终状态确定不再依赖于每台客户端机器来共同确认,而是由服务器来确定最终结果。每个客户端如同一个哑终端,用来展示一个近似值的表演,真实的游戏状态是运行于服务器之上。

在一个纯粹的c/s架构中,你不必在本地运行游戏代码,而是把一些例如按键、鼠标移动,点击等输入信息发送到服务器。服务器会在游戏世界中更新你的玩家状态,然后再封包一个包含你角色信息以及临近玩家数据的包回复给你的客户端。所有的客户端在每个消息更新的间隙做一个插值预测,以改善在每个状态更新期间,物体可以平滑的移动,如此,你就有一个可以联网的客户端/服务器架构的游戏了。

这已经是向前迈出了极大的一步。游戏的体验依赖于客户端和服务器的连接,而不是游戏中延迟最大的那个玩家。如此可以支持玩家在游戏中自由的进入和退出,同时由于客户端/服务器降低了平均每位玩家的带宽,从而可以增加更多的在线玩家。

但是这里仍然有一些问题存在于 c/s 架构中:

我记得我交代了所有从DOO到Quake中关于网络的决策,但是重要的是我正在使用错误的假设来做一个好的网络游戏。我原先设计的目标是网络延迟<200ms。人们通过一个好的网络供应商连接互联网,从而可以获得一个好的游戏体验。但事与愿违,世界上99%的用户使用猫(调制调解器)通过 slip或者ppp 进行连接,而他们常常都会通过槽糕而又拥挤的ISP。这会带来最低300+ms 的 网络延迟。一个消息要经过,客户端>用户猫>ISP猫>服务器>ISP猫>用户猫>客户端。上帝,这太逊了。

OK,我做了一个错误的设定。我在家里使用T1 宽带,所以我只是不了解在PPP网络下的生活。我现在就解决它。

这个问题当然是延迟。

接下来John在他发布QuakeWorld的时候将改变这个行业。

客户端预测(Client-Side Prediction)

在原来的Quake游戏中,你会感觉到电脑与服务器之间的延迟。比如,你按键向前移动,在你真正移动之前,你需要等到数据包发送服务器然后再回复到你的客户端,你才可以真正的移动。按键开火,在你的射击之前同样需要相同的等待。

如果你玩过任何FPS游戏,比如:Modern Warfar,你会发现并没有延迟发生。那么fps游戏是如何做到在多人情况下,你的动作看起来并没有延迟?

这个问题被分为两个部分来解决。第一个部分是客户端移动预测,这是John Carmack 为 QuakeWorld游戏多开发的,后来被合并到了Tim Sweeney的虚幻网络模块。第二个部分就是延迟补偿,它是由Valve公司的Yahn Bernier在Counterstrike所开发。那么在这个章节,我们把焦点放在第一部分——隐藏用户移动的延迟。

当写到关于他即将发布的QuakeWorld计划的时候,John Carmack 讲到:

我现在允许客户端可以预测用户的移动,直到服务器的权威信息回复之前。这是一个重大的结构变更。客户端需要知道关于对象的硬度、摩擦力、重力等一系列基础属性。我很伤心的看到,客户端仅作为一个终端存在将会离开,但作为一个实用主义者,我必须超越这种理想情怀。

那么现在我们为了消除延迟,客户端需要运行更多的代码。它现在不再是一个只把输入发送给服务器然后再把返回信息进行插入的哑终端。现在客户端的机器可以运行一部分游戏代码,它可以在本地预测你的角色移动并且可以即时响应你的输入。

现在当你即刻按键向前,你的游戏会立刻向前移动,不会再去等待数据往返一次客户端和服务器之间才来回应你的操作。

这种方式的难点不在于预测,这种预测工作,就像正常的游戏代码一样 —— 根据玩家的输入,及时地更新游戏角色的状态。而难点在于,当客户端和服务器对于玩家角色所做的事情(动作)核检不一致的时候,客户端如何基于服务器信息进行更正。

现在你会想,hey,如果代码运行在客户端——为何不以客户端的信息为准?客户端可以自己的为角色模拟运行代码,并且只需要在每次发送数据包时告知服务器这些信息。如果每个客户端都对服务器发送相同的信息,告诉服务器“这是我现在的位置信息”,那么将会带来这样的问题。客户端会很容易被黑客攻击并控制,这样在RPG游戏中,一个作弊便可以立即躲避对方技能击中,或者当你射击的时候瞬间移动到你的身后。

所以在FPS游戏中,尽快每个玩家的客户端可以预测他们自己的角色进行操作移动,但最终每个玩家的角色状态绝对以服务器为准。就像Tim Sweeney 在所写的文章The Unreal Networking Architecture中描述的一样:“服务器才是主人”。

这就是有趣的地方。如果客户端和服务器产生了不一致,客户端必须基于服务器的信息为准并更新,但是由于客户端和服务器之前有延迟,服务器的修正必然是过去的动作。比如,如果信息从客户端到服务器耗时100ms,然后返回又耗时100ms,那么任何服务器的的修正都是客户端200ms之前的行为动作,这个时间正好是客户端预测角色移动的时间。

如果客户端每个动作都会被服务器修正,那么你将会看客户端被拉回了原先的位置,如此客户端将做不了任何预先预测的运算。那么我们如何解决这个问题,依然可以保持客户端提前预测?

解决方案就是在客户端创建一个buffer,然后用来循环保持角色的状态以及本来玩家的输入。当客户端收到了服务器的更正信息时候,它首先丢弃掉buffer里面比(服务器回复的)更正状态要老的状态信息,然后基于(更正的)正确的状态重放存储在buffer里面的输入信息,重发的这些输入信息的范围是从正确状态到当前预测时间之间。如此实际上,客户端只是看似无形中“倒带和重放”当地玩家角色运动的最后n帧,同时保持世界其他地方没有变化。

这种方法可以让玩家感觉在控制游戏的时候没有延迟,同时也改善了客户端和服务器之间代码运行的一致性——在同等输入的情况下保持一致的结果。当然了,修正的情况很少发生,Tim Sweeney 如此描述:

…对于客户端和服务器最好的是:所有情况下,服务器都是权威的。几乎所有的时间,客户端模拟的和服务器的数据都是一致,所以客户端的位置很少被修正。只有的少数罕见的情况下,例如一个玩家被火箭击中,或者和一个敌人(怪物)碰撞上,那么客户端本地的情况有可能需要被修正。

也就是说,只有当玩家的角色被一些外部事件影响玩家的输入,并且这些不能被客户端预测时,玩家的位置(行为)需要被服务器修正。当然,如果玩家试图作弊,必然会被服务器修正。

原文地址:http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/

 

谈谈程序员如何快速提升职业技能 IT行业有很多分支:AI,大数据,区块链,游戏等等,其中游戏开发由于Unity引擎的普及入门门槛很低,收入相对来说比较高,导致了大量的应届毕业生或者说其他IT行业的人转到游戏开发中,游戏开发涉及到的技术也是很多的,其中包括很多算法:四叉树,八叉树,Bezier,A* 算法,人工智能,行为树,高斯,图形学算法等等。要想在IT行业立于不败之地,我们需要缩短与高手之间的差距,怎么去弥补这个差距呢?这里说... 阅读详情

相关推荐

Unity 3D 网络游戏架构设计

课程简介 本课程是 Unity 3D 系列教程,目标是带领读者搭建一个商业游戏网络架构设计,该架构设计是游戏的核心技术,将采用 Unity 2017.2 最新版本作为开发工具。内容分为 UI 架构、技能架构、服务器和网络同步四大部分,共 13 篇文章。 认真读完本系列文章之后,将会深入理解架构的设计,具备独立搭建网络游戏框架的能力,并在此基础上可以独立开发一款网络游戏。 作者介绍 姜雪伟,从事 ...

GitChat 8119

不同局域网间的P2P通信技术

P2P(Peer-to-Peer)即对等网络。P2P(Peer to Peer)网络结构区别于Client/Server结构或Browser/Server结构最显著的特点是整个网络不存在中心节点(或中心服务器),其中的每一个节点(peer)大都同时具有信息消费者、信息提供者和信息通讯等三方面的功能。     NAT(Net Address Translation):网络地址转换,即局域网通常

errvv的专栏 5664

AI编程:程序员必备技能

在当今数字化时代,人工智能(AI)技术正以前所未有的速度改变着各个行业。AI编程作为实现人工智能的关键手段,对于程序员而言变得愈发重要。本文的目的在于全面介绍AI编程这一程序员必备技能,涵盖从基础概念到实际应用的各个方面,帮助程序员深入理解AI编程的原理、方法和应用场景。范围包括机器学习、深度学习等主流AI编程领域,涉及常见的算法、数学模型以及实际项目开发的流程和技巧。本文将按照以下结构进行组织:首先介绍AI编程的背景知识,包括目的范围、预期读者等内容;

AI架构全栈开发实战笔记 766

联机游戏原理入门即入土 -- 入门篇

联机游戏

嘿嘿 9533

实时联网游戏后台服务技术选型和挑战(网络接入篇)

概述:本文尝试从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮助开发者依据自身游戏特点做出合理的技术选型。 维基百科关于网络游戏的定义:通过计算机网络,将专用服务器和用户的客户端设备(手机、PC、游戏主机等)相连,让多名玩家同时联机进行游戏的娱乐形式,由此可知网络游戏涉及三个角色:客户端、网络、服务器,从网络架构上来讲网络游戏可分为C/S 架构和P2...

weixin_34072159的博客 638

局域网游戏联机原理解析

联机的秘密,别人不告诉你,我告诉你

Boom!脑洞大爆炸的博客 1万+

游戏实时网络通信实现【Socket与FlatBuffer协议】(一)

游戏项目基本很难避免不与服务器端通信交互传输数据,除非你只做单机版的游戏。一般的网络游戏游戏刚启动的时候,需要做资源热更检查处理。这里一般使用http协议,如UnityWebRequest/WWW以及HttpWebRequest等已经封装好的接口来实现。而针对在网络游戏战斗部分,则必须实现长链接,保证数据实时传输发送与接收。一般使用TCP传输协议或者“改善”的UDP协议来实现。这边使用TCP协议。详细的网络通信原理,该系列文章不做介绍,站在项目实用的角度,讲解如何一步一步地实现。 本篇文章主要介绍字节与

成长ing中的w的专栏 1922

游戏开发程序员必备技术】

当你披着《英雄联盟》的战袍,挥舞着利剑,与对手不死不休地战斗;当你驾驶着战车穿过《坦克世界》的烟尘弹雨,掩护基地免受敌人侵袭;当你完美落地《CS:GO》的翻墙smoke,然后一记AK突破对方防线…生动的游戏画面常伴你成长。如今,你已步入大学,是否想要将游戏开发作为未来的职业道路?想要制作出让万千玩家流连忘返的游戏,该从何学起,掌握哪些技能呢?别急,放轻松!今天我们就来聊一聊游戏开发程序员必备技能树。我会为你列出清单,从基础编程知识到高大上的渲染管线。准备好学习新技能吧!

Richard_shen的博客 2132

程序员必备的10个B站优质UP主!

泻药!自我推荐一波,程序员必备的10个优质UP主! 1、Java学习营-海量Java学习视频,一套接一套,java程序员必备! 代表作品: 千锋教育Java教程_1000集零基础Java从入门到精通教程(保姆级教学视频)_哔哩哔哩_bilibili​www.bilibili.com 2、大前端学习营-海量前端学习视频,一套接一套,前端开发者必备! 代表作品: 千锋HTML5教程 1000集完全入门 达到web前端工程师水平_哔哩哔哩_bilibili​www.bilibili.com

程序员日常 1万+

作为Unity程序员需要掌握的技能

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。CSDN视频网址:http://edu.csdn.net/lecturer/144 最近公司由于人员变动,需要招聘Unity3D程序员,面试了很多人,学历从专科到研究生,在这些人中有工作两年的,三

海洋个人博客 1万+

86.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-解析游戏技能数据包中的内容

网络游戏逆向、网络游戏安全、网络游戏攻防、c++、反游戏外挂

计算机王的博客 2226

关于游戏运营策划管理相关必备知识

本文帮朋友发,作者:罗笄。游戏运营管理或者游戏策划涉及大量的相关知识,本文归纳整理总结必备知识,归纳成体系。 网易互娱有什么独特的的特点? 与腾讯游戏、暴雪有什么区别? 旗下有哪些代表性的游戏? 客户特点、游戏模式、用户编存? 日活率是什么?如何进行市场推广? 不同游戏的优劣势,发展方向? 游戏满足人的什么需求?有哪些设计原则? 目录 一、网易互娱的主要游戏有哪些? 1.1 端游...

祥瑞的技术博客 9532

游戏开发程序员必备技术

例如,物理模拟使游戏中的动作遵循重力和摩擦等现实物理定律,提高了真实感,如在射击游戏中模拟子弹弹道。同时,微信小游戏等成为增量机会,AI技术也深度影响游戏,从优化效率到推动玩法变革,NPC交互和用户内容生成成为重要应用方向,为游戏开发注入了新动能。通过参与真实的游戏开发项目,程序员可以获得宝贵的实战经验,了解游戏开发的全过程。此外,持续学习和适应新技术是游戏开发领域的必要条件。图像处理涉及操作像素、生成纹理和模拟光照,能创造逼真的皮肤纹理和复杂的光照效果,如阴影和反射,显著提升视觉质量。

2401_82584055的博客 2699

成为游戏编程必备知识

<br />很长时间以来,游戏产业不允许新的血液加入,因为每个职位都要求申请人有2年以上的经验。但是现在是加入游戏产业的最好的时机。因为研发队伍的急剧 增长,有经验的人很难找了,所以越来越多的公司从大学里招人。不管你上的是什么大学,你都有机会在游戏产业里找到一份工作。你需要熟悉以下领域。 <br />    数学 - 对于视频游戏开发,这个非常重要。不,你不需要去记如何求一个绕x轴旋转的曲面的表面积。 你需要有很好的线性代数技能。如果你不知道点乘的公式(a dot b = a.x * b.x

o2snake的专栏 767

Unity 如何实现一个强大的MMO技能系统!

1. 如何实现一个强大的MMO技能系统——序章 前言 技能系统可以说是游戏中广泛存在而又最重要的系统了,它是整个游戏战斗体验的核心。一套强大的技能系统可以让游戏的策略性,可玩性得到极大的提升。然而技能系统牵涉到的模块非常多,又会面对策划各种各样的奇葩需求,同时技能模块中很多系统的设计不仅仅对程序员的编码能力提出了一定的要求,而且还需要程序员游戏机制有着深入的理解。可以说要实现一套强力的高可用高扩展的技能系统还是有一定复杂度的。 如果作为一个游戏玩家,谈论到技能系统,我们一定会对War3的技能编辑器印象深刻

TxNet 1万+

完了!Windows弱爆了!它才是程序员的首选!程序员:真的好用!

最近有很多程序员在CSDN博客发帖讨论:用Windows还是Linux? 关于这个问题,其实答案很简单:做开发首选Linux。 如果一个程序员从来没有在Linux上开发过程序, 一直在Windows上面开发程序,同样是工作5年,在Linux上开发5年的程序员,会比在其他系统上开发的厉害很多! 而且如果你经常看招聘信息,不难发现,几乎超过90%的技术岗都需要会Linux,已经成了面试的必问题!...

CSDN学习 3万+

84.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-筛选与技能有关的数据包

网络游戏逆向、网络游戏安全、网络游戏攻防、c++、反游戏外挂、游戏外挂原理

计算机王的博客 2411

IT公司急需的程序员要掌握的几大关键技能

在当今竞争激烈的环境中,程序员必须不断学习和持续更新硬技能。那么成为一名企业急需的程序员需要学习什么呢? 本文,我列出了IT专业人员在人才竞争中必须具备的几大关键技能,这也是技术人员需要掌握的关键核心。 1、Python 除了人工智能用到了PythonPython还可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。 目前业内几乎所有大中型互联网企业都在使用Python,如Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Y

xiaoxijing的博客 1833

企业对C/C++程序员技能要求

一个人应该具备对事物的思考能力,否则容易被忽悠。对大部分未入门或刚入门的菜鸟来说,很难搞明白C语言能做什么和C程序员在做什么这两个问题。 如果你打算种菜,必须先了解行情(包括销量和价钱),如果你打算学习C语言,也应该先了解C程序员的行情。 了解青菜的行情要去菜市场,了解C程序员的行情要去人才市场。 我们先来查一些资料。 C语言与...

C语言技术网-码农有道 3884
上一篇: 小学没跟上编程的步伐,长大了这样弥补,网友:一切都是为了生活
下一篇: Python超全干货:【二叉树】基础知识大全
土豆编程
博客等级 码龄6年 105粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值