NSThreading для скорости - PullRequest
       6

NSThreading для скорости

0 голосов
/ 06 сентября 2010

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

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

2) Запустить тему для каждого

3) Когда выйдет последняя нить, удалите наложение.

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

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

Rob

Ответы [ 5 ]

2 голосов
/ 06 сентября 2010

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

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

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

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

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

1 голос
/ 06 сентября 2010

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

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

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

0 голосов
/ 06 сентября 2010

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

0 голосов
/ 06 сентября 2010

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

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

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

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

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

0 голосов
/ 06 сентября 2010

Наиболее простым решением было бы сделать так, чтобы все ваши потоки «executeSelectorOnMainThread» обращались к определенному методу, который уменьшает счетчик, до того, как они завершатся. И пусть метод удалит оверлейный экран, когда уменьшенный счетчик достигнет нуля.

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

...