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下载
本文最初发布 在我自己的网站上 。