GameDesign 板


LINE

网页版 https://yekdniwue.blogspot.tw/2018/01/pawnrpcserver.html 先前有遇到在某个class发送RPC (Remote procedure calls)都正常, 但是在某一个特定的class发送就发生server收不到的状况。 经过一番追查後发现原因在於Pawn的GetNetConnection()跟 Actor的GetNetConnection()行为是有所不同的。 一般的Actor如果没有特别override的话,就是以Actor的Owner递回去寻找, 直到找到PlayerController。 但是Pawn如果有controller posses的话,会以Controller的NetConnection()作依据。 如果这时候Controller没有设定Owner(或是其NetConnection没有连通)的话, 这时候RPC就会失败。 实验环境 以下纪录整个乾净的实验环境 (UE4.18) 1. 首先创造一个Class,TestPawn。TestPawn的ClassDefault的ControllerClass 指向AIController。 2. TestPawn实作一个Client通知server的RPC,然後再实作一个server广播给 其他人的RPC。如下图所示: [图1] 3. 到PlayerController或是PlayerPawn的Class实作Client请求Server在 Sever端生成TestPawn的程式,如下图所示: [图2] 4. 记得执行的时候要开启dedicated server模式,或是叫两个client起来,然後 非server的玩家按F的时候,TestPawn会被spawn,会印字串 Client notify to server,但是不会看到server receive from client 後续的字串,显示RPC是失败的。 5. 此时如果追TestPawn的GetNetConnection()会发现回传的是Null,原因是 因为Controller不是Null,但是Controller的GetNetConnection()是Null。 Engine\Source\Runtime\Engine\Private\Pawn.cpp line524 6. 而Controller的NetConnection有问题的原因源自於如果APawn如果有给 ControllerClass的话,server会执行Pawn::SpawnDefaultController(), 但是不会设定这个controller的Owner。 一个没有Owner的controller其NetConnection()自然就会回传Null。 Engine\Source\Runtime\Engine\Private\Pawn.cpp line313 解决方法 要解决这个RPC收不到的方法答案就在 Engine\Source\Runtime\Engine\Private\Pawn.cpp line318 在controller一被生成的时候就会呼叫Posses,在这里面指定正确的Owner的话, 後续Pawn的RPC就能够正常运作了。 备注 其实严格来讲这个现象不叫做server收不到RPC,经过trace code的结果, 其实对client来说RPC是有送出的,server也有收到封包,也有收到Brunch, server是在最後要转发给client的时候发现NetConnection是Null才档掉的。 也就是说这种状况其实是会产生有网路传输量的~ RPC相关程式码Trace 以下列出RPC相关的程式码位置 NetConnection line 1318 Channel->ReceivedRawBunch 走到这边代表RPC的资料有收到 DataChannel line 386 Channel->ReceivedNextBunch Channel->ReceivedSequencedBunch Channel->ReceiveBunch Channel->ProcessBunch DataReplication::ReceivedBunch line 721 bool bSuccess = ReceivedRPC DataReplication::ReceivedRPC line 843 Object->ProcessEvent 走到此行代表RPC成功,马上就会呼叫到相关的函式 一些对RPC除错的console command 开启Log的方式 在console command下 Log [Log名称] all 关闭Log的方式 在console command下 Log [Log名称] Fatal LogRepTraffic 可以利用LogRepTraffic追踪资料传输的状况 传送端: 一个RPC传送有三行的log Sent RPC: [ClassName]::[FunctionName] Sending: FOutBunch: Channel[CHID] ChSequence[SEQ] UNetConnection::SendRawBunch. ChIndex:[CHID]. PacketID:[PID] 接收端: 一个RPC接收有三行的Log Received: FInBunch: Channel[CHID] ChSequence[SEQ] PacketID:[PID] Reliable Bunch, Channel[CHID] Sequence[SEQ] Actor [ClassFullName] LogRep 在RPC传送与接收都有成功的状况,可以从LogRep知道讯息 LogRep: Verbose: Rejected unwanted function [FunctionName] in [ClassName] 看到此讯息可能代表Actor的NetConnection是Null。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.41.55
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1515069386.A.8A6.html
1F:推 coolrobin: 推推 01/04 22:42
2F:推 damody: 123 01/05 02:23
※ 编辑: yekdniw (59.120.146.90 台湾), 07/15/2020 11:08:32







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP