我找到了解决方案,混合线程和协同程序。
我真的不喜欢在C#中的线程编程风格的辩论,因为找回导致它不明白可以理解 - 代码不好看。
所以,这是我的解决方案,使用Foundation.Tasks
想象一下,例如,我们有一些MonoBehaviour子类,做了一些繁重的计算。
代码之前UnityTasks
public class ExampleClass : MonoBehaviour {
public bool MyHeavyCalculator(bool exampleArg)
{
//loong and heavy calculations
}
public void SomeFunc()
{
//and here we get freezing
if (MyHeavyCalculator(boolArg))
{
//unfreeze here
}
}
}
代码,使用UnityTask从基金会
//in my case, heavy calculations are static in another class
public static class Calculator
{
public static bool DoHeavy(bool exampleArg)
{
//loong and heavy calculations
}
}
public class ExampleClass : MonoBehaviour {
IEnumerator coroutineSomeFunc()
{
bool result = false;
//code to show "thinkng sign"
UnityTask t = UnityTask.Run(() => {
//and no freesing now
result = Calculator.DoHeavy(myArg);
});
yeild return t;
//code to hide "thinkng sign"
if (result)
{
//continue game flow
}
}
public void SomeFunc()
{
StartCoroutine(coroutineSomeFunc());
}
}
此外,Foundation.Tasks让我选择策略(协程,后台线程)easyly,也是我得到的结果的计算没有任何问题,我的代码很好,很容易理解(imho)
在Unity3D中绝对没有线程,无论如何。这些信息广泛用于数百万的质量保证。 (你提到的是“协同程序” - 它们完全没有连接,不管怎样,它们都与线程无关,协程与等待下一个图形框架有关,并且与处理无关)。 – Fattie
10其次,注意到这是不可思议的,单独的CPU“来完成棋盘游戏的”AI“。它不在现实的范围内,它会超出10,000倍。 – Fattie
第三,您只需要google“https://www.google.com/search?q=asset+store+threading”即可找到Unity的线程包。如果(令人难以置信的)你需要做数学计算或类似的事情,那就是你的答案。 (这是不可思议的,你会从头开始编写自己的线程系统 - 不过你会从头开始编写渲染器或物理!) – Fattie