2016-06-11 28 views
0

我有一种巨大的小姐理解 - 如何计算在单独的线程中沉重的东西,获得结果和“继续主程序”。 我正在开发棋盘游戏,“棋盘检查”和“AI思维”的任务很难完成,所以我试图将计算分开到另一个线程。我不是.NET程序员,主要是C++,我在过去的4天里读了很多关于c sharp和unity3d的协程和线程,但是现在我只是在脑海里充满了混乱,完全失去了任何一种“该怎么办”。是否有任何方式或需要使用Unity3d的线程?

我发现,该统一仍然使用.NET2,所以没有TPL或TPLv3可以使用。 我正在寻找基金会任务库(https://github.com/NVentimiglia/Unity3d-Foundation/wiki/4)-Unity-Tasks),但不知道如何将它用于我的案例。 我在看例子,感觉自己是白痴。我试图写自己的线程和协程的组合,但现在只是得到完整的代码凌乱没有任何工作的结果=(

任何人都可以给我的任何简单的例子我的情况:当统一对象做一些有计算其他线程,它得到结果的工作,并继续“正常行为”。

+0

在Unity3D中绝对没有线程,无论如何。这些信息广泛用于数百万的质量保证。 (你提到的是“协同程序” - 它们完全没有连接,不管怎样,它们都与线程无关,协程与等待下一个图形框架有关,并且与处理无关)。 – Fattie

+0

10其次,注意到这是不可思议的,单独的CPU“来完成棋盘游戏的”AI“。它不在现实的范围内,它会超出10,000倍。 – Fattie

+0

第三,您只需要google“https://www.google.com/search?q=asset+store+threading”即可找到Unity的线程包。如果(令人难以置信的)你需要做数学计算或类似的事情,那就是你的答案。 (这是不可思议的,你会从头开始编写自己的线程系统 - 不过你会从头开始编写渲染器或物理!) – Fattie

回答

0

我找到了解决方案,混合线程和协同程序。

我真的不喜欢在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)

相关问题