3:虚幻引擎网络架构:GameInfo,PlayerMove

  1.GameInfo和Network初始化

  在一个单独类中是使用WorldInfo.Game来获取当前的游戏类型的,在客户端是没有GameInfo,即WorldInfo.Game=none。而只有服务器端才会具有,因为只有服务器端规定了游戏规则。

  在游戏启动的时候,GameInfo会进行以下序列:

  - event InitGame(string options,out string ErrorMessage),即服务器启动游戏时调用这个函数,解析URL选项,如 Unreal.exe MyLevel.rnr?Game=unreali.teamgame,其中Option字符串是?game=unreali.teamgame。错误将返回失败

  - event PreLogin(string Options,string Address,out string ErrorMessage,out string FailCode), 当客户端登录时调用这个函数,使得服务器可以拒绝玩家,这是服务器可以验证玩家的密码,执行限制。

  - event Login(string Portal,string Options,out string ErrorMessage),当调用PreLogin正确后调用,负责使用Option中的参数来生成玩家,成功返回PlayerController,Login和PostLogin也负责在单机游戏中创建PlayerController

- event PostLogin(PlayerController NewPlayer) 可以为函数赋值等操作。

  

  2.预测玩家移动

  Unreal不是使用了纯粹的客户端-服务器模式,否则玩家的运动是非常缓慢的,我估计大多数国产网络游戏使用的是这种方式(大牛勿喷哈:D)。

  若是传统的网络模式,会是这样:如果网络延迟是300ms,那么游戏延迟将会达到300ms。Unreal使用了QuakeWorld的预测方式,即在UnrealScript中进行实现。这是在PlayerController中实现的一个高级功能,而不是网络代码的功能。

  

  Unreal客户端的运动预测是基于网络代码中的复制功能设计的。在PlayerPawn中可以查看其代码,这种方法被描述为锁步,预测/校正 算法。

  客户端考虑了操作键盘,手柄,鼠标,物理力(重力,浮力,区域速度)并把它描述为3D加速度矢量。在复制函数中调用ServerMove,客户端把它的加速度及各种输入相关的信息及它当前的时间戳(WorldInfo.TimeSeconds)发送给服务器端。由于过程详细且重要,我直接将流程表复制以下方便观察:

服务器   客户端
    ReplicateMove()
    调用这个函数替代 ProcessMove()。 根据玩家输入进行 pawn 物理更新,保存(在 PlayerController SavedMoves 中)并复制结果。 SavedMove 可以是子类,保存游戏指定的运动输入和结果。 ReplicateMove() 也会尝试结合复制的运动来保存上游带宽并改善服务器性能。
ServerMove() <- CallServerMove()
根据接收到的输入进行 pawn 物理更新,然后将结果与客户端发送的结果对比。 注意根据客户端计时器进行运动更新。 如果客户端已经积聚了一个严重的位置错误,那么请求校正。 否则,请求确认运动适宜。   发送一个或两个当前运动(根据帧速率和可以使用的带宽),它们附带客户端时钟时间戳记。 每次发送两个运动可以保存带宽,但是会增加校正的延迟时间。 在包丢失的情况下也可以调用 OldServerMove() 重新发送最近的“重要”运动。
SendClientAdjustment() -> ClientAckGoodMove()
推迟到 PlayerController 记号的末端的客户端相应可以在多个 ServerMoves() 接收到这个记号的情况下避免发送多个响应。 如果没有错误,那么确认运动适宜。   根据时间戳记的环回时间更新 ping,通过以前的时间戳记清除保存的运动。
服务器   客户端
SendClientAdjustment() -> ClientAdjustPosition()
推迟到 PlayerController 记号的末端的客户端相应可以在多个 ServerMoves() 接收到这个记号的情况下避免发送多个响应。 如果有错误,请调用 ClientAdjustPosition() 确认运动适宜。   使用校正时间戳记之前的时间戳记清除 SavedMoves。 将 Pawn 移动到服务器指定的位置,然后设置 bUpdatePosition。
    ClientUpdatePosition()
    在 bUpdatePosition 为 true 的情况下通过 PlayerTick() 调用这个函数。 重新播放所有未完成的 SavedMoves 使 Pawn 返回当前客户端时间。

  在服务器端有一些非关联性的动画不需要执行,例如你在看CS中丢手雷,手雷出去但并没有看到手丢的动作,我们使用bUpdateSkelWhenNoRendered和IgnoreControllersWhenNotRendered为false来让其在服务器端不更新。

  对于尸体bTearOff=true将不会被复制到客户端,并且在已经复制了这个Actor的客户端上关闭变成一个Role_Authority。当接收到bTearOff,会调用TornOff()

  3.武器开火

  - 一旦玩家输入开火,客户端将会立即播放开火特效。并调用ServerStartFire()和ServerStopFire()函数来要求服务器开火。

  客户端有足够的信息来预测当前是否在开火,例如根据(子弹数量,武器时间状态)来预测武器是否开火。

  - 服务器Spawn Projectile,这个Projectile将会被复制到Client。

  Projectile:

  Projectile也可以很轻易的进行预测。

  bNetTemporary=true

  当被复制后,Actor Channel将会被关闭,Actor将永远不会被更新,Actor将会被client,Destroy掉。

  涉及网络部分的内容还非常的多,只有深入操作才能更好的理解和记忆。下一章将会进行实例代码。

  

时间: 2024-10-06 08:23:38

