unity3d Firebase实时数据库高下载使用率

rkue9o1l  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(114)

我们正在使用Firebase实时数据库来保存与Facebook连接的用户的每一级分数。我们仍在测试这个功能,一切正常,但下载使用率真的真的很高。每次用户打开应用程序,我下载的数据量很小,大约20字节。和additional5字节的每一级,他开始.几分钟后,下载使用量开始显示超过100kB,这是一个很大的,不会规模的财政,当我们realease这对我们的用户.下面是我们使用的数据结构:

users{
  facebook_id{
    "firebase_id" : firebaseId,
    "max_level" : maxLevel,
    "stars" : numberOfStars,
    "scores" : {
      level : score,
    }
  }
}

我还做了一些CLI数据库分析,没有索引查询,用法似乎是正确的。

这是屏幕截图。
有人知道可能出了什么问题吗?如果这只是SSL开销(看起来仍然太大),除了设置我们自己的服务器,我们没有别的办法。

mf98qq94

mf98qq941#

方法1:将冗长的数据存储在单独的位置

  • 如果这是数据结构
  • 每当用户选中他的maxlevel时,就会调用每个级别的底层scores。
  • 通过在单独的路径中拆分求和结果来避免这种情况

糟糕的方式

users{
  facebook_id{
    "firebase_id" : firebaseId,
    "max_level" : maxLevel,
    "stars" : numberOfStars,
    "scores" : {
      level : score,
    }
  }
}

更好的方式-分为用户详细信息和用户分数详细信息

用户详细信息

Contains only max level and number of stars
users{
  facebook_id{
    "firebase_id" : firebaseId,
    "max_level" : maxLevel,
    "stars" : numberOfStars
  }
}

用户分数详细信息

  • 在单独的路径中包含级别分数
  • 客户端可以检查users_scores/facebook_id/scores/<levelname>是否存在?如果存在,则获取分数
users_scores{
  facebook_id{
    "scores" : {
      level1 : score1
    },
    {
      level2 : score2
    }
  }
}
  • 使用云函数计算恒星总数或
  • 不推荐:通过从users路径读取stars(不经过users_scores)来计算client部分中的星总数。只需从client本身更新路径users_scores/facebook_id/scores/<levelname>

要点

  • 不是在每个取请求中读取所有的星
  • 获取最后更新的星星,并更新新星星。
  • 通过只访问一个路径来更新特定级别的星
  • 这将是第一次空,并将包含值,如果他已经完成了水平。
gzszwxb4

gzszwxb42#

在非关系数据库中,将数据集中在一个地方始终是个坏主意。而且它本身也会产生致命的影响,从最大化文档大小到高带宽,这可能会导致高成本和低性能,您需要划分为更扁平的结构,这样做可能会节省读取,但这种节省在生产中不会带来回报,换句话说,你没有给用户提供全部信息(加载)一次,相反,你给予他什么,他需要开始,并根据他的需要,后来他从数据库中得到...这是一种被动的方法...而不是太积极,给他每一个整个九码一次,这样想吧,你一开口就会得到你想要的......

up9lanfz

up9lanfz3#

您从JSON文件中检索到的数据可能比您预期的要多得多。Google已经为如何最好地构建数据制定了一些指导方针,以便您只影响尽可能少的信息。
避免使用过多的索引。过多的索引会增加写入延迟,并增加索引项的存储成本
请注意,具有单调递增值的索引字段(如时间戳)可能会导致热点,从而影响具有高读写速率的应用程序的延迟。
https://firebase.google.com/docs/firestore/best-practices#indexes
索引下面的这一部分也可能有所帮助:
避免每秒多次写入文档。有关详细信息,请参阅更新单个文档。
对写入和删除操作使用批处理操作,而不是单个操作。批处理操作效率更高,因为它们执行多个操作,而开销与单个操作相同。
如果可用,请使用异步调用,而不要使用同步调用。异步调用可最大限度地降低延迟影响。例如,假设某个应用程序在呈现响应之前需要文档查找结果和查询结果。如果查找和查询没有数据相关性,则在启动查询之前无需同步等待查找完成。
不要使用偏移量,而应使用游标。使用偏移量只能避免将跳过的文档返回到应用程序,但仍会在内部检索这些文档。跳过的文档会影响查询的等待时间,并且应用程序会为检索这些文档所需的读取操作付费。
https://firebase.google.com/docs/firestore/best-practices#read_and_write_operations
希望这对你有帮助!

相关问题