RepNotity的作用

把变量设置成RepNotify除了像C#语言中的"属性"一样,提供一个改变变量时调用一个函数的机会以外,其真正重要的作用其实是应对网通同步延迟问题

一定要牢记网络同步是需要时间的,不像单机编程一样,程序的执行是同步的,即时的。

每个设置成“replicated"的属性的同步,以及RPC都是需要时间的,即使是局域网,即使是同一台机器上多个客户端,相互直接通信都是需要时间的-虽然时间很短,但也需要考虑到。

假设一个情形:某客户端的某个属性P变化以后,要让服务器执行某个函数F(这个函数需要用到属性P作为参数)。

错误的做法是在改变属性P之后立即执行服务器的函数F,因为一般情况下,P都不可能立即同步到服务器,那么函数F调用的P是较老的,未更新的数值。

正确的做法是将该属性设置成RepNotify,在自动生成的OnRep_P函数中调用函数F,这样做可以保证这个函数F是在属性P同步到服务器之后才执行。

客户端连接后都发生了什么?

情形:服务端先开启并创建Session,客户端开启并寻找Session,找到之后进行连接。

实验如图所示:

经过这个实验,至少摸清楚了以下几个过程(覆盖并不是很全,只保证这些步骤的相对时间顺序是正确的):

服务端和客户端相同的步骤(因为客户端在未连接服务端时候,也相当于服务端,所以是等价的)

1. GameInstance的Init函数被调用

2. GameMode中的OnPostLogin被调用,相当于自身连接到自身,所以会触发一个OnPostLogin(注意OnPostLogin是早于任何Actor的BeginPlay的)

3. PlayerController的BeginPlay被调用(这里只测试了PlayerController的,PlayerState,GameMode,GameState等其他几个相关类的BeginPlay也应该是这个阶段,只是先后顺序我并没有测试)

4. 关卡被加载

之后服务端创建了Session,客户端查找并连接到Session,这个步骤是人为的,不是固定的

----------------------------------------------------------------------------------------------------------

在连接到Session的瞬间发生了如下事件:(这里是重点)

1. 客户端的PlayerController被重新生成了(老的被销毁,生成了一个新的),并传参给GameMode的OnPostLogin事件。此时根据逻辑来说,PlayerState应该也被重新生成了。服务端的PlayerController目测应该还是之前的那个,并没有重新生成

2. GameMode(只存在于服务端)的OnPostLogin被调用,记录在GameState中的PlayerArray中增加了元素

3. 客户端的地图又被加载,而此过程中服务端的地图并没有发生任何变化

(注意上面2和3的步骤顺序并不一定正确)

GameState和GameMode

这里需要知道,客户端的GameMode被无情抛弃,因为只存在于服务器上。实际上客户端"老的”GameState也被抛弃了,现在都从服务器上同步了一个新的GameState。

GameInstance

GameInstance仍存在与每个实例中,没有发生任何改变,没有被销毁或者重生,也不会被网络同步,自己的就是自己的,所以适合于记录一些每个客户端特定的信息。

但是从服务器端要想访问到某个客户端的GameInstance,需要费点周折,要使用从客户端运行的(Run on owning Client)函数,或者利用replicated的对象,在其蓝图中加一个Swith has authority,然后在其remote后面获取GameInstance。

总结一下:说简单点,客户端连接服务端以后,实际上只"带过来"了PlayerController(还是新生成的)和GameInstance(这个很专一,自始自终没有变,除非客户端程序被关闭),剩下的都要重新建立,比如地图要加载,Pawn要重新生成(在PostLogin过程中),PlayerState要重新生成,GameMode没了,GameState也要从服务器上同步一个过来。

----------------------------------------------------------------------------------------------------------

UE4网络功能相关笔记的更多相关文章

  1. UE4网络同步属性笔记

    GameMode只有服务端有,适合写游戏逻辑.PlayerController每个客户端拥有一个,并拥有主控权.GameState在服务端同步到全端. CLIENT生成的Actor对其有Authori ...

  2. ue4网络同步概念笔记

    网络同步主要的概念是 复制.  不是以前的S,C逻辑分离.  是S复制到C通过 Switch Has Authority  将S与C的逻辑在程序内分离. 所属权:每个连接到S的C都有自己的 控制权.从 ...

  3. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  4. Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  5. [马哥学习笔记]Linux系统裁剪之制作带网络功能的可启动linux

    知识基础: 系统启动流程:POST-->BIOS(boot sequence)-->GRUB(bootloder(stage1:MBR;stage2:grub目录中))-->kern ...

  6. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  7. Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  8. 红帽学习笔记[RHCSA] 第七课[网络配置相关]

    第七课[网络配置相关] 在Vmware中添加网卡 编辑 -> 编辑虚拟网络 -> 添加网络->随便选择一个如VMnet2-> 选择仅主机模式 -> 勾掉使用本地DHCP服 ...

  9. 深入浅出UE4网络

    UE4中的官方文档结构比较混乱,且有部分错误,不方便学习.笔者试图通过本文,整理出一篇关于UE4网络的文章,方便朋友们对UE4中的网络同步部分的认识,并有进一步理解.如有讲得不清楚明白的地方,还望批评 ...

随机推荐

  1. call 和 apply的定义和区别?

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  2. kafka使用问题解决

    java.lang.UnsupportedClassVersionError:org/apach/kafka/comon/utils/Utils:Unsupport major.minor versi ...

  3. ant buid.xml 模板

    <?xml version="1.0" encoding="UTF-8"?> <project name="ant" de ...

  4. QQ管理

    ##用例1:查询数据 #01.查询QQ号码为54789625的所有好友信息,包括QQ号码,昵称,年龄 # # SELECT `relation`.RelationQQID AS QQ号码,`basei ...

  5. 用adb logcat抓取log

    实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志     状态信息的有:adb shell dmesg, ...

  6. django商城项目之用sentry管理日志

    之前写商城项目的时候,采用的日志处理方式为在终端输出或者写入文件,这样的话,项目部署上线之后,若服务器出现错误,需要到服务器查看相关的错误日志,很不方便.后期在学习别人开源项目的时候,学习到一个开源的 ...

  7. C#设计模式:备忘录模式(Memento Pattern)

    一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...

  8. Spark Streaming整合logstash + Kafka wordCount

    1.安装logstash,直接解压即可 测试logstash是否可以正常运行 bin/logstash -e 'input { stdin { } } output { stdout {codec = ...

  9. Android数据库使用指南(上)

    前言Android上的数据库是sqlite,虽然这个数据库是轻量级的,但是储存的东西可不少,sqlite官方表示理论存储容量为140TB,目前应该没有那么大容量的手机,存储能力太强了. 关于如何使用S ...

  10. 大数据数据库HBase(二)——搭建与JavaAPI

    一.搭建 1.选择一台没有ZK的机器(HBase自带ZK,可能会导致冲突) 2.选择版本2.0.5的HBase 3.解压HBase2.0.5 4.配置HBase的HBASE_HOME和path 5.修 ...