Полностью параллельный процесс

Программирование на Юнити.

Полностью параллельный процесс

Сообщение Altodor 25 май 2011, 21:15

У меня RTS, в ней выбранные юниты по определённой команде начинают вычисление небольшой задачки. Но эту небольшую задачку они решают где-то 0.25 сек. На это время игра подвисает. Эта задача реализована в виде простой функции, возвращающей ArrayList. Как её запустить отдельным процессом? Чтобы подвисла не вся игра, а только тот юнит, которому дали команду? Смотрел StartCoroutine, но не понял никакого смысла в yield... Если эта проблема решается с помощью StartCoroutine, прокомментируйте пожалуйста, как это сделать.. Проблема ещё в том, что эта функция обязательно должна возвратить юниту результат своей работы, а StartCoroutine просто запускается, без возвращения чего-либо.
Altodor
UNIт
 
Сообщения: 82
Зарегистрирован: 19 сен 2010, 07:58

Re: Полностью параллельный процесс

Сообщение DbIMok 25 май 2011, 22:02

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {

    private ArrayList _arrList; // для передачи результата

    void Start()
    {
        StartCoroutine(MyCalc()); // запускаем корутину
    }

    IEnumerator MyCalc()
    {
        for (...)
        {
            _arrList.Add(...)
            yield return 0;  // в этом месте непрерывность выполнения прерывается
        }
        WorkFinished();  // вызвать действие над результатом работы
    }

    void WorkFinished()
    {
        _arrList...
    }
}
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Полностью параллельный процесс

Сообщение burlak 26 май 2011, 02:05

Вроде про Корутины написано, что они не кушают потоки - т.е. выполняются в основном процессе. С другой стороны тред нужен в основном, чтобы распараллелить работу. Если же юнит будет ожидать от треда результат, зачем нужен тред?

Возможно стоит разделить код на исполнение задачи и постановку задачи. Тред, например регулярно обновляет какие то данные для юнита, а юнит выполняет то, что на текущий момент записано в его данных. В данном случае юнит не ждет а вычисление реально запихать в System.Threading.Thread

Может быть если каждый юнит будет решать задачу в свое время - не все вместе, вразнобой, то игрушка не будет подвисать столь ощутимо.
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: Полностью параллельный процесс

Сообщение zoon 26 май 2011, 11:04

Вы можете делать вычисления в отдельном потоке средствами C# и фреймворка. Советую почитать гениальный e-book http://www.albahari.com/threading/

Можно взять готовую обертку, типа Task из C# 4. Но поскольку в Unity фреймворк только 3.5, можно использовать упрощенный аналог отсюда: http://msdn.microsoft.com/en-us/magazine/cc163552.aspx

Синтаксис:
Используется csharp
public class Future<T> : IDisposable
{

    // Fields
    private readonly Func<T> _func;
    private Exception _except;
    private T _value;
    private ManualResetEvent _mre;

    // Constructors
    public Future(Func<T> func)
    {
        _func = func;
        ThreadPool.QueueUserWorkItem(Worker);
    }

    // Properties
    public bool IsDone { get; private set; }

    public T Value
    {
        get
        {
            // If the future isn't completed, we wait.
            if (!IsDone)
            {
                _mre = new ManualResetEvent(false);
                Thread.MemoryBarrier();
                if (IsDone)
                {
                    _mre.Close();
                    _mre = null;
                }
                else
                {
                    _mre.WaitOne();
                }
            }

            // If an exception was thrown by the future, repropagate it.
            if (_except != null)
            {
                throw _except;
            }

            return _value;
        }
    }

    // Methods
    public void Dispose()
    {
        if (_mre != null)
        {
            _mre.Close();
            _mre = null;
        }
    }

    private void Worker(object obj)
    {
        try
        {
            _value = _func();
        }
        catch (Exception e)
        {
            // Capture the exception. It will be propagated when the consumer
            // rendezvous with the future.
            _except = e;
        }
        finally
        {
            IsDone = true;
            Thread.MemoryBarrier();
            if (_mre != null)
            {
                _mre.Set();
            }
        }
    }

}
 


PS. Rx Reactive не советую, а то опять Neodrop будет заставлять писать тьюториал :D
Джаггер
Evo
Аватара пользователя
zoon
UNIт
 
Сообщения: 58
Зарегистрирован: 24 май 2010, 08:27

Re: Полностью параллельный процесс

Сообщение Neodrop 26 май 2011, 11:25

Посмотрите на асинхронные делегаты, чтобы не городить воркеров на 100500 строк.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Полностью параллельный процесс

Сообщение zoon 26 май 2011, 13:50

Neodrop писал(а):Посмотрите на асинхронные делегаты, чтобы не городить воркеров на 100500 строк.


Асинхронные делегаты медленные и слишком низкоуровневые и кудрявые для использования напрямую. Фьючерсы (код которого я привел) или Таски во всех отношениях лучше и удобнее.
Джаггер
Evo
Аватара пользователя
zoon
UNIт
 
Сообщения: 58
Зарегистрирован: 24 май 2010, 08:27

Re: Полностью параллельный процесс

Сообщение romeo_ftv 26 май 2011, 14:28

romeo_ftv
UNIт
 
Сообщения: 88
Зарегистрирован: 12 апр 2009, 12:33

Re: Полностью параллельный процесс

Сообщение gnoblin 26 май 2011, 14:49

Еще потенциально интересная штука вот http://code.google.com/p/retlang/
Я не пользовался :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Полностью параллельный процесс

Сообщение raul82 27 янв 2012, 09:39

интересно а треды роботают в ios android?
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9