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. 利用sshpass批量导入ssh-key

    #!/bin/bash set +x base_dir=$(pwd) ip_list='10.200.7.28,10.200.7.29,10.200.7.30,10.200.7.31' USER='r ...

  2. MySql日期加天数,小时,分钟...得到新的时间

    在当前的日期上加三天,天数随便改: SELECT date_add(CURRENT_DATE(), interval 3 day); 在指定的日期上加三天: SELECT date_add('2014 ...

  3. MyBatis一个对多个主键(索引)生成实体类的处理

    原数据库表: 生成实体类,多出了一个xxKey.java

  4. php读取excel文件并导入数据库(表头任意设定)

    最近收到一个很奇葩的需求,要求上传excel员工工资表,表格表头不固定,导入后字段名为表头的拼音,每月导入一次,当月重复导入则覆盖现有的当月表头,并且可以按照在界面上按照月份筛选显示,我写的代码主要包 ...

  5. 编写的Java第一个程序

    没什么好介绍的,嘻嘻 package head; public class ee { public static void main(String[] args) { System.out.print ...

  6. 深入了解RabbitMQ工作原理及简单使用

    深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...

  7. Java组合算法

    这是一个简单的问题,大一刚学编程的时候做的笔记. 打印出从1.2.3……n中取出r个数的不同组合(n>=r>=1) 例如n=3,r=2,输出: 1,2 2,3 下面是实现的代码: publ ...

  8. Mongo--03 mongo副本集、备份与恢复

    目录 一.mongo副本集配置 二.查看副本集状态 三.副本集权重调整 四.创建节点 五.仲裁节点 六.mongo备份与恢复 七.准备测试数据 一.mongo副本集配置 1.创建节点目录和数据目录 # ...

  9. PAT Advanced 1036 Boys vs Girls (25 分)

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  10. 牛客假日团队赛2 C 修围栏 ( 哈夫曼树,贪心)

    链接:https://ac.nowcoder.com/acm/contest/924/C 来源:牛客网 修围栏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...