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;
}
}
答案 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,因为报告了更多的改进,并且已经使用线程和任务进行了修复。