Metal Camera教程奖金:在iOS Simulator中运行Metal项目

在《金属相机教程》系列中,我们创建了一个简单的应用程序,可以在屏幕上实时渲染相机帧。 但是,此应用程序使用的是Metal框架,iOS模拟器中没有该框架。 基本上,如果您选择模拟器作为构建设备,则您的应用甚至都无法构建,这很可惜,例如,要添加单元测试,而无需在未将实际设备连接到计算机的情况下就可以运行它们。

Metal某些部分具有针对桌面处理器体系结构的存根实现,这意味着您至少可以构建该应用程序(仅是发现它在模拟器上无法正常工作)。 Simulator甚至不存在其他部件,例如MetalKit ,因此您必须将导入包装到条件编译块中,如下所示:

 import UIKit 
import Metal

#if arch(i386) || arch(x86_64)
#else
import MetalKit
#endif

我们检查当前的处理器体系结构是否为台式机,在这种情况下根本不导入任何仅ARM的框架。 请注意, MetalKit中的类也不可用,因此您也需要使用它们包装任何代码:

 public class MTKViewController: UIViewController { 

#if arch(i386) || arch(x86_64)
#else
/// `UIViewController`'s view
private var metalView: MTKView!
#endif

// MARK: - Public overrides

override public func loadView() {
super.loadView()
#if arch(i386) || arch(x86_64)
NSLog("Failed creating a default system Metal device, since Metal is not available in iOS Simulator.")
#else
assert(device != nil, "Failed creating a default system Metal device. Please, make sure Metal is available on your hardware.")
#endif
initializeMetalView()
initializeRenderPipelineState()
}

// MARK: - Private Metal-related properties and methods

/**
initializes and configures the `MTKView` we use as `UIViewController`'s view.

*/
private func initializeMetalView() {
#if arch(i386) || arch(x86_64)
#else
metalView = MTKView(frame: view.bounds, device: device)
metalView.delegate = self
metalView.framebufferOnly = true
metalView.colorPixelFormat = .BGRA8Unorm
metalView.contentScaleFactor = UIScreen.mainScreen().scale
metalView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
view.insertSubview(metalView, atIndex: 0)
#endif
}
}

通过这些编译时间检查,您显然无法在iOS Simulator中正常运行您的应用。 但是,它将使您能够构建它,例如,涵盖了不使用单元测试要求Metal的代码。 您可以添加一个存根的摄像头会话来验证摄像头权限和委托,例如,您明白了。

我从这里去哪里?

这是《 金属相机教程》系列的奖励部分,我们在其中探索实现对硬件的最低开销访问以捕获相机帧,将其转换为纹理并在屏幕上实时渲染的方法:

  • 第1部分:获取原始相机数据
  • 第2部分:将样本缓冲区转换为金属纹理
  • 第3部分:渲染金属纹理
  • 奖励:在iOS Simulator中运行Metal项目

您可以从GitHub上的《 金属相机教程》中查看最终项目。

关注@navoshta Star Fork下载

本文最初发布 在我自己的网站上