3:虚幻引擎网络架构:GameInfo,PlayerMove的相关文章

1:虚幻引擎网络架构:Actors

终于有时间了,打算在这个周末认认真真的研究虚幻引擎网络架构,同时我在Safaribooksonline上面发现了一本能让我的生活变得轻松的书Multiplayer Game Programming by Rough Cuts,这个周末好好享用哟.  好了,承接上一次的内容:为什么虚幻引擎的网络架构这么的高效? 1.从他的架构模式继续广义的客户端-服务器模型(Generalized Client-Server model): 在这个模型中服务器还是控制着游戏状态的变化,客户端运行着和服务器一样的代

2:虚幻引擎网络架构:Replication

虚幻引擎的网络架构主要功能即是通过Replication Actor,Variable, function来保持服务器和客户端的信息同步.Unreal的每一个类都有一个复制语句Replication{}.这个块中可以进行变量和函数的复制. 这是在PlayerReplication中的复制语句 Replication { //服务器应该发送到客户断的数据. if ( bNetDirty && ( Role == Role_Authority ) ) Score, Deaths, bHasFl

4:虚幻引擎网络架构:技术要点总结篇

Replication要点 1.simulated function  在网络环境中只有exec,client , simulated 函数才在客户端进行调用.如果一个函数没有任何前缀,它只会在Server中进行调用. 另外,对于一个simulated function,他要么是被另外一个simulated function 调用,要么就是在native函数中被调用才能在客户端执行.   应用举例 simulated function PostBeginPlay() { `log("PostBe

大象无形_虚幻引擎程序设计浅析pdf

下载地址:网盘下载 <大象无形:虚幻引擎程序设计浅析>以两位作者本人在使用虚幻引擎过程中的实际经历为参考,包括三大部分:使用C++语言进行游戏性编程.了解虚幻引擎本身底层结构与渲染结构.编写插件扩展虚幻引擎.提供了不同于官方文档内容的虚幻引擎相关细节和有效实践.有助于读者一窥虚幻引擎本身设计的精妙之处,并能学习到定制虚幻引擎所需的基础知识,实现对其的按需定制. <大象无形:虚幻引擎程序设计浅析>适合初步了解虚幻引擎编程,希望了解虚幻引擎本身架构或者希望定制和扩展虚幻引擎的读者. 作

(转)虚幻引擎3--Unreal角色技术指南

注: 转自UN官方网站,买书.下视频,到头来发现还是官方的免费Tutorial写得最好, 本文适用于熟悉UDK操作,想继续深入本质原理的读者~ 很好的说明了Pawn,Controller的关系,许多问题感觉茅塞顿开,故转之~~ 角色技术指南 使用2011 年 6 月的UDK版本进行了最后测试 角色技术指南 概述 Controllers(控制器) Controllers(控制器) Pawns和Possession(占有) Inventory(武器库) 运动和导航 相机/ 瞄准 Player Con

(转载)虚幻引擎3--12掌握虚幻技术UnrealScript 代理

第十二章- DELEGATES(代理) 12.1 –概述 12.2 - 声明代理(Delegate) 代理参数 默认行为 12.3 - 代理变量 12.4 - 传递Delegate(代理)给函数 12.5 - 代理和内存 12.6 -       UISCENE 和 UIOBJECT       DELEGATES(代理) UISCENE 代理 UIOBJECT 的代理 12.7 – 虚幻引擎3和虚幻竞技场3中的其它代理 AUDIOCOMPONENT GAMEINFO GAMEVIEWPORTC

(转载)虚幻引擎3--基础知识

这是虚幻引擎3UDN的技术文档,共有六个章节.以下将分别把中文译本贴出来,方便懒人学习[偷笑]  一.虚幻引擎 3 基础知识 概述 -------------------------------------------------------------------- 有几个游戏性元素实际上是所有使用虚幻引擎3或虚幻开发工具包创建的项目所共有的.自定义这些元素可以创建出完全独特的.外观和行为符合期望的游戏.没有任何两个项目是相同的,尽管虚幻引擎提供了这些元素的默认实现,但是肯定需要对它们进行很大

(转载)虚幻引擎3--11掌握虚幻技术UnrealScript 状态

第 11章 – STATES (状态) 11.1什么是状态编程 11.2虚幻引擎3中的状态 AUTO 关键字 IGNORES 关键字 SUPER        & GLOBAL 关键字 11.3 -基本的状态转换 GOTOSTATE GOTO STATE        EVENTS BEGINSTATE ENDSTATE 指南 11.1 – 状态触发器, 第一部分:函数重载 11.4 -状态继承 扩展状态 指南 11.2 –状态触发器, 第二部分:状态继承 指南11.3 – 状态触发器, 第三部

(转载)虚幻引擎3--2掌握虚幻技术UnrealScript初级学习

第二章: UNREALSCRIPT的初级学习 2.1基本语法 标识符和关键字 表达式和操作符 注释 2.2再生MUTATOR(设置方法) 设计类的计划 指南 2.1 –研究再生Mutaor(设置方法) 指南 2.2 –初始化PAWN类设置 指南 2.3 –设置再生计时器 指南 2.4 –mutator(设置方法)的脚本 指南 2.5 -编译脚本 指南 2.6 –发布及测试mutator(设置方法) 附加文件 第二章: UNREALSCRIPT的初级学习 无论您是第一次开始学习编程或者只是简单地学