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. RPM包或源码包

    安装RPM包或源码包 点击vmware右下角光驱连接. 安装rpm包 -i:表示安装 -v:表示可视化 -h:表示显示安装进度 (同时使用) --force:表示强制安装,即使覆盖属于其他包的文件也要 ...

  2. python 并发编程 多进程 Process对象的其他属性方法 join 方法

    一 Process对象的join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一: 在主进程的任务与子进程的任务彼此独立的情况下 ...

  3. 分享一个linux系统中循环遍历两个数组内容,并输出数组中的不同内容的shell脚本

    cat diffarray.sh #!/bin/bash arry_list1=(1 2 3 4 5 6 7 8 9) arry_list2=(3 5 8) declare -a diff_list ...

  4. GCC 编译参数

    -s 这个参数会把符号表从最终的可执行文件中删除.没有符号表,你就不能用gdb调试了,但是程序会更小 -O0 不做任何优化,这是默认的编译选项 -c 只编译不链接,产生.o文件,就是obj文件,不产生 ...

  5. (4.25)Sqlserver中 登录用户只能看到自己拥有权限的库

    Sqlserver中 登录用户只能看到自己拥有权限的库 转自:https://www.cnblogs.com/huangtailang/p/4209180.html 相关参考:https://www. ...

  6. vue组件化编程应用

    写几个小案例来理解vue的组件化编程思想,下面是一个demo. 效果图示: 功能: Add组件用于添加用户评论,提交后右边评论回复会立马显示数据.Item组件点击删除可以删除当前用户评论.当List组 ...

  7. python列表,字典,集合

    初识模块 import sys print(sys.path)#查看化境变量 print(sys.argv)#查看文件的相对路径,但是在pachrm中 会自动转为绝对路径 import os #os. ...

  8. CSP2019

    $CSP\space S$ 格雷码 $solution:$ 直接模拟即可. 时间复杂度 $O(n)$ . #include<iostream> #include<cstring> ...

  9. 2、Java调用C语言(JNative法)

    这个方法也是挺麻烦的…… 一.下载JNative.jar,把它放在你jdk下的\jre\lib\ext目录下 二.在 F:\MinGW\JNative 新建 Test.java: public cla ...

  10. 吴恩达深度学习:2.1Logistic Regression逻辑回归及其损失函数

    1.Logistic Regression是一个二元分类问题 (1)已知输入的特征向量x可能是一张图,你希望把它识别出来,这是不是猫图,你需要一个算法,可以给出预测值,更正式的y是一个概率,当输入特征 ...