当前位置: 首页 > news >正文

UE5——网络——RPC

RPC(这个是官方文档的资料)

要将一个函数声明为 RPC,您只需将 Server、Client 或 NetMulticast 关键字添加到 UFUNCTION 声明。

例如,若要将某个函数声明为一个要在服务器上调用、但需要在客户端上执行的 RPC,您可以这样做:

   UFUNCTION( Client )void ClientRPCFunction();

要将某个函数声明为一个要在客户端上调用、但需要在服务器上执行的 RPC,您可以采取类似的方法,但需要使用 Server 关键字:

UFUNCTION( Server )void ServerRPCFunction();

此外,还有一种叫做多播(Multicast)的特殊类型的 RPC 函数。多播 RPC 可以从服务器调用,然后在服务器和当前连接的所有客户端上执行。 要声明一个多播函数,您只需使用 NetMulticast 关键字:

UFUNCTION( NetMulticast )void MulticastRPCFunction();

要求和注意事项

多播 RPC 还可以从客户端调用,但这时就只能在本地执行。

1.您必须满足一些要求才能充分发挥 RPC 的作用:2.它们必须从 Actor 上调用。3.Actor 必须被复制。4.如果 RPC 是从服务器调用并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。5.如果 RPC 是从客户端调用并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。6.多播 RPC 则是个例外:如果它们是从服务器调用,服务器将在本地和所有已连接的客户端上执行它们。如果它们是从客户端调用,则只在本地而非服务器上执行。现在,我们有了一个简单的多播事件限制机制:在特定 Actor 的网络更新期内,多播函数将不会复制两次以上。按长期计划,我们会对此进行改  善,同时更好的支持跨通道流量管理与限制。

例子

Client (服务器的调用客户端执行)

	UFUNCTION(Server, Reliable)void FunctionServer();UFUNCTION(Client, Reliable)void FunctionClient();
void ARPCProjectCharacter::FunctionServer_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));FunctionClient();
}
void ARPCProjectCharacter::FunctionClient_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionClient"));UE_LOG(LogTemp,Warning,TEXT("FunctionClient"));
}
void ARPCProjectCharacter::StartFire()
{GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));UE_LOG(LogTemp,Warning,TEXT("Click"));FunctionServer();
}

在这里插入图片描述

Server (客户端调用服务端执行)

	UFUNCTION(Server, Reliable)void FunctionServer();
void ARPCProjectCharacter::FunctionServer_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));
}
void ARPCProjectCharacter::StartFire()
{GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));UE_LOG(LogTemp,Warning,TEXT("Click"));FunctionServer();
}

在这里插入图片描述

NetMulticast (客户端调用服务端执行)

	UFUNCTION(Server, Reliable)void FunctionServer();UFUNCTION(Client, Reliable)void FunctionClient();UFUNCTION(NetMulticast, Reliable)void FunctionNetMulticast();
void ARPCProjectCharacter::FunctionServer_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));FunctionClient();FunctionNetMulticast();
}
void ARPCProjectCharacter::FunctionNetMulticast_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionNetMulticast"));UE_LOG(LogTemp,Warning,TEXT("FunctionNetMulticast"));
}
void ARPCProjectCharacter::FunctionClient_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionClient"));UE_LOG(LogTemp,Warning,TEXT("FunctionClient"));
}
void ARPCProjectCharacter::StartFire()
{GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));UE_LOG(LogTemp,Warning,TEXT("Click"));FunctionServer();
}

在这里插入图片描述

官方图表

在这里插入图片描述

验证

UFUNCTION( Server, WithValidation )void FunctiHpServer( int32 AddHealth );
void ARPCProjectCharacter::FunctiHpServer_Implementation(int32 AddHealth)
{}bool ARPCProjectCharacter::FunctiHpServer_Validate(int32 AddHealth)
{if (AddHealth>0){return true;}return false;
}

可靠性

必须将RPC指定为 可靠 或 不可靠。在蓝图中,函数和事件默认为不可靠。要将函数指定为可靠,将细节面板(Details Panel)中的 可靠(Reliable) 设置设为 true。在C++中,必须将 Reliable 或 Unreliable 说明符作为 Server、Client 或 NetMulticast 函数,添加到RPC的 UFUNCTION 宏及其状态。

