Свойство экземпляра preferredFramesPerSecond
предназначено для предпочтительной частоты кадров для обратного вызова ссылки дисплея, но не для камеры.
var preferredFramesPerSecond: Int { get set }
Когда вы указываете предпочтительную частоту кадров для ссылки дисплея, оноуведомляет цель с максимально возможной скоростью на основе возможностей аппаратного обеспечения и других задач, которые может выполнять ваша игра или приложение. Фактическая выбранная частота кадров обычно является фактором максимальной частоты обновления экрана для обеспечения постоянной частоты кадров .Например, если максимальная частота обновления экрана составляет 60 кадров в секунду, это также самая высокая частота кадров, которую канал отображения устанавливает в качестве фактической частоты кадров.Однако, если вы запрашиваете более низкую частоту кадров, в качестве ссылки на отображение может быть выбрано 30, 20 или 15 кадров в секунду или другая скорость.Выберите частоту кадров, которую ваше приложение может постоянно поддерживать.
Во время сеанса AR непрерывно захватывает видеокадры с камеры устройства.Для каждого кадра ARKit анализирует изображение вместе с данными от устройства обнаружения движения устройства , чтобы оценить реальное положение устройства.ARKit предоставляет эту информацию об отслеживании и параметры изображения в виде объекта ARFrame.
Частота кадров для устойчивой дополненной реальности должна бытьМинимум 60 кадров в секунду.
Но я должен заметить, что передняя камера глубины изображения в iPhone X захватывает изображение zDepth с частотой 15 Гц (AVDepthData
при 15 кадрах в секунду) вместо обычного изображения RGBкоторые должны быть зафиксированы с частотой 60 Гц.
Чтобы запросить ARKit о положении камеры, вы можете использовать методы, перечисленные здесь (для создания пользовательского AR View
путем рендеринга изображений с камеры и использования информации отслеживания положения для отображения наложенного содержимого): Отображение опыта AR с металлом .
Или используйте такой подход:
class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {
@IBOutlet var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self // ARSCNViewDelegate
sceneView.session.delegate = self // ARSessionDelegate
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let configuration = ARWorldTrackingSessionConfiguration()
sceneView.session.run(configuration)
}
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let currentTransform = frame.camera.transform
}
}