Firebase使任务仅在主线程上执行,导致Unity冻结

时间:2017-01-31 14:02:07

标签: c# multithreading unity3d firebase task

Unity SDK firebase 1.1.0 存在问题。

一旦我FirebaseApp.DefaultInstance.SetEditorDatabaseUrl( myurl )激活firebase,所有 firebase 生成的任务都会在主线程上执行。 因此,我可以检索并将数据发布到 firebase ,甚至可以在任务中处理它。它们运行在单独的线程上,我在调试时会看到它。但是,当我在某些MonoBehaviour的Task.Run( MyComputingFunction )方法中使用Start时, 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;
    }
}

2 个答案:

答案 0 :(得分:2)

我是一名火力工程师,刚看了你的帖子。我很抱歉你打了这个。

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

我会调查这个问题。我确实有一个解决方法供您在此期间使用。

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

答案 1 :(得分:0)

(我是来自firebase C ++ / Unity团队的工程师。)

我相信我们在过去的版本中解决了这个问题。 https://firebase.google.com/support/release-notes/unity#4.0.3

最近我们刚刚发布了4.3.0,因为报告了更多的改进,并且已经使用线程和任务进行了修复。