MLAPI中Rpc(SendTo.NotMe)在主机上执行两次的问题分析
2025-07-03 15:42:12作者:魏侃纯Zoe
问题现象
在MLAPI网络框架1.8.0版本中,当非主机客户端执行目标设置为NotMe的RPC调用时,主机端会意外地执行该RPC两次。这是一个典型的主机模式下的网络通信异常问题。
技术背景
在MLAPI框架中,RPC(远程过程调用)是网络游戏开发中常用的通信机制。SendTo.NotMe参数表示该RPC将发送给除调用者之外的所有连接客户端。在主机模式下,一个实例同时扮演服务器和客户端的角色,这种双重身份导致了问题的发生。
问题根源
通过分析源代码,发现问题出在NotMeRpcTarget.cs文件中。当发送RPC时,代码会执行以下逻辑:
- 首先向目标组发送RPC
- 如果当前不是服务器,则额外向服务器发送RPC
在主机模式下,由于实例既是服务器又是客户端,导致RPC被发送两次:一次作为客户端接收,另一次作为服务器接收。
解决方案
修复方案是在发送给服务器的条件中增加对主机模式的判断:
m_GroupSendTarget.Target.Send(behaviour, ref message, delivery, rpcParams);
if (!behaviour.IsServer && !m_NetworkManager.ServerIsHost)
{
m_ServerRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
}
这样修改后,当实例是主机时,将不会重复发送RPC到服务器端,从而避免了重复执行的问题。
影响范围
该问题主要影响:
- 使用主机模式进行开发的游戏
- 使用SendTo.NotMe参数的RPC调用
- MLAPI 1.8.0版本
最佳实践建议
对于网络游戏开发,在处理主机模式下的RPC调用时,建议:
- 明确区分服务器和客户端逻辑
- 对于主机模式要特别注意双重身份带来的潜在问题
- 在RPC实现中加入日志记录,便于调试
- 考虑使用更明确的RPC目标指定方式,如指定具体客户端ID
总结
这个问题展示了在网络游戏开发中,主机模式下的特殊行为需要特别注意。MLAPI框架通过增加主机模式的判断,有效地解决了RPC重复执行的问题,为开发者提供了更可靠的网络通信基础。
登录后查看全文
热门项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0231
GLM-5.2智谱开源 GLM-5.2,这是针对长文本任务的最新旗舰模型。相较于前代产品 GLM-5.1,它在长文本任务处理能力上实现了显著飞跃,并且首次在稳定的 100 万 token 上下文中提供这一能力。Jinja00
JoyAI-VL-Interaction-Preview京东开源首个开源、视觉驱动的实时交互模型——它能实时监控视频流,并自主决定何时发言、保持沉默或委托任务。Jinja00
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0151
kornia🐍 空间人工智能的几何计算机视觉库Python02
PaddleParallel Distributed Deep Learning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)C++02
项目优选
收起
暂无描述
Dockerfile
782
5.11 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
892
2.06 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
471
473
Ascend Extension for PyTorch
Python
764
972
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
710
1.43 K
deepin linux kernel
C
32
16
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
432
151
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.11 K
1.15 K
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
2.27 K
681
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.04 K
272