2016-06-11 5 views
0

У меня есть огромное огромное понимание - как вычислить что-то тяжелое в отдельной теме, получить результат и «продолжить основную процедуру». Я разрабатываю настольную игру, а задачи «проверки платы» и «мышления AI» сильно усваивают процессор, поэтому я пытаюсь отделить вычисления от другого потока.Есть ли способ использовать потоки с Unity3d?

Я не .NET программист, в основном C++, я много читал о сопрограммах и потоках в c sharp и unity3d за последние 4 дня, но теперь я просто получил полный беспорядок в своей голове, полностью потеряв любой вид " что делать".

Я нашел, что единство все еще использует .NET2, поэтому нельзя использовать TPL или TPLv3. Я искал библиотеку Foundation Tasks (https://github.com/NVentimiglia/Unity3d-Foundation/wiki/4)-Unity-Tasks), но не знаю, как использовать ее для моего дела. Я смотрю на примеры и чувствую себя идиотом. Я пытался написать смесь нитей и сопрограммы самостоятельно, но теперь просто получил полный код беспорядочно без каких-либо результатов работы = (

Может ли кто-нибудь дать мой простой пример моего случая: когда объекты единицы имеют некоторые вычисления в другой поток, получая результат из его работы и продолжает «нормальное поведение».

+0

В Unity3D абсолютно нет нитей. Эта информация широко доступна по миллионам QA. (Вы упоминаете «сопрограммы» - они никоим образом не связаны нитями. Coroutines относятся к ожиданию следующего графического фрейма и не имеют никакого отношения к обработке.) – Fattie

+0

Во-вторых, обратите внимание, что это немыслимо, вам понадобится " отдельный процессор ", чтобы сделать« AI »для настольной игры. Это не в реальности, это было бы в 10 000 раз. – Fattie

+0

В-третьих, вам нужно только google https://www.google.com/search?q=asset+store+threading, чтобы мгновенно найти пакеты потоковой передачи для Unity. Если (невероятно) вам нужно делать математические вычисления или тому подобное, это ваш ответ. (Невозможно представить, что вы напишете свою собственную систему потоков с нуля - не больше, чем писать рендер или физику с нуля!) – Fattie

ответ

0

Я нашел решение, смешанные нитей и сопрограмм.

Я не очень нравится программирование темы типа в C#, Потому что получить обратно привести его непонятно понятно - код не очень приятный.

So , это мое решение, используя 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)

Смежные вопросы