НОД вместо геймлупа?

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

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

Я читал о GCD, и мне кажется, что можно было бы выполнять большую часть моей работы вне основного потока с помощью GCD, но неясно, как я буду координировать различные части. Например, ИИ необходимо оценить доску, но каждый раз, когда актер меняет доску, текущая оценка становится недействительной. Нужно ли настраивать очередь для управления состоянием доски? Я помещаю каждого ИИ-игрока в одну очередь? Как лучше всего прервать ИИ, когда он выбирает лучший ход?

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


person Fran K.    schedule 28.07.2012    source источник
comment
Это может помочь вам. В этом ответе также есть пара полезных ссылок: stackoverflow. ком/вопросы/7693203/   -  person bryanmac    schedule 28.07.2012
comment
В частности, здесь есть пример кода в части ответа GCD: title="gcd потоки программы и обновление пользовательского интерфейса"> stackoverflow.com/questions/7290931/   -  person bryanmac    schedule 28.07.2012
comment
Спасибо за указание, я просмотрел десятки сообщений и пропустил это, это самое ясное из всех, что я видел. Это не совсем то, что я искал, но это что-то пробудило у меня в голове, и я думаю, что половину моей проблемы можно решить, поместив мою модель данных в одну фоновую очередь и отправив туда все входные данные человека и ИИ, а затем отправить эту очередь Обновления пользовательского интерфейса в основной очереди. Я чувствую, что мне нужно больше, чем это, но эта идея стоит быстрого прототипирования, спасибо!   -  person Fran K.    schedule 29.07.2012
comment
У меня пока нет полного решения, но я хотел обновить вопрос тем, что я обнаружил до сих пор. Во-первых, блоки анимации UIView просты, но ограничены, поэтому я начал переходить на анимацию CALayer и убежден, что это правильный путь. Во-вторых, поскольку мне еще предстоит убедить себя, что я должен пойти по пути CADisplayLink, я использовал таймер через GCD, и это работало хорошо. GCD довольно хорош, и я переделывал свой код так, чтобы он работал вне основного потока и по мере необходимости передавал блоки в основную очередь для обновлений пользовательского интерфейса. Я еще не там, но делаю успехи.   -  person Fran K.    schedule 06.08.2012