2010-09-06 1 views
0

Я работаю над симусом игры и хочу ускорить бит симуляции матча. В заданную дату могут быть более 50 совпадений, которые нужно имитировать. В настоящее время я прохожу через каждого и говорю им, чтобы имитировать себя, но это может продолжаться вечно. Я надеялся, чтоNSThreading for speed

1) Наложить на «занято» экран

2) Запуск потока для каждого

3) Когда последний поток завершает работу, снимите накладку.

Теперь я могу сделать 1 & 2, но я не могу понять, как сказать, когда последний поток закончен, потому что последний поток, который я отсоединяю, может быть не последним завершенным потоком. Каков наилучший способ сделать это?

Кроме того, обычно используются потоки, так что работа может выполняться в фоновом режиме, в то время как пользователь делает другие вещи, я использую его немного иначе. Мое приложение - это приложение с основными данными, и я хочу, чтобы пользователь не прикасался к магазину другими способами, пока я имитирую матчи. Поэтому я хочу использовать однопоточность большую часть времени, но затем многопоточность для этой ситуации из-за того, как долго движется Sim. Если у кого-то есть другие идеи для этого подхода, я открыт.

Роб

ответ

2

Вероятно, вы хотите используйте NSOperation и НЕ 50 потоков - 50 нитей не являются здоровыми на iPhone, а NSOperations легче загружать. Возможно, вы убиваете производительность (это было бы мое предположение), пытаясь запустить 50 одновременно. NSOperation предназначен именно для этой проблемы. Плюс его легко кодировать.

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

Вы можете периодически опросить NSOperationQueue - когда его счет равен 0, его не осталось. Вы также можете сделать каждую операцию приращением некоторого счетчика - когда счетчик равен 50, вы сделали. Или каждая операция может публиковать уведомление, используя performSelectorOnMainThread в основном потоке, который он выполнил.

Вы должны увидеть повышение производительности даже с одним ядром - есть много раз, когда основной поток блокируется, ожидая ввода/рисования пользователя и т. Д. Плюс многоядерные телефоны и iPads, скорее всего, выйдут в течение года (общая догадка - но они идут).

Также убедитесь, что вы смотрите на операцию с помощью инструментов. Возможно, вы можете ускорить расчеты в 2 или даже 10 раз!

+1

Вы можете использовать KVO для наблюдения за 'operationCount' рабочей очереди; не требуется опрос. Просто обратите внимание, что операция не будет работать в основном потоке, поэтому вы, вероятно, захотите сделать основной поток, выполняемый с вашего метода наблюдателя, на ваш фактический экстракт-new-operation-count-from-the-change- метод словаря и проверки. –

+0

Вы также можете наблюдать свойство isFinished каждого NSOperation – sbooth

+0

Или вы можете использовать оповещения, чтобы основной поток знал о завершении. –

1

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

Первое, что нужно сделать, это использовать инструменты для профайла вашего кода и посмотреть, что можно ускорить. Как только вы это сделаете, вы можете посмотреть на некоторые конкретные оптимизации для шеи бутылки.

Один простой подход (если вы можете использовать GCD) - это dispatch_apply(), который позволит вам контактировать с вашими совпадениями, автоматически направить их наилучшим образом для вашего оборудования и не вернется, пока все не будет завершено.

+0

Спасибо, хорошо, позвольте мне попробовать. – rob5408

+0

Threading может помочь, если обработка связана с IO – vodkhang

0

Наиболее простым решением было бы обеспечить выполнение всех ваших потоковSelectorOnMainThread для конкретного метода, который уменьшает счетчик перед его выходом. И пусть метод удаляет экран наложения, когда счетчик, который он уменьшает, достигает нуля.

Имитация всех совпадений одновременно не всегда может улучшить производительность.

+0

Спасибо, позвольте мне сделать это. – rob5408

0

Вы можете получить решение для вашего конкретного вопроса из @drowntoge, но в целом, я хочу дать вам совет о многопоточности:

1/Это не всегда ускорить вашу программу, как сказал Грэм. У вашего iPhone только одно ядро.

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

Возможно, вам нужна только 1 нить для обработки ввода-вывода, а затем есть уровень кэша для обмена изображениями/данными.Затем, вам нужно только основной поток в цикле и сделать Simulation

3/Если вы хотите 50 моделирования, кажется, происходит в то же время для пользователя, чтобы посмотреть, многопоточность также требуется :)

0

Если вы используете потоки, вы не будете знать, в каком порядке процессор выполняет ваши задачи, и вы потенциально можете потреблять много ресурсов планирования потоков. Лучше использовать NSOperationQueue и завершение сигнала каждой задачи, используя performSelectorOnMainThread. Декремент счетчика уже упоминался, что может быть полезно для отображения индикатора выполнения. Но вы также можете поддерживать массив из 50 флагов занятости и очищать их по завершении, что может помочь отладить, будет ли какая-либо конкретная задача медленной или застревающей, если вы отметите завершение отметкой времени.

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

  • Нет связанных вопросов^_^