2016-09-02 8 views
1

Я внедрил System.Collections.Queue в своей игре, чтобы собрать все входящие TCP-сообщения.Как обрабатывать очередь в Unity3D?

На данный момент я просто обработать старое сообщение в Queue в Update() (если очередь не пуста)

Однако время между двумя кадрами часто путь дольше, что время, необходимое для обработки сообщения.

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

Я пробовал с сопрограммами, но ничего не изменил с тех пор, как yield return null;, похоже, ждет следующего кадра (так что это похоже на Update()).

+0

без размещения вашего TCP сотрудничества Это было бы трудно сказать, что вы делаете неправильно. – Programmer

+0

Сообщения - это просто информация, которая может появиться в любое время. Иногда это может быть более сотни сообщений за одну секунду, а Unity нужно обрабатывать их один за другим. Но я не могу позволить себе ждать 1/60s между каждым –

+0

Используйте какой-то поток для обработки сообщений в фоновом режиме или используйте методы async, предоставляемые классом TCP, вместо их очереди. – null

ответ

2

Вы можете реализовать CustomYieldInstruction ждать, пока ваше сообщение приходит:

class WaitWhileMessageArrives: CustomYieldInstruction 
{ 
    Func<bool> m_Predicate; 

    public override bool keepWaiting { get { return m_Predicate(); } } 

    public WaitWhileMessageArrives(Func<bool> predicate) { m_Predicate = predicate; } 
} 

использовать его как это:

(Примечание: этот код только один пример, чтобы дать основную идею, как вы убежище» т при условии коды)

IEnumerator ProcessMessages() 
{ 
    while(yourQueue.Count != 0) 
    { 
     Message msg = yourQueue.Dequeue(); 
     yield return new WaitWhileMessageArrives(() => msg.processed); 
    } 
} 

Надеется, что это помогает