有什么方法或需要在 Unity3d 中使用线程吗?
Is there any way or need to use threads with Unity3d?
我有一种巨大的误解 - 如何在单独的线程中计算一些繁重的东西,得到结果,然后 "continue main routine"。
我正在开发棋盘游戏,"board checking" 和 "AI thinking" 的任务需要 cpu 困难,所以我试图将计算分开到另一个线程。
我不是 .NET 程序员,主要是 c++,在过去的 4 天里,我在 c sharp 和 unity3d 中阅读了很多关于协程和线程的内容,但现在我脑子里一片混乱,完全失去了任何一种"what to do".
我发现,unity 仍然使用 .NET2,所以不能使用 TPL 或 TPLv3。
我一直在寻找 Foundation Tasks 库 ( https://github.com/NVentimiglia/Unity3d-Foundation/wiki/4)-Unity-Tasks ),但无法理解如何在我的案例中使用它。
我正在看例子,觉得自己很白痴。
我试图自己编写线程和协程的混合,但现在只是把完整的代码弄乱了,没有任何工作结果 =(
任何人都可以举出我的案例的任何简单示例吗:当统一对象在其他线程中进行某些计算时,获取其工作结果并继续 "normal behaviour"。
我找到了混合线程和协程的解决方案。
我不太喜欢 C# 中的线程风格编程,因为返回的结果不是很清楚-代码不是很好。
所以,这是我的解决方案,使用 Foundation.Tasks
想象一下,例如,我们有一些 MonoBehaviour 子项 class,正在执行一些繁重的计算。
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
}
}
}
代码,使用 Foundation 的 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 让我可以轻松地选择策略(协程、后台线程),而且我得到的计算结果没有任何问题,而且我的代码很好且易于理解(恕我直言)
我有一种巨大的误解 - 如何在单独的线程中计算一些繁重的东西,得到结果,然后 "continue main routine"。 我正在开发棋盘游戏,"board checking" 和 "AI thinking" 的任务需要 cpu 困难,所以我试图将计算分开到另一个线程。
我不是 .NET 程序员,主要是 c++,在过去的 4 天里,我在 c sharp 和 unity3d 中阅读了很多关于协程和线程的内容,但现在我脑子里一片混乱,完全失去了任何一种"what to do".
我发现,unity 仍然使用 .NET2,所以不能使用 TPL 或 TPLv3。 我一直在寻找 Foundation Tasks 库 ( https://github.com/NVentimiglia/Unity3d-Foundation/wiki/4)-Unity-Tasks ),但无法理解如何在我的案例中使用它。 我正在看例子,觉得自己很白痴。 我试图自己编写线程和协程的混合,但现在只是把完整的代码弄乱了,没有任何工作结果 =(
任何人都可以举出我的案例的任何简单示例吗:当统一对象在其他线程中进行某些计算时,获取其工作结果并继续 "normal behaviour"。
我找到了混合线程和协程的解决方案。
我不太喜欢 C# 中的线程风格编程,因为返回的结果不是很清楚-代码不是很好。
所以,这是我的解决方案,使用 Foundation.Tasks
想象一下,例如,我们有一些 MonoBehaviour 子项 class,正在执行一些繁重的计算。
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
}
}
}
代码,使用 Foundation 的 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 让我可以轻松地选择策略(协程、后台线程),而且我得到的计算结果没有任何问题,而且我的代码很好且易于理解(恕我直言)