大多数浏览器和
Developer App 均支持流媒体播放。
-
充分利用模拟器
与我们一起深入探索模拟器的世界。了解模拟器的工作方式,探索您可能不曾知晓的功能,并浏览模拟器中用于自动化的命令行界面。了解模拟器中通过 Metal 实现的原生 GPU 加速,以及如何优化您的 Metal 代码来充分利用这项功能。
资源
相关视频
WWDC20
WWDC19
-
下载
(充分利用模拟器)
大家早上好 欢迎参加充分利用模拟器演讲 我叫Russ Bishop 我是模拟器和设备团队的一名 软件工程师 让我们开始讲吧
今天我会告诉你们什么是模拟器 然后Tracy会上台 讲一些热门问题和回答 以及充分利用模拟器app
我会再返回来告诉你 如何从命令行使用模拟器 最后Katelyn会上台来 告诉你们模拟器中的 Metal的使用
那么什么是模拟器? 它是在Mac上模拟iOS、tvOS 和watchOS设备的最佳方式
它是一个很好的开发工具 你的Mac有更多的内核、 更多的内存 你可以并行运行多个设备
它是一个很棒的工具 但作为一名软件工程师 那种解释可能有点儿不太令人满意 为了从技术层面讲一下模拟器 我们需要先谈谈什么是操作系统
我们有Kernel管理硬件资源、 分配内存、在各进程之间做出裁决 非常地直截了当
然后macOS位于它的上层 有一个用户空间
我们发布了 PID 1 launchd进程 我们可能还有在它上层运行的一些 守护进程 某些服务 我们有一些框架 然后运行着我们的app
模拟器实质上是个独立的用户空间 它有自己的launchd进程 有自己的守护进程 有自己的框架并运行自己的app 这些都是完全独立的 并与你Mac的用户空间相隔离 如果我启动另一个模拟器 那会打造另一个独立的用户空间 它不仅与macOS用户空间相隔离 还与其它运行中的模拟器相隔离 从技术层面来说 模拟器是 iOS、watchOS 或tvOS用户空间
只不过是运行在 Mac Kernel上
拥有独立的launchd进程、 独立的守护进程和服务、 独立的通知域名、独立的URL会话 独立的引导程序
它确实共享同样的文件系统 但却有独立的根目录
自libSystem起 一切都针对我们所模拟的平台 进行创建 因此包括 在最底层 你知道的 libSystem 所有的Syslibs一直到UIKit 以及其它框架
它对那个平台使用ABI
并且它是针对Mac的处理器 进行的原生创建 它不是个仿真器
下面讲一些细节
模拟器的内存和CPU限制-
倒不如说没有模拟设备的 内存和CPU 因此如果你的Mac有… 如果你有一台新Mac Pro 并且有1TB的内存 你的模拟器可以分配1TB的内存 如果你在iPhone X上 尝试去做那很可能会失败
Mac还有不同数量的内核 不同的线程行为 那可能是个恩惠 它可以帮助揭露 数据竞争或其它线程状况 但它是你需要引起注意的东西
app沙盒不是强制的 因此模拟器中的进程可以写在 它的沙盒外 但再说一次 如果你在设备上尝试 那一定会失败
然而 绝大多数人的Mac都设置了 不区分大小写文件系统 但模拟器的全部进程 却都使用区分大小写文件系统
然后 最后但却并不是最不重要的 模拟器中支持 Thread Sanitizer 然而设备却不支持它 因此那是一个有用的工具
那么现在我要把舞台交给Tracy 她会上台来讲一些热门问题和回答 Tracy?
早上好! 我叫Tracy 我是开发技术小组的一员 那么你知道的我们总会收到一些提问 这些提问来自于演讲、 讨论会或用户论坛中的反馈 那么我们认为回顾一下 其中某些问题的答案可能会有帮助 那么我的目标是 让你最少了解一件你以前 不知道的与模拟器有关的事 在此之前 我想稍微谈谈 为什么模拟器 对于你的工作流程来说很重要 嗯 如果我们考虑 兼容iOS 13的全部设备 然后我们添加 全部其它操作系统和设备 那么你其实正在查看 上百台设备和操作系统 都对客户可用 并且还只是 iPhone和iPad相关的 甚至不包含Watch和TV 嗯 你的双肩包里要塞这么多的东西 那么我们想 “嗯 用这些老操作系统 做测试怎么样?” 我确定你有使用老设备 和老操作系统的客户 你可能会想 “Tracy 我不可能测试全部这些配置” 嗯 那可能是真的 通过模拟器 虽然你可能不会拥有 全部这些物理设备 但你可以使用每一个 可用的操作系统和设备 那会让模拟器变成你日常工作中的 一个非常重要的工具 好的 让我们讲讲那些热门问题 第一个问题 我可以在模拟器上进行放大吗? 是的 你可以 你可以模拟捏合手势 按住Option键时点击并拖动
你可以模拟的另一个手势是拖放 首先你要在app中 然后点击Control键 模拟长按拖拽 到你想去的任意地方 然后松开Hold键
哦 很不错
下一个问题 我可以修改模拟器 用于输入和输出的音频设备吗? 是的 你可以 那是通过硬件菜单实现的 你可以选择想要使用哪个音频设备
那样你可以聆听你的Apple音乐 而不会被中断
下一个问题 iCloud在模拟器中能用吗? 是的 它能用 你可以通过设置app 登录iCloud 然后就可以在模拟器中 通过iCloud 使用所有的Calendars、 Contacts 以及其它可用的app
你还可以通过使用调试按钮 触发iCloud同步 触发iCloud同步
哦 看 我下周有个休假 太好了
下一个问题 我可以使用摇晃手势吗? 是的 你可以 在这个例子中 有个同事创建了一款app 当收到摇晃动作时会指示出来 那么你进入硬件菜单 并选择摇晃手势
你还可以模拟内存警告 通过调试菜单
下一个问题 我如何让老版模拟器 作为部署目的地显示? 这都是通过设备和模拟器面板实现的 你可以从窗口菜单下找到它 或你可以使用键盘快捷键
现在Xcode 11配备一个 模拟器的默认列表 你可能会注意到 它列出了许多对模拟器 但你总是可以按照需要 安装额外的模拟器 实现方式是进入模拟器标签
接下来我们要做的是点击 左下方的加号按钮
然后选择设备类型 以及想要使用的操作系统
在这个例子中 对于设备类型 我们选择iPad Mini模拟器 Xcode 11 现在支持iPad Mini了 一直支持到iPad Mini 2
你要给这个模拟器命名 然后点击创建 现在将呈现你新创建的模拟器目标
且你可以在新的iPad Mini 模拟器中运行app
让我们花点儿时间 谈谈Watch模拟器 预设Watch模拟器对已自动添加 到iPhone X和XS Max 但你可以通过点击加号按钮 添加一个新配对
再说一次 你要选择操作系统和设备类型
然后点击配对
要修改活跃的配对 我们要做的就是点击单选按钮
你还可以下载老版模拟器 通过进入Xcode首选项 并选择组件 你可以选择你所需要的然后点击安装 然后就会安装老版模拟器 然后你就可以选择它们了 根据你项目中的部署目的地设置
你还可以通过使用硬件设备按钮 获得老版模拟器 然后就会启动老版模拟器
这将允许你并排显示较新的操作系统 和较老的操作系统
你可以通过取消勾选“显示为运行 目的地”来隐藏模拟器目标 你还可以删除模拟器目标 如果你不再需要它们的话 并且你可以使用键盘上的删除按钮 或你可以使用情境按钮 按住Control键 你还可以选择所显示的其它项 请记住 如果你改主意了 你总是可以通过创建模拟器目标 把它们添加回来 好的 让我们看下一个问题 模拟器霸占了太多屏幕空间 我能把它们变小点儿吗?
是的 你可以 在模拟器上有三种可用的预设 物理尺寸、点精确和像素精确 这些都是什么意思呢? 嗯 外形尺寸实际上是 设备的物理尺寸 你可以举起设备放在屏幕上 那是它的物理尺寸 点精确是指 一个UIKit点 等于一个AppKit点 然后像素精确是指逐像素呈现 基于你的监控器分辨率
或有人可能了解 你总是可以拖动 打开模拟器 然后随意调整它的尺寸 你最大可以把它调整为 与显示屏相同的尺寸
下一个问题 模拟器可以帮助我调试UI动画吗? 是的 它可以 这通过调试菜单下的慢动画实现 一旦你切换为慢动画 并选择任意app 它将很慢地运行
降低UI动画速度
下一个问题 Siri能在模拟器中使用吗?
是的 它能 只要你给模拟器提供麦克风权限 就可以 你可以在全部模拟器平台上 调用Siri 此外 你还可以从硬件菜单 或使用键盘快捷键找到Siri
下一个问题 如何控制我的tvOS模拟器? 嗯 有几种不同的实现方式 其中一种是使用 Apple TV软件遥控 它位于硬件菜单下 点击它 要激活那个区域 你只需要按住Option键 并移动游标即可
另一种方式是 使用硬件Apple TV遥控 你给它配对 按住遥控上的加号和菜单按钮 一旦配对成功 你就可以 在tvOS模拟器上的硬件 Apple TV遥控中使用它了
你还可以使用游戏控制器 对于简单的导航 只需要使用键盘即可
下一个问题 我可以在iOS 13模拟器上 使用Xcode 10吗?
是的 你可以 必须让Xcode 10运行在 与Xcode 11-Beta 所运行的系统相同的系统上 你要做的第一件事就是 启动Xcode 11 同时也启动一个模拟器 那将为你提供iOS 13运行时间 然后关闭Xcode 但保持 Simulator.app打开
然后你就会进入老版 Xcode 10
把它放在前台 然后你就可以 在模拟器上创建并运行了 让我来演示一下如何实现 我们正在运行Xcode 10
我们要做的就是选择 iOS 12.2模拟器 在它上头运行我们的app 然后我们要改成iOS 13模拟器 我们要在它上头运行我们的app
现在你可以看到 新版和旧版并排显示
哦 哇 得到了你们的掌声
下一个问题 我可以把内容复制到模拟器中吗? 复制内容的方法有许多种 其中一种是通过拖放 通过拖放 你可以 复制app捆绑包、地理位置、 照片和视频以及URL
在这个例子中 我可以让我的项目 获取我的app捆绑包 只需把它拖放到模拟器上即可 那将安装app捆绑包 并且我可以运行它
在这个例子中 我们要获取一些照片和视频
我选择全部 然后我只需要把它们 直接拖拽到模拟器中 它们将自动进入 Photos app
哦 等一下 我拖入了四个 但我只得到了三个 哦 那是因为照片和视频文件进行了重新 调配从而给你提供一个动态照片
拖放URL很简单 只需打开Safari 选中URL 然后拖放即可
你还可以从Safari内使用 Safari共享表单 模拟器是Safari 共享表单之下的一个目标 选中它 它会打开一个对话框 你可以选择一个模拟器 或你可以同时进入所有模拟器
同时你可以通过共享表单共享位置 在Maps app 你会得到一个地理位置 点击模拟器 选择你的目的地 然后它将与模拟器共享那个地理位置
好的 提一下其它有帮助的提示 你以前可能不了解
硬件菜单下有自动旋转设备 那么如果你切换为这个设置 它将遵循你项目中的设置 并自动旋转模拟器
在模拟器中我们有一些 对于模拟器地理位置的预设 其中一个就像在高速路上开车一样 你可以模拟在高速路上开车
你还可以输入你自己的 自定义地理位置 通过输入经度和纬度
如果你想了解当来电时 你的app是怎么样的 你可以使用切换通话中状态
或你可以使用键盘快捷键 Command-Y
你可以用外部显示器显示不同内容 在本例中 我们正在播放一些视频 但没有用Safari 我们选择了一些不同的显示分辨率
模拟器上还可以使用暗黑模式 你可以从开发者菜单下找到它 在设置下切换到开发者菜单 然后点击暗黑外观
你还可以在模拟器中修改墙纸 如果你想的话 你只需要把照片拖入 Photos app 然后点击照片 使用共享表单 那会把它放到前台 就像它在iOS设备上那样 选择它作为墙纸 然后模拟器也会把它 用作背景墙纸 用作锁屏墙纸 现在你有新背景了
在模拟器中还可以使用听写功能 你可以在设置app下找到它 在键盘下有一个启动听写
一旦你打开它
你会打开一个app 接受键盘输入 使用Command-K 打开软件键盘 你会在那儿看到麦克风 然后你就可以开始听写了
还可以修改输入语种 如果你之前不知道的话 你可以进入键盘 选择你想要的输入语种 有许多不同的语种
然后再说一次 你只需要打开软件键盘
点击地球图标 就像你在iOS设备上所做的那样
提到键盘 模拟器中还支持新的 QuickPath 只需要打开键盘 开始你的路径 然后就好了
你还可以通过使用模拟器帮助菜单 获取更多信息
键入你想要了解的内容 并且搜索功能也会为你指出 你需要去哪里了解
嗯 我的时间就要到了 我希望你们学到了至少一个 你以前不知道的与模拟器有关的信息 现在我要把舞台交给Russ 他会讲通过命令行运行模拟器 谢谢
谢谢Tracy
让我们谈谈从命令行运行模拟器
如果我今天要留给你一件东西 那就是xcrun模拟器控制 或简称simctl
但如果我今天可以留给你两件东西 那应该是 xcrun simctl帮助
模拟器控制可以提供大量帮助 如果你运行它但却没有命令 它会告诉你全部可用的命令 如果你运行帮助 然后运行命令名称 它会给你提供 关于那个特定命令的更多详细信息
我要讲一些可能会对你有帮助的命令 然后简单地谈谈其它命令 然后我们会做一个小演示
那么第一个命令 最基本的命令 是list命令
这会为你提供你所拥有的设备类型、 运行时间、设备 我缩短了这个列表 从而让它显示在一张幻灯片上 你很可能会在你自己的机器上 看到更多
我们在这里可以看到有设备类型 既有它们的简称 又有它们的标识符、 运行时间、简称和标识符 我的设备 它的标识符 然后是当前状态 目前是关机
能接受比如设备类型 或运行时间的绝大多数命令 都能接受名称 简称 当你在终端键入时可以使用简称 完全没问题 从而节省敲键盘的时间 但我强烈推荐对于自动化和脚本来说 最好是使用完整标识符 只是为了保持特定性
list命令接受一些不同的类 其中一类是设备 那么在这个例子中 我不查找运行时间或设备类型 我只想查找设备 我可以指定它 并且我也可以提供一个搜索字符串 在这个例子中 我只想查找 我的iPhone X设备
list命令还有一个JSON标识 会输出一个机器可读的JSON文件 你可以用于进行自动化
我要讲的下一个命令 是create命令
有人可能已经听说了我们今年 将支持独立的Watch app 我需要一个独立的Watch模拟器 从而在Watch模拟器上进行部署 我要调用这个测试Watch
指定我想要的设备 4 - 44mm系列 我想让它在 watchOS 6.0上运行
输出的是设备的标识符
因此我可以在环境变量中捕捉到它 或用于编写脚本 在这个小例子中 我给那个值设置了新设备 然后看 自动程序重复了 我们所创建的设备的标识符
绝大部分模拟器控制命令 都遵守UNIX协定 如果成功 值为零并退出 如果失败 值为非零代码并退出 报错被打印到标准报错 然后实际的输出 比如设备标识符或JSON 输出到标准输出
我要讲的下一个命令 是spawn命令
spawn命令会暂停xspawn 它是模拟环境中的一个进程 你可能会想“它有什么用?” 嗯 我们把一些 你可能用得上的实用程序 搬到了模拟器中
在这个例子中是作为默认实用程序 我要指定我想要模拟的设备 在这个例子中 我要使用别名“booted” 因为我有一个引导模拟器 因此我实际上不需要指定它是哪个 我要比如默认写入 我app的捆绑ID 我想把ResetDatabase键设为是 这是一种便利的方式 可以在它运行之前 修改你app的用户默认值
我还可以运行 log stream实用程序 如果你以前没见过 或没在Mac上运行过 你可传递一Predicate参数 然后以流形式查看输出日志 嗯 你可以在模拟器上做同样的事
在这个例子中 Predicate是 senderImagePath CONTAINS nsurlsessiond 因为我想调试与URL会话 一起使用时出毛病的一些东西
然后我可以以流形式查看输出日志 你可能会注意到 模拟器控件已经检测到 我正在使用支持颜色的交互性终端 它把那个信息传过来 从而日志流会为我提供一些 颜色漂亮的输出 并且在这里我可以看到 我的dataTaskWithRequest allowsCellularAccess被设为1 这就是我想要的 我很高兴
提到日志 我要讲的下一个命令是 diagnose命令
这是一个非常有用的命令 diagnose命令 不仅连接磁盘上的日志 还连接短暂日志和dump系统状态 那在追踪问题时很有用
它是在自动化系统中运行的 一个很棒的功能 如果你测试失败 或出现某种问题 请立即捕捉诊断、控制诊断 这对于归档错误也很有帮助 因此在自动化情境中 我要传递-l标识以跳过隐私警告 但我强烈建议你 在使用这个命令之前了解它 并查看Apple的隐私权政策 这会告诉你它将收集哪种类型的信息 可能包含账户名称之类的信息
诊断可以运行 它会告诉我它把文件写入到了哪里 如果我在工作中使用了这个诊断命令 我还会得到一个弹出的 Finder窗口 给我显示它所产生的文件
因此 如果你要通过新反馈助手 在反馈中发送 如果是模拟器的问题 请附加一个模拟器控制诊断 那使得查找具体哪里出错 变得更简单 我强烈推荐你在你自己的工作中 使用它 如果你要把错误发送到… 比如 如果你在做QA 你要把一个错误发送给软件工程师 嘿 app-某些地方出错了 附加一个诊断 那将包含 来自你app的全部日志输出 我要讲的下一个命令是 launch命令
Launch命令启动app
你可能会问“它和spawn命令 有什么区别呢?” 嗯 launch会礼貌地询问系统 “请问可以开启 带有这个捆绑ID的app吗?” 这等同于在主屏幕上轻触图标 事实上 在iOS、 watchOS或tvOS上 只有这样 进程才可以在屏幕上显示信息
因此它非常重要 如果你实际上想启动一个 已安装的app 你需要使用launch命令
我要再一次指定引导别名 因为我只有一个引导模拟器
我要启动我的 com.apple.example app 传递一些参数 如果你之前没见过的话 用户默认允许你从命令行 覆盖你作为参数设置的默认 用一个单破折号作为键的前缀 接着是键名称 然后指定值 对于我的app的那个特定启动 -MyDefaultKey将被 设为是 无论磁盘上存储了什么 Launch命令可以为我实现一些 很有意思的功能 如果我给控制台传递-pty标识
launch命令会把我app的 标准输入、输出和标准报错 连接到我正在使用的终端
因此当我启动这个app时 我会直接在我的终端中 看到它的标准输出 不仅如此 我还可以获得调试功能 在这个例子中 我按下回车键 它会dump一些调试状态 因此在终端中 我可以按回车键 从app中打印调试状态 当你调试时 这是个非常有用的工具
你可能会注意到的另一件事就是 按Control-C 会发送一个中断信号 模拟器控件发现信号 获取信号并把它传给app 那不仅适用于类似中断信号的信号 还适用于用户信号: user1、user2 还有方式可以设置你的app 使其包含调试信息
那么还有更多的命令…
我没有时间一一讲到 我只想简略地做一个概述
Boot命令 正如 你可能期待的那样 引导一个设备
Shutdown命令也非常明显 它关闭设备 但关机接受特殊别名 如果是全部别名 那将关闭所有运行中的模拟器
Delete 正如你所期待的那样 它可以删除设备 但它还接受另一个便利的别名- 不可用 那将查找全部使用了运行时间 但却对你不再可用的模拟器 也许是老版的Xcode 而你把它升级了 或一个下载的模拟器运行时间 就像Tracy给你们展示的 那个一样 而你把它删除了 那将清除全部这些模拟器 并恢复相应的磁盘空间
接下来是pair命令 有pair命令 也有相关联的 Unpair和pair activate命令 你可以从命令行设置 手表-手机配对
Addmedia命令类似于 Tracy刚才给你展示的 把照片和媒体拖放到模拟器中 你也可以用脚本实现
Get app container 是个非常有意思的命令 如果你的app出问题了 也许是正在写一个被损坏的文件 或它尝试加载某些东西 你知道的 它应该在那儿 但它却不在那儿 Get app container 可以为你提供磁盘上的路径 让你找到app的数据容器 或甚至是找到共享容器 也许是你的app和你app的扩展 正在使用的共享容器 然后你就可以检验实际内容 检验来自Finder或 终端的文件系统看看哪里出错了
Install命令 非常类似于 Tracy刚给你展示的 拖放app捆绑包 你可以从命令行安装一个app
然后我要提到的最后一个是io命令 Io自身有许多子命令 很可能最重要的一个是屏幕截图 它可以让你在模拟器中 自动获取截图
然后我要讲的最后一个命令是 clone命令
Clone是一个非常强大的命令 用于自动化 用于测试 用于做实验 Clone允许你按照你想要的方式 设置单一模拟器 安装app 设置用户默认 加载数据 然后你可以关闭那个模拟器 并复制多个一模一样的模拟器 如果需要的话 然后你可以运行那些复制的模拟器 实施你的实验 完成后就丢弃它们
这可以节省很多时间 并节省大量磁盘空间 因为clone 利用了底层的APSF文件克隆 如果你的游戏有价值1GB的资产 并且你想并行运行多个测试 你可以继续去做 而不需要占用太多磁盘空间 那么说得多不如做的多 我要给你们做一个演示
好的
我要做的第一件事 就是打开模拟器 我将作为基准使用 用作对比
我要打开那个模拟器 你可以看到打开了模拟器app 因此它是自动附加到模拟器上的
我要做的第二件事就是安装app 这里是我的app捆绑包 整装待发 正如我之前告诉过你的那样 我要在那个app中
运行install、 booted命令 我们会看到它出现在主屏幕上了 它现在已经安装好了
接下来我要做的是关闭这个模拟器 在我们克隆它之前 我们确实需要关闭它
一旦我关掉它之后
我就可以创建一个克隆 叫做clone-1
现在我要再次运行这个命令 创建另一个克隆 clone-2
现在我有两个克隆模拟器 我要继续并要求它们boot
在这里我们可以看到 它们两个都已经启动了 它们的启动启动速度快多了 因为我不需要支付 首次boot的费用 我已经在设置基础模拟器时 支付了那个费用 因此那会非常节省时间
然后这里是我可以进行哪些设置 为演示准备的东西已经就位 或者我想要运行的实验 然后我可以在这两个模拟器中 同时启动app
现在有人可能认出这段代码了 这是Metal DeferredLighting的演示 这是我们以前不能运行的东西 它是Xcode 11中的新功能 当在macOS Catalina上运行时 为了让你们了解模拟器中的 Metal的相关信息
我要邀请Katelyn上台 Katelyn?
谢谢
谢谢Russ 早上好 我是Katelyn Hicks GPU软件团队中的软件工程师 今天 我感到非常激动 我要分享 模拟器中新增加对Metal的支持 让我们具体看看如何在模拟器中 最大限度地利用Metal
因为运行在macOS Catalina 和Xcode 11上 模拟器现在支持Metal了 但那对于你的app来说 意味着什么? 嗯 两件事 对于所有app来说 模拟器完全是GPU加速的 第二 Metal API现在可以 在模拟器中使用了
让我们看看当运行在 macOS Catalina 和Xcode 11上时 模拟器有多快 我们会快速浏览一些app 来了解那个信息 跨系统动画更加流畅 用户体验更加有响应性
这是由于Apple框架 迁移到了Metal渲染器中 现在可以充分利用GPU了
因此如果你的app 没有使用Metal 而是使用了Apple框架 来处理UI 2D或3D图形 你仍然可以得到GPU加速性能改善
你的app不需要做任何必要的修改 以通过Metal实现GPU加速 加速是免费的 现在我要给你演示一些例子
左侧是运行在软件渲染器上的 一个设备 右侧是新的GPU加速的模拟器 在这个简单的图形项目中 我们可以了解改善的性能 通过滚动那个使用了 UIKit的表视图
自最初的模拟器起 iOS设备的分辨率提高了17倍 这给底层的软件渲染器 施加了额外的压力
在这个 SpriteKit Xcode模板中 我们看到软件渲染器的性能 降到了每秒15帧 而我们在Xcode 11 和macOS Catalina中 渲染了同一个app 我们看到的是稳定的每秒60帧 在场景中渲染了 更多的SpriteKit节点
对于更复杂的3D场景 比如这个使用了 SceneKit的Fox演示 我们看到戏剧性的性能改善 而不需要修改 Fox app的源代码
现在已经可以并行运行 多个模拟器设备了 并拥有实时性能 在这同样使用了SceneKit的 Badger演示中 以前的几何图形和动画 对于渲染单一软件的GL模拟器设备 来说已经是太费劲了 更不必说并行运行两个模拟器了
对于直接使用Metal的 开发者来说 现在已经可以实现Metal开发了 并且工作负荷被完全加速了 让我们看看 当在模拟器中运行你的app时 你的体验发生了哪些变化 那么以前你可能会看到一个黑色屏幕 但现在 当你在模拟器中运行你的app时 你可以在所模拟的全部设备上 运行你的app
现在你已经在操作中了解了 让我们具体来看更多的细节
如果你看到了我们的 其它Metal会话 你就知道今年我们翻新了 我们的查询API功能 并引入了 Metal GPU Family API Metal GPU Family API 使编写跨平台代码变得更简单了 通过把GPU功能 提取到一些不同的层中实现 与模拟器相关的三个家族分别是 第一个是common 包含跨平台可用的全部GPU功能
第二个是macOS 包含macOS GPU 硬件的特有功能
第三个是Apple 包含iOS和tvOS GPU硬件 特有的功能 因此当在模拟器中运行你的app时 你的app可以使用来自 MTLGPUFamilyApple2的功能 也包括来自 MTLGPUFamilyCommon1的功能
这个支持在全部模拟器设备上通用
因此让我们了解一下在模拟器中 是否真的可运行你的iOS app 以前 你的app在一个OpenGL ES 软件渲染器上进行渲染 并且它没有任何GPU硬件加速 但现在在Xcode 11 和macOS Catalina中 好消息是可以在模拟器中 使用Metal API了 并且也能使用所有使用了 Metal的Apple框架
但它不仅仅是能用了 还有GPU加速 这意味着你的iOS app 针对UI 2D或3D图形 所创建的全部命令 都从iOS Metal迁移到了 macOS Metal中 并且这种翻译允许你 在你的系统上充分利用 底层的Mac GPU 但这确实伴随着一些警告 其中一个就是你看到的性能 可能与实际设备的性能不一样
因此你所看到的图形 将是底层Mac GPU的性能 并且模拟器设备 并不是真正的iOS GPU仿真器 因此如果你在速度非常快的 Mac Pro上 运行一个iPhone 6s模拟器 你所看到的性能 与你在实际设备上 成功运行app的性能不一样 那么一如既往 请确保直接在设备上 配置并优化你的app 在你发布app之前
还有一件事要考虑 就是macOS和iOS 拥有不同的存储模式
iOS支持私有、共享 和不耗内存纹理 而Mac支持私有和托管纹理 然而原生macOS设备不支持 共享和不耗内存纹理 但在模拟器中却支持它们
关于共享存储还有一些其它特殊情况 但首先让我们回顾一下 共享存储是如何运作的
当你用共享存储模式 创建一个iOS纹理时 这意味着你的纹理 既可以在CPU又可以在GPU上 进行修改 因此如果你的app想在CPU上 初始化这个纹理 然后把纹理绑定到一个渲染器上 或计算在GPU上读取的编码器 你可以在命令缓冲器完成后 直接在GPU上修改同样的纹理 然后在CPU上重复那些修改 并且你的app不需要担心 任何内存同步化 因为在iOS上 它是一个统一的内存模型
因此在模拟器中 对于多样本、 深度模板和线性纹理来说 这些纹理类型必须在私有存储中创建 然而在实际的iOS设备上 这些类型必须在共享存储中 因此你的app可能需要一个 仅模拟器使用的路径 如果这些纹理需要CPU权限 对于绝大多数人来说 你可以直接在你的GPU命令中 初始化这些纹理类型并使用它们 因此这不会影响你的app 它们应该已经是私有纹理了 但如果其中一个纹理 确实需要CPU权限 让我们了解一下需要进行哪些修改 那么作为一个提醒 如果你在私有内存中创建了一个纹理 那个纹理将没有CPU权限 它只能由GPU修改并由GPU读取 因此如果你的app 在CPU上读写纹理 你需要一个中间共享资源来实现
因此首先我们要创建一个共享缓冲器 或一个共享纹理 然后为了复制这个纹理创建一个 BlitCommandEncoder 在这种情况下你可以 从共享缓冲器复制到私有纹理 或从私有纹理复制到共享缓冲器 让我们看一下源代码
在这段代码示例中 我们看到已经创建了深度模板纹理 并且我们想在CPU上 对它进行初始化
因此首先 我们要在模拟器中 把存储模式修改为仅私有 然而我们并没有处于模拟环境 我们希望仍使用共享存储模式
然后我们用修改了的 textureDescriptor创建纹理
然后在模拟环境中 为了初始化这个私有纹理 我们首先要创建一个共享缓冲器 对于这个共享缓冲器 我们将在CPU上对它进行初始化 使用你想在你的私有纹理中 看到的数据 最后我们把共享资源 传输到私有纹理中
然后如果你仍在 实际的iOS设备上运行 我们想做与你之前所做的操作 一模一样的操作 在CPU上初始化那个纹理 并避免这种不必要的传输
从这一点来看 这个纹理的使用完全一样 无论你是在实际的iOS设备上运行 或是在模拟器中运行 你所有的GPU命令必须完全相同
那么在模拟器中 可能还需要对你的app 做一些其它修改 我们有完整文档 描述了那些小修改 并且我们还有示例代码 你可以下载 来了解如何把app搬运到模拟器中
我希望你今天学到了 关于模拟器的新知识 我们首先回顾了iOS、 watchOS和tvOS用户空间 在macOS Kernel上运行 并且模拟器对于跨设备和跨运行时间 测试app来说至关重要 我们了解了 xcrun simctl强大功能 以及如何通过模拟器 给全部测试编写脚本 最后我们了解了GPU加速 通过模拟器中的Metal 每个人都能用 并且还可以在模拟器中 进行Metal开发
如果你有其它疑问 请访问演讲网站 谢谢 希望你在本周余下的 时间里过得愉快
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。