热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

加快在Unity中获取Firebase值-SpeedupgettingFirebaseValuesinUnity

SoIhaveaPlayerandanEnemyinasceneandwhenoneplayermoves,itupdatestheFirebasewithi

So I have a Player and an Enemy in a scene and when one player moves, it updates the Firebase with its position perfectly, fast and exact. But when updating the enemy for the other player, it takes a long time.
Code for Enemy Updater:

所以我在一个场景中有一个玩家和一个敌人,当一个玩家移动时,它会以完美,快速和准确的位置更新Firebase。但是当为其他玩家更新敌人时,需要很长时间。敌人更新代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;

public class enemyUpdater : MonoBehaviour {

private DatabaseReference dataBase;
private bool gameStarted = false;
private float Z;
private float X;

// Use this for initialization
void Start () {
    // Set up the Editor before calling into the realtime database.
    FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("Not Showing This");

    // Get the root reference location of the database.
    dataBase = FirebaseDatabase.DefaultInstance.RootReference;
    setup();
}

// Update is called once per frame
void FixedUpdate () {
    this.gameObject.transform.position = new Vector3(X, this.gameObject.transform.position.y, Z);
}

void HandleU1XChanged(object sender, ValueChangedEventArgs args)
{
    if (args.DatabaseError != null)
    {
        Debug.LogError(args.DatabaseError.Message);
        return;
    }
    string tmp = args.Snapshot.Value.ToString();
    float.TryParse(tmp, out X);
}

void HandleU1ZChanged(object sender, ValueChangedEventArgs args)
{
    if (args.DatabaseError != null)
    {
        Debug.LogError(args.DatabaseError.Message);
        return;
    }
    string tmp = args.Snapshot.Value.ToString();
    float.TryParse(tmp, out Z);
}

void HandleU2XChanged(object sender, ValueChangedEventArgs args)
{
    if (args.DatabaseError != null)
    {
        Debug.LogError(args.DatabaseError.Message);
        return;
    }
    string tmp = args.Snapshot.Value.ToString();
    float.TryParse(tmp, out X);
}

void HandleU2ZChanged(object sender, ValueChangedEventArgs args)
{
    if (args.DatabaseError != null)
    {
        Debug.LogError(args.DatabaseError.Message);
        return;
    }
    string tmp = args.Snapshot.Value.ToString();
    float.TryParse(tmp, out Z);
}

void setup()
{
    if (multiSetup.isUserOne)
    {
        this.gameObject.transform.position = new Vector3(7.5f, this.gameObject.transform.position.y, -7.5f);
        FirebaseDatabase.DefaultInstance
            .GetReference("matches").Child("rooms").Child("room"+multiSetup.roomNum).Child("user2").Child("Xaxis")
            .ValueChanged += HandleU1XChanged;
        FirebaseDatabase.DefaultInstance
            .GetReference("matches").Child("rooms").Child("room" + multiSetup.roomNum).Child("user2").Child("Zaxis")
            .ValueChanged += HandleU1ZChanged;
    }
    else if (!multiSetup.isUserOne)
    {
        this.gameObject.transform.position = new Vector3(-7.5f, this.gameObject.transform.position.y, 7.5f);
        FirebaseDatabase.DefaultInstance
            .GetReference("matches").Child("rooms").Child("room" + multiSetup.roomNum).Child("user1").Child("Xaxis")
            .ValueChanged += HandleU1XChanged;
        FirebaseDatabase.DefaultInstance
            .GetReference("matches").Child("rooms").Child("room" + multiSetup.roomNum).Child("user1").Child("Zaxis")
            .ValueChanged += HandleU1ZChanged;
    }
}
}

Here's a GIF of it in Action
As well as the delayed updating https://drive.google.com/open?id=1tv4BCfVsV6AIjEiKE1Umj4FfIyy-AG-R

以下是行动中的GIF以及延迟更新https://drive.google.com/open?id=1tv4BCfVsV6AIjEiKE1Umj4FfIyy-AG-R

1 个解决方案

#1


0  

The reason the local client updates immediately is because the Firebase client fires the events for local write operations straight away.

本地客户端立即更新的原因是Firebase客户端立即触发本地写入操作的事件。

The time for the change to make it from one player to the other is a combination of their respective latencies to the Firebase servers and the bandwidth required to send and receive the change. There is no magic "make it faster" setting or code to reduce that time, it's simply the reality of sending data via a cloud service.

将其从一个播放器更改为另一个播放器的时间是它们各自与Firebase服务器的延迟以及发送和接收更改所需的带宽的组合。没有神奇的“让它更快”设置或代码来缩短那个时间,它只是通过云服务发送数据的现实。

The trick the Firebase client does locally is one way to hide the reality of the network. Various games deal with this reality in various ways. Some predict the enemy's future behavior based on what they've recently done, some show the enemy's past behavior as a ghost, some incorporate the delay into their gameplay mechanics, etc.

Firebase客户端在本地执行的操作是隐藏网络现实的一种方法。各种游戏以各种方式处理这一现实。一些人根据他们最近所做的事情来预测敌人的未来行为,一些人将敌人过去的行为表现为鬼魂,一些人将延迟纳入他们的游戏机制等等。


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
author-avatar
zhuzhu-2012_389
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有