gpt4 book ai didi

c# - Firebase 使任务仅在主线程上执行,导致 Unity 卡住

转载 作者:行者123 更新时间:2023-11-30 23:16:32 35 4
gpt4 key购买 nike

Firebase 1.1.0Unity SDK 有问题。

一旦我通过 FirebaseApp.DefaultInstance.SetEditorDatabaseUrl( myurl ) 激活 firebase,所有 Tasks 不是由 firebase 生成线。因此,我可以很好地检索数据并将其发布到 firebase,甚至可以在任务中对其进行处理。它们在单独的线程上运行,这是我在调试时看到的。但是,当我将在某些 MonoBehaviour 的 Start 方法中使用 Task.Run( MyComputingFunction ) 时,Unity 挂起。假设此函数只是从 0 计数到 999999,因此它不是锁定 问题。对于计算时间 Unity 卡住,因为任务是在主线程上执行的。如果我将注释掉 firebase 激活,我的任务 将在单独的线程 中运行,并且不会卡住 Unity

请帮忙。

这是一个最小的工作示例。将其附加到游戏对象并观察并行运行的任务。取消注释指向的行,任务将按线性顺序执行。

using UnityEngine;
using System;
using System.Threading.Tasks;
using Firebase.Unity.Editor;
using Firebase.Database;

public class NetworkController : MonoBehaviour
{
public static DatabaseReference @ref;

void Start()
{
// Uncomment line below
//InitializeDatabase();
TestStuff();
}

private void TestStuff()
{
Task.Run( Counter(1) );
Task.Run( Counter(2) );
Task.Run( Counter(3) );
}

private Action Counter( int i )
{
return delegate {
int a = 0;
while ( a + 10 < 900000 ) {
a++;
if ( a % 5000 == 0 )
Debug.Log( a + i);
}
};
}

private void InitializeDatabase()
{
Firebase.FirebaseApp.DefaultInstance.SetEditorDatabaseUrl( "https://dinosaur-facts.firebaseio.com/" );

@ref = FirebaseDatabase.DefaultInstance.RootReference;
}
}

最佳答案

我是一名 Firebase 工程师,刚刚看过您的帖子。很抱歉你撞到了这个。

这是我们依赖的 UnityTask 库中的一个错误。发生的事情是任务库误用 SynchronizationContext.Current(设置时)作为启动任务的工具。 Task.Run 应该始终使用线程池而不是 SynchronizationContext.Current。 SynchronizationContext.Current 旨在用于编码来自其他线程的调用。

我会研究在我们这边解决这个问题。我确实有一个解决方法供您同时使用。

TaskFactory factory = new TaskFactory(new TaskScheduler(null)); //null = threadpool.
factory.StartNew(() => myFunction());

关于c# - Firebase 使任务仅在主线程上执行,导致 Unity 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959490/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com