快速了解 RPC & Replication 机制(纯问题版)

这篇具有很好参考价值的文章主要介绍了快速了解 RPC & Replication 机制(纯问题版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、本次讨论不会明晰底层原理。

2、官方基础知识

: https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Networking/Actors/

3、底层原理解析参考文章

: https://zhuanlan.zhihu.com/p/587136954

: https://zhuanlan.zhihu.com/p/590990669

: http://www.aclockworkberry.com/custom-struct-serialization-for-networking-in-unreal-engine/


//-------------------------------

RPC-问题(Level1):

Server端调用 Server RPC, 函数会被执行吗?

Client端调用 Client PR 不过 C, 函数会被执行吗?

//-------------------------------文章来源地址https://www.toymoban.com/news/detail-448650.html

//-------------------------------

RPC-问题(Level1):连续调用RPC,顺序有保障吗?

//-------------------------------

Function()

{

Actor_A->RPC_A1();

Actor_A->RPC_A2();

Actor_A->RPC_A();

Actor_B->RPC_B();

}

问题:RPC_A1/RPC_A2在远端的执行顺序是什么?

问题:RPC_A/RPC_B在远端的执行顺序是什么?

问题:为什么?

//-------------------------------

RPC-问题(Level2):为什么发送RPC时,远端执行RPC时,Actor参数可能会nullptr?

//-------------------------------

Actor_A->RPC_Call(AActor* Actor_B)

问题:哪种情况下,远端的 Actor_A->RPC_Call 时,形参 Actor_B = nullptr?

问题:为什么?

//-------------------------------

RPC-问题(Level3): DS创建一个Actor后,立刻当参数参与RPC,远端执行时, Actor参数是nullptr还是正常值?

//-------------------------------

ActorA = World->SpawnActor<AActor>();

RPC_Call(ActorA);

问题:RPC_Call在远端执行时,ActorA是否为nullptr?

问题2:为什么?

//-------------------------------

Replication-问题(Level3): 如果调用一个对象的RPC后立刻销毁它,远端会如何执行?

//-------------------------------

Actor_A->RPC_Call()

Actor_A->Destory();

问题: 远端RPC_Call会不会被调用?

//-------------------------------

RPC-问题(Level4): 如何确认本次RPC在本地端执行完毕(进入了NetDriver的队列,后续将会发向远端)?

//-------------------------------

RPC_Call()

问题:RPC_Call何时进入NetDriver机制的?(本端RPC函数执行后,向远端发送RPC消息之前)

//-------------------------------

Replication-问题(Level1):Replicated变量, 远端Var的值何时变化?

//-------------------------------

UPROPERTY(Replicated)

int Var = 0;

ServerFunction()

{

this.Var = 0;

this.Var = 1;

}

问题:如何在远端检测Var的值发生了变化?

//-------------------------------

Replication-问题(Level1):多次改变变量, 远端会发生几次OnRep回调?

//-------------------------------

UPROPERTY(ReplicatedUsing=OnRep_Var)

int Var = 0;

ServerFunction()

{

this.RepVar = 0;

this.RepVar = 1;

this.RepVar = 2;

}

问题:远端会产生几次OnRep_Var调用?

//-------------------------------

Replication-问题(Level2):一个 Actor* 对象,能正确Rep到远端吗?

//-------------------------------

UPROPERTY(ReplicatedUsing=OnRep_ActorB)

AActor* Actor_B;

ServerFunction(AActor* BBB)

{

Actor_A->Actor_B = BBB;

}

问题:远端发生 OnRep_ActorB 时, Actor_B 的值是什么?

//-------------------------------

Replication-问题(Level3):DS创建一个Actor后立即参与Replication,能正确Rep到远端吗?

//-------------------------------

UPROPERTY(ReplicatedUsing=OnRep_ActorB)

AActor* Actor_B;

ServerFunction()

{

AActor* B = World->SpawnActor<AActor>();

Actor_A->Actor_B = B;

}

问题:远端发生 OnRep_ActorB 时, Actor_A->Actor_B 的值可能是nullptr吗?

//-------------------------------

Replication-问题(Level4): 如果Replication的变量是一个结构体,包含Builtin类型和Actor*, 远端发生OnRep时分别是什么值?

//-------------------------------

UPROPERTY(ReplicatedUsing=OnRep_Data)

USTRUCT

struct FData

{

int Number = 0;

AActor* Actor_A = nullptr;

} Data;

ServerFunction()

{

Data.Number=1;

Data.Actor_A = World->SpawnActor<AActor>();

}

问题:远端发生 OnRep_Data 会发生几次? 每次发生时 Number 和 Actor_A 是什么值?

问题:为什么?

//-------------------------------

Replication-问题(Level4): 如果Replication的变量是一个TArray<AActor*>,远端会是什么情况?

//-------------------------------

UPROPERTY(ReplicatedUsing=OnRep_Array)

TArray<AActor*> Actors;

ServerFunction()

{

for(int i = 0; i < Actors.Length();++i)

Actors.Push(World->SpawnActor<AActor>());

}

问题: 远端发生 OnRep_Data 会发生几次? 每次发生时各个Element是什么值?

问题: 为什么?

//-------------------------------

Replication-问题(Level5): 如果需要强制同步某个变量,如何处理?

//-------------------------------

//-------------------------------

RPC&Replication-问题(Level4): 如果是UObject*类型,如何处理?

//-------------------------------

UPROPERTY(ReplicatedUsing=OnRep_Object)

UCLASS()

class UObjectT : public UObject

{

int a;

int b;

UObject* c;

} *Object;

ServerFunction()

{

UObjectT* NewObject = NewObject<UObjectT>();

Actor_A->Object = NewObject;

}

问题: Actor_A->Object 所指代的内容,是如何复制到远端的?

//-------------------------------

时序问题(Level1): 如果混用RPC & Replication,时序有保障吗?

//-------------------------------

ActorA->RPC_Call()

ActorA->RepVar = 1;

问题:远端的RPC_Call和OnRepVar谁先执行?

//-------------------------------

时序问题(Level2): GameplayResourceSet 机制

//-------------------------------

//-------------------------------

其他:Actor Replication 中的“相关性”、“优先级”、“RemoteRole”

//-------------------------------

//-------------------------------

其他:NetDeltaSerialize and Fast TArray Replication

//-------------------------------

//-------------------------------

其他:ActorComponent的复制

//-------------------------------

//-------------------------------

其他:Replication Graph

//-------------------------------

//-------------------------------

其他:网络性能分析工具

//-------------------------------

到了这里,关于快速了解 RPC & Replication 机制(纯问题版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度思考rpc框架面经之五:rpc熔断限流、rpc复用连接机制

    推荐文章:RPC实现原理之核心技术-限流熔断 限流是一种常见的系统保护手段。在分布式系统和微服务架构中, 一个接口的过度使用可能会导致资源的过载,例如CPU、内存、带宽等都可能成为瓶颈。为了避免系统崩溃,确保系统的可用性,并为所有用户提供公平和合理的服务

    2024年02月11日
    浏览(43)
  • RPC教程 4.超时处理机制

    对比原教程,这里使用context来处理子协程的泄露问题。 超时处理是 RPC 框架一个比较基本的能力,如果缺少超时处理机制,无论是服务端还是客户端都容易因为网络或其他错误导致挂死,资源耗尽,这些问题的出现大大地降低了服务的可用性。因此,我们需要在 RPC 框架中加

    2024年01月24日
    浏览(41)
  • 【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

    RpcService负责创建和启动Flink集群环境中RpcEndpoint组件的RpcServer,且RpcService在启动集群时会提前创建好。AkkaRpcService作为RpcService的唯一实现类,基于Akka的ActorSystem进行封装,为不同的RpcEndpoint创建相应的ActorRef实例。   RpcService主要包含如下两个重要方法。 startServer():用于启动

    2024年02月22日
    浏览(38)
  • 快速弄懂RPC

    基于REST架构的HTTP协议以及基于RPC协议的RPC框架。 是指 跨进程 的 功能调用 。 跨进程可以理解为 一个计算机节点的多个进程 或者 多个计算机节点的多个进程 。 远程过程调用 他是一种 通过网络从远程计算机程序上请求服务 ,而 不需要去了解底层网络技术 的一种 协议 。

    2023年04月24日
    浏览(23)
  • 警惕看不见的重试机制:为什么使用RPC必须考虑幂等性

    在RPC场景中因为重试或者没有实现幂等机制而导致的重复数据问题,必须引起大家重视,有可能会造成例如一次购买创建多笔订单,一条通知信息被发送多次等问题,这是技术人员必须面对和解决的问题。 有人可能会说:当调用失败时程序并没有显示重试,为什么还会产生重

    2024年02月06日
    浏览(40)
  • rpc、gRPC快速入门,python调用,protobuf协议

    远程过程调用协议RPC (Remote Procedure Call Protocol) RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据 举例:在 a服务内

    2024年02月13日
    浏览(56)
  • 【人工智能】人工智能的技术研究与安全问题的深入讨论

    前言    人工智能(Artificial Intelligence),英文缩写为AI 。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 📕作者简介: 热爱跑步的恒川 ,致力于C/C++、Java、

    2024年02月05日
    浏览(45)
  • 【与chatGPT讨论TypeScript中重载与c#语言中重载的问题】

    在 TypeScript 中,函数重载是指可以定义多个具有相同名称但参数列表或返回类型不同的函数。函数重载的主要目的是为了让编译器可以对函数调用进行类型检查,从而提高代码的安全性和可维护性。 一个函数的重载需要在同一个作用域中定义,使用 function 声明多个具

    2024年02月04日
    浏览(39)
  • ChatGPT探索系列之五:讨论人工智能伦理问题及ChatGPT的责任

    ChatGPT发展到目前,其实网上已经有大量资料了,博主做个收口,会出一个ChatGPT探索系列的文章,帮助大家深入了解ChatGPT的。整个系列文章会按照一下目标来完成: 理解ChatGPT的背景和应用领域; 学习GPT模型系列的发展历程和原理; 探究ChatGPT的训练、优化和应用方法; 分析

    2024年02月03日
    浏览(59)
  • 想着和GTP讨论关于人的一些哲学问题(答案很有意思)

    我:我觉得人活着没啥意义 GPT:作为AI语言模型,我当然不能给你身为人类的绝对回答,但我可以提供一些哲学和心理学上的观点供你参考。 人类作为一种高智能的生物存在于地球上已经很久了,并对自然环境和社会文明做出了许多贡献。每个人有自己的一种“存在意义”,

    2023年04月20日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包