Запрос ввода: архитектура 8-разрядного симулятора swift

#ios #swift #skspritenode

Вопрос:

Я создаю симулятор 8-разрядного компьютера с использованием Swift на iOS. 8-разрядный компьютер имеет экран с 25 строками, каждая из которых содержит 40 символов в строке (т. Е. всего 1000 символов), и каждый символ может быть 1 из 256 различных символов (например, A,B,C,1,2,3 и т.д.). 8-разрядный процессор выполняет 1 команду каждые 5 микросекунд.

Я создал функцию, которая имитирует 8-разрядный процессор (т. Е. Каждый раз, когда он вызывается, он выполняет одну инструкцию). И я создал и отобразил массив из 1000 SKSpriteNodes, которые я меняю местами на разные текстуры в зависимости от того, какой символ должен отображаться.

Вопросы:

  1. Существует ли точный способ запускать функцию процессора каждые 5 микросекунд, сохраняя при этом обновление SKSpiteNodes? Я попробовал несколько вариантов следующего:

1А:

 serialQueue.asyncAfter(deadline: DispatchTime.now()   .microseconds(5)) {
  runCPU()
}
 

.. но время для этого не очень точное.

1B:

 repeat {
  let runAt = DispatchTime.now()   .microseconds(5)
  var done = false
  repeat {
    if DispatchTime.now() >= runAt {
      runCPU()
      done = true
    }
  } while !done
} while true
 

..но экран (массив SKSpriteNodes) никогда не обновляется, предположительно, потому что я запускаю бесконечный цикл в основной очереди?

  1. Есть ли более эффективный способ отображения моих 1000 символов, чем массив из 1000 SKSpriteNodes и изменение текстур, когда мне нужно обновить экран?

Комментарии:

1. Я не думаю, что в iOS можно получить точность синхронизации на уровне миллисекунд. Это не RTOS. Вам либо нужно выбрать гораздо более медленное время цикла, либо вы можете позволить процессору работать свободно. Используйте можно использовать ссылку cadisplay для вызова кода обновления дисплея

2. Ваш второй блок кода может работать до тех пор, пока он не будет запущен в основном потоке. Вероятно, вы могли бы немного оптимизировать этот код; Не продолжайте вычислять «сейчас 5 микросекунд». Следующее время выполнения составляет всего 5 микросекунд после первого времени выполнения; Часы процессора не учитывают время выполнения инструкции. С вашим текущим кодом следующий тактовый цикл составляет 5 микросекунд после runCPU завершения.