不可靠RPC无法保证必会到达预定目的地,但其发送速度和频率高于可靠的RPC。其最适用于对gameplay而言不重要或经常调用的函数。例如,由于Actor移动每帧都可能变换,因此使用不可靠RPC复制该Actor移动。

可靠的RPC保证到达预定目的地,并在成功接收之前一直保留在队列中。其最适合用于对gameplay很关键或者不经常调用的函数。相关例子包括碰撞事件、武器发射的开始或结束,或生成Actor。

滥用可靠函数可能导致其队列溢出,此操作将强制断开连接。若逐帧调用复制函数,应将其设为不可靠。若拥有与玩家输入绑定的可靠函数,应限制玩家调用该函数的频率。

网络提示

1.尽可能少用RPC或复制蓝图函数。在合适情况下改用RepNotify。
2.组播函数会导致会话中各连接客户端的额外网络流量,需尤其少用。
3.若能保证非复制函数仅在服务器上执行,则服务器RPC中无需包含纯服务器逻辑。
4.将可靠RPC绑定到玩家输入时需谨慎。玩家可能会快速反复点击按钮,导致可靠RPC队列溢出。应采取措施限制玩家激活此项的频率。
5.若游戏频繁调用RPC或复制函数,如tick时,则应将其设为不可靠。
6.部分函数可重复使用。调用其响应游戏逻辑,然后调用其响应RepNotify,确保客户端和服务器拥有并列执行即可。
7.检查Actor的网络角色可查看其是否为 ROLE_Authority。此方法适用于过滤函数中的执行,该函数同时在服务器和客户端上激活。
8.使用C++中的 IsLocallyControlled 函数或蓝图中的Is Locally Controlled函数,可检查Pawn是否受本地控制。基于执行是否与拥有客户端相关来过滤函数时,此方法十分拥有。
9.构造期间Pawn可能未被指定控制器,因此避免在构造函数脚本中使用IsLocallyControlled

相关文章:

UE5——网络——RPC

RPC(这个是官方文档的资料) 要将一个函数声明为 RPC,您只需将 Server、Client 或 NetMulticast 关键字添加到 UFUNCTION 声明。 例如,若要将某个函数声明为一个要在服务器上调用、但需要在客户端上执行的 RPC,您可以…...

基于ASP.NET MVC + Bootstrap的仓库管理系统

基于ASP.NET MVC Bootstrap的仓库管理系统。源码亲测可用,含有简单的说明文档。 适合单仓库,基本的仓库入库管理,出库管理,盘点,报损,移库,库位等管理,有着可视化图表。 系统采用Bo…...

Jetson NX FFmpeg硬件编解码实现

最近在用Jetson Xavier NX板子做视频处理,但是CPU进行视频编解码,效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看,发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改,因此需…...

5.2用队列实现栈(LC225-E)

