UE4网络功能相关笔记
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网络功能相关笔记的更多相关文章
- UE4网络同步属性笔记
GameMode只有服务端有,适合写游戏逻辑.PlayerController每个客户端拥有一个,并拥有主控权.GameState在服务端同步到全端. CLIENT生成的Actor对其有Authori ...
- ue4网络同步概念笔记
网络同步主要的概念是 复制. 不是以前的S,C逻辑分离. 是S复制到C通过 Switch Has Authority 将S与C的逻辑在程序内分离. 所属权:每个连接到S的C都有自己的 控制权.从 ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- [马哥学习笔记]Linux系统裁剪之制作带网络功能的可启动linux
知识基础: 系统启动流程:POST-->BIOS(boot sequence)-->GRUB(bootloder(stage1:MBR;stage2:grub目录中))-->kern ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- 红帽学习笔记[RHCSA] 第七课[网络配置相关]
第七课[网络配置相关] 在Vmware中添加网卡 编辑 -> 编辑虚拟网络 -> 添加网络->随便选择一个如VMnet2-> 选择仅主机模式 -> 勾掉使用本地DHCP服 ...
- 深入浅出UE4网络
UE4中的官方文档结构比较混乱,且有部分错误,不方便学习.笔者试图通过本文,整理出一篇关于UE4网络的文章,方便朋友们对UE4中的网络同步部分的认识,并有进一步理解.如有讲得不清楚明白的地方,还望批评 ...
随机推荐
- 实验报告5&第七周课程总结
实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...
- Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)
Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...
- 【监控笔记】【1.3】监控事件系列——SQL Trace(黑盒跟踪 BlackBox Trace)
[1]它跟踪了哪些事件? (1.1)存储过程执行(SP:Strating) (1.2)T-SQL执行(SQL:BatchString) (1.3)错误和警告(Exception,Attention) ...
- 背包dp相关
0/1背包 给出n个物品,每个物品有Vi的价值和Wi的费用,我们总共有m块钱,求最多能得到多少价值的物品. N<=10^3,m<=10^3 记录方案数?记录输出方案? 输出方案: 对每个d ...
- qt 部分控件 setStyleSheet 使用总结
刚用Qt不久,但是已经感受到Qt ui设计的便捷. 总结一下最近使用的控件,把它们setStyleSheet的使用方法记录下来. 主要使用到的工具有:QToolBar,QToolBox,QPushBu ...
- Python 入门之 内置模块 -- time模块
Python 入门之 内置模块 -- time模块 1.time模块 time翻译过来就是时间,这个模块是与时间相关的模块 import time # 内置模块 -- 标准库 (1)time.ti ...
- nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG
需求描述,由于工作的需要,需要将原本用于1280 720的网页改为1920 1080的网页(电视端页面).需求可以拆分为两部分,代码部分的修改以及图片的修改.在代码部分,需要将所有位置以及大小相关的值 ...
- 攻防世界--IgniteMe
测试文件:https://adworld.xctf.org.cn/media/task/attachments/fac4d1290e604fdfacbbe06fd1a5ca39.exe 1.准备 获取 ...
- vscode 热部署 spring-mvc
1.添加maven插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId> ...
- Python 中Semaphore 信号量对象、Event事件、Condition
Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...