You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Photon中如何通过PhotonView或RPC同步图片与文本?

基于RPC的全局可见TextField与动态图片多端同步实现

TextField全局同步实现步骤

  • 所有客户端不要直接修改本地TextField的最终显示值,所有内容变更的校验、分发权限统一收归权威端(服务器/房主端,根据你的网络架构选择),从根源避免多端内容不一致
  • 给本地TextField组件绑定内容变更回调,当本地用户完成输入、触发内容更新时,仅调用客户端到权威端的定向RPC,把当前输入的最新文本上报给权威端,本地不直接修改显示值
  • 权威端收到文本上报请求后,先做合法性校验:包括长度截断、敏感词过滤、操作权限校验(比如是否只有指定玩家能修改这个输入框内容),校验通过后调用全客户端广播RPC,把最终确认的文本内容推送给所有在线玩家
  • 所有客户端收到广播的文本同步RPC时,先临时移除TextField的内容变更监听,把收到的文本赋值给组件的text属性,赋值完成后再重新绑定监听,避免赋值操作触发回调导致循环上报

核心逻辑伪代码参考:

// 客户端侧:输入内容变更回调
void OnTextFieldInput(string inputVal)
{
    // 仅上报变更请求到权威端,不直接修改本地显示
    SendRpcToAuthority("ReqUpdateGlobalTextField", inputVal);
}

// 权威端侧:处理文本更新请求
[RpcTarget(ClientToAuthority)]
void OnReceiveTextFieldUpdate(Player requester, string textVal)
{
    // 自定义校验逻辑
    if (textVal.Length > 64) textVal = textVal[..64];
    // 校验通过后全量广播
    BroadcastRpcToAll("RespSyncGlobalTextField", textVal);
}

// 客户端侧:处理全局文本同步
[RpcTarget(AuthorityToClient)]
void OnSyncTextFieldReceive(string syncedText)
{
    // 临时解绑监听避免循环
    inputField.onValueChanged.RemoveListener(OnTextFieldInput);
    inputField.text = syncedText;
    inputField.onValueChanged.AddListener(OnTextFieldInput);
}

非静态动态图片字段同步实现步骤

  • 禁止直接把整张图片的二进制数据通过单条RPC广播,图片原始体积过大会占用大量带宽,导致同步延迟、丢包甚至RPC发送失败
  • 权威端维护全局动态资源映射表,给每张运行时加载、生成、玩家上传的动态图片分配全局唯一ID,所有同步逻辑优先传资源ID而非图片本身
  • 若动态图片来自客户端上传:客户端先把图片按约定分辨率、压缩比压到目标大小,拆成大小不超过框架单包上限(多数框架默认单包安全阈值为128KB)的分片,按分片序号逐片通过RPC传给权威端;权威端收全所有分片组装成完整图片后,存入资源映射表分配全局ID
  • 权威端同步图片字段时,先通过全量RPC广播对应图片的全局ID:本地已经缓存过该ID对应图片的客户端,直接从缓存取图赋值给图片组件即可;未缓存该资源的客户端,再定向给权威端发RPC请求对应ID的图片分片,收全分片组装完成后缓存、再显示
  • 若动态图片由权威端生成,直接分配全局ID后先广播ID,再按需响应客户端的资源分片请求即可

踩坑提示:两个同步场景都必须做循环上报拦截,不然会出现「本地赋值触发上报→权威端广播回本地→本地再次赋值触发上报」的死循环,大量占用网络带宽。如果你的网络框架支持RPC来源过滤,可以直接给客户端的同步处理逻辑加判断:如果当前触发修改的来源是权威端同步,就不触发上报逻辑,比临时解绑监听更稳定。

内容的提问来源于stack exchange,提问作者Jouki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:18:32