算法: 其实这道题不用像上一道题一样,用两个队列实现栈。 由于队列的数据结构特性。用一个队列就可实现栈。 难点还是在出队的时候: 比如队列[1,2,3],要模拟一个栈入栈就是直接append(其实就是C中的push&#xff0…...

项目上线前发现严重Bug怎么办?

今天分享一个面试问题,现在有一个面试场景: 项目计划明天发布,但是在今天你作为测试人员发现了一个严重的bug,市场相关人员又在催发布的事情,这个时候你应该怎么办? 这是测试工程师不管是在面试&#xff0…...

【WPF系列】- Application详解

【WPF系列】- Application详解 文章目录 【WPF系列】- Application详解一、Application简介Application 类具体有以下功能: 二、初始App.xaml二、自定义Main方法启动WPF应用程序第一种:启动应用程序的代码第二种:启动应用程序的代码第三种:启…...

常见的内置方法:__call__,__getitem__,__iter__,__next__

1.__call__方法 在创建好一个实例后,直接调用一个实例会报错。但使用__call__后,可以让这个实例可以像方法一样被调用(就是一个函数后面加个括号的函数调用形式) class Person:passp1 Person() p1() # 实例这样无法直接被调…...

python用cv2画图(line, rectangle, text等)

Python做图像图形研究的时候,通常需要画很多辅助几何形状(比如bounding box等)。基于opencv的几何图形绘制具有易用性,而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法,当一个简易的手册使用&a…...

解决方案中word中分页符的使用

在投标方案中要善于使用“分页符”,尽可能少使用分节符号,没有分页符前,你每次修改你的标书或者文件,增加或者修改内容后。你的格式字段前后都是会发生变化,如何稳定的保证结构呢,那就是分页符的使用&#…...

ubuntu20.04下apache启用php7.4-fpm

默认的apache不解析php文件: 直接安装提示依赖有问题: libapache2-mod-php7.4 : Depends: php7.4-common ( 7.4.3-4ubuntu2.19) but 1:7.4.33-8ubuntu20.04.1deb.sury.org1 is to be installed rootfv-az1492-145:/tmp# sudo apt install libapache2-…...

在 CentOS 服务器上部署 JAR 文件到 Docker 容器

标题:在 CentOS 服务器上部署 JAR 文件到 Docker 容器的详细步骤 步骤 1: 确保 Docker 已安装 在开始之前,确保在 CentOS 服务器上已经安装了 Docker。如果没有安装,可以使用以下命令进行安装: sudo yum install docker步骤 2:…...

vector类模拟实现(c++)(学习笔记)

vector 构造函数析构函数[]push_backsize()capacity()reserve()push_back() 迭代器实现非const和const版本 pop_back()resize()insert()***重点erase()***重点再谈构造函数!拷贝构造函数****(重点)运算符重载***(重点)…...

Redis Sentinel 哨兵模式

Sentinel 哨兵模式 Redis Sentinel 官网 Redis 的 Sentinel 文档 -- Redis中国用户组(CRUG) Sentinel Redis 命令参考(红色) Sentinel 通过监控的方式获取主机的工作状态是否正常,当主机发生故障时, Senti…...

实用篇-MQ消息队列

一、初识MQ 通讯分为同步通讯和异步通讯,同步通讯就比如我们日常生活中的打电话,看直播,能够得到及时的反馈。而异步通讯则类似于聊天软件聊天,不需要建立实时的连接,并且可以进行建立多个业务一起异步执行 1. 同步通…...

springboot打包时依赖jar和项目jar分开打包;jar包瘦身

概述 最近感觉项目在部署时时jar包传输太慢了; 看了下jar包内容,除了项目代码,其余大部分都是依赖jar; 平时改动较多的只是项目代码,依赖jar改动比较少; 所以就在想能不能分开打包;这样只部署项…...

嵌入式系统的元素

注意:关于嵌入式系统的元素这一块儿内容,定义太多了。例如:吉姆莱丁 著,陈会翔 译,由清华大学出版社出版的《构建高性能嵌入式系统》中提到:嵌入式系统通常由电源、时基、数字处理、内存、软件和固件、专用…...

提升ChatGPT答案质量和准确性的方法Prompt engineering实用的prompt灵感和技巧

文章目录 1. 实用的prompt灵感和技巧小技巧常用prompt保存到输入法中普通promptprompt通用公式保存到输入法快捷指令中尝试用英语去写prompt沉浸式翻译软件3. 补充1. 实用的prompt灵感和技巧 解释***,并且给出暗喻/隐喻/类比(解释术语、专业名称,用一个词或短语指出常见的一…...

[Machine Learning] Learning with Noisy Labels

文章目录 随机分类噪声 (Random Classification Noise, RCN)类别依赖的标签噪声 (Class-Dependent Noise, CCN)二分类多分类 实例和类别依赖的标签噪声 (Instance and Label-Dependent Noise, ILN) 标签噪声是指分类任务中的标签被错误地标记。这可能是由于各种原因&#xff0c…...

集简云slack(自建)无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

slack是一个工作效率管理平台,让每个人都能够使用无代码自动化和 AI 功能,还可以无缝连接搜索和知识共享,并确保团队保持联系和参与。在世界各地,Slack 不仅受到公司的信任,同时也是人们偏好使用的平台。 官网&#x…...

Idea 对容器中的 Java 程序断点远程调试

第一种:简单粗暴型 直接在java程序中添加log.info(),根据需要打印信息然后打包覆盖,根据日志查看相关信息 第二种:远程调试 在IDEA右上角点击编辑配置设置相关参数在Dockerfile中加入 "-jar", "-agentlib:jdwp…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...