ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
シミュレータを最大限に活用する
このセッションでは、シミュレータの世界を詳しく紹介します。シミュレータの仕組みやあまり知られていない機能、シミュレータのコマンドラインインターフェイスによる自動化についてご確認ください。MetalによるシミュレータのネイティブGPU高速処理や、Metalコードを最適化して活用する方法についても説明します。
リソース
関連ビデオ
WWDC20
WWDC19
-
ダウンロード
(音楽)
(拍手) おはようございます 皆さん ようこそ 私はラス・ビショップ Simulator and Devicesチームの エンジニアです 始めましょう
まず“シミュレータとは何か?” その後 トレイシーが― シミュレータを活用するうえで 気になる質問にお答えします その後 私が コマンドラインからの操作方法 ケイトリンが シミュレータのMetalの話をします
まずシミュレータとは何か? iOS tvOS watchOSを Macでシミュレートするのに― 最適な方法です
開発にとても便利なツールです コアやメモリが増えて― デバイスを複数 実行できます すばらしいツールですが その説明では エンジニアとして不足でしょう 技術的な面で シミュレータの説明をするために― OSとは何かを語る必要があります カーネルが土台です ハードウェアの管理 メモリの割り当て― プロセス間の仲裁を行います その上にユーザ空間があります PID 1やlaunchd デーモンなども 実行されてるかもしれない フレームワーク そしてアプリケーションがあります シミュレータは 基本的に別のユーザ空間です 独自のlaunchd デーモン フレームワーク― アプリケーションがあります Macのユーザ空間とは別のものです もう1つ立ち上げれば― また別のユーザ空間ができます macOSだけでなく 他のシミュレータとも隔てられてます シミュレータとは カーネル上で実行されるiOSや― watchOSやtvOSのユーザ空間です
個別のlaunchd デーモンやサービス 通知ドメイン URLセッション Mach Bootstrapがあります
ファイルシステムは共有ですが ホームディレクトリは別です
libSystemより上は プラットフォーム用に作られてます 低いレイヤでは― libSystemから UIKitなどのフレームワークまで そこではABIが使われ―
Macのプロセッサにネイティブです エミュレータではありません
あといくつか お話を
メモリやCPUのリミットは… デバイスのメモリやCPUの リミットはシミュレートされません あなたのMacがMac Proで メモリがテラバイトあれば― テラバイトのメモリが使えます それをiPhone Xでやると― おそらく機能しません
コア数やスレッド処理も違います データ競合や 他のスレッド状態を把握しやすい 知っておくといいでしょう サンドボックス化もされません サンドボックス外でも動きます でもデバイス上ではダメでしょう
多くのMacは 非ケースセンシティブな設定です でもシミュレータは― ケースセンシティブな ファイルシステムで実行されます
最後にThread Sanitizerは― シミュレータではサポートされてます 役立つツールでしょう では次に 気になる質問にお答えしましょう トレイシー (拍手) おはようございます Development Technologiesの トレイシーです セッションやユーザフォーラムや フィードバックで― よく質問をいただきます そこでいくつか 質問に答えてみようと思います 何か1つでも 新しい知識を持ち帰ってください でもその前に なぜシミュレータが重要か説明します iOS 13と互換性のある あらゆるデバイスに加えて― 他のOSやデバイスもあります 顧客が使えるデバイスやOSは 何百とある それ以外にも― WatchやTVもあります カバンに入りきりません 古いOSで どうやってテストするか? 顧客によっては 古いデバイスやOSを使っています テストする方法なんてないと 思うでしょう そうかもしれません 物理的なデバイスはなくても― シミュレータなら どのOSやデバイスも再現できます だからこそ ワークフローで重要となります では質問に移りましょう “シミュレータでズームできるか?” できます オプションキーを押しながら クリック&ドラッグすればいい
ドラッグ&ドロップもできます まずアプリケーションを選び― コントロールキーをクリックし 移動すると ホールドできます ドラッグして― ホールドキーを放します
なかなかいいでしょ?
次の質問 “インプットとアウトプットに使う オーディオデバイスは変更可能?” できます ハードウェアメニューから― 使いたいオーディオデバイスを 選べます
好きにApple Musicを聴けます
次の質問 “iCloudは使える?” 使えます 設定アプリケーションから ログインできます そうすれば iCloudとシミュレータを通じて― 他のアプリケーションに アクセスできます iCloudとの同期は― Trigger iCloud Syncという デバッグメニューから行えます
私は来週 休暇ですね
次の質問 “Shake Gestureは使える?” 使えます 例えばshakeを受け取ると通知される アプリケーションを作ったとします ハードウェアメニューから― Shake Gestureを選びます
デバッグメニューから メモリ警告もシミュレートできます
次の質問 “他のシミュレータを デプロイ先にする方法は?” Devices and Simulatorsの ペインからできます Windowsメニューか ショートカットから選べます
Xcode 11は シミュレータが付いてきますが かなり減らしています ただ いつでも追加はできます シミュレータのタブから― 左下の+ボタンをクリックします
そしてデバイスタイプや― 使いたいOSを選んでください ここでは iPad miniを選んでみましょう Xcode 11は現在 iPad mini 2までサポートしています
名前を付けて― “Create”をクリックします これでデプロイ先に表示され―
アプリケーションを シミュレータで実行できます
次にWatchシミュレータの話を iPhone XとXs Maxには プリセットのWatchが自動でペアに でも+ボタンで追加できます
OSとデバイスタイプを選び―
“Pair”をクリックします
ラジオボタンでペアを切り替えます
古いシミュレータランタイムは― Xcode Preferencesの Componentsからダウンロードできます 必要なものを選んでください インストールされ― デプロイ先の設定により 選択できるようになります
ハードウェアのデバイスメニューからも 起動できます
新旧のOSを― 並べて表示することができます
“Show as run destination”を 外すと隠せます 必要なければ削除もできます 削除キーを使うか― Ctrlキーでメニューから削除できます 他のアイテムも選択できます 気が変われば またいつでも追加することができます では次の質問 “シミュレータの表示を 小さくできる?” できます プリセットは3つあります Physical Size Point Accurate Pixel Accurateです どういう意味か? Physical Sizeは物理サイズ デバイスと同じサイズです Point AccurateはUIKitと AppKitポイントが同じになります Pixel Accurateは モニターに 合わせたピクセル単位の描写です シミュレータは ドラッグすれば好きなサイズに― 変えられます ディスプレイ大にもできます
次の質問 “UIアニメーションの デバッグはできる?” できます デバッグメニューの Slow Animationsでできます これを押して― アプリケーションを選べば アニメーションがゆっくりになります
こんなふうに
次の質問 “Siriは使える?” 使えます シミュレータが マイクに接続してあれば― どのプラットフォームでも使えます Siriはハードウェアメニューか キーボードショートカットにあります
次の質問 “tvOS シミュレータの制御法は?” 方法はいくつかあります 1つはApple TV Software Remoteを使う方法です ハードウェアメニューにあります クリックして― エリアをアクティブにするには optionキーを押し― カーソルを動かします
もう1つはハードウェアの Apple TV Remoteを使う方法です ペアリングして +とメニューボタンを押します ペアリングできたら― tvOS シミュレータで Apple TV Remoteが使えます
ゲームコントローラも使えます 簡単な操作はキーボードでできます
次の質問 “Xcode 10を iOS シミュレータで使える?” 使えます Xcode 10がXcode 11-Betaと 同じシステムで実行されてるなら まずXcode 11 そしてシミュレータを起動すると― iOS 13のランタイムになります 次にXcodeを閉じ Simulator.appは開いておきます それからXcode 10を開き―
シミュレータでビルドし 動かします 見せましょう Xcode 10を実行しています まずiOS 12.2 シミュレータを 選んで― アプリケーションを動かします 次にiOS 13 シミュレータに移り― アプリケーションを動かします
新旧を並べて見ることができます
ありがとうございます (笑い) 次の質問 “コンテンツをコピーできる?” いくつか方法があります 1つはドラッグ&ドロップ ドラッグ&ドロップでは― Appバンドルや位置 写真や動画やURLをコピーできます
このプロジェクトで実演しましょう Appバンドルを選択し― ドラッグ&ドロップします インストールされ動かせます
次は写真と動画の例を見せます 選択してシミュレータに ドラッグ&ドロップすると― 自動で写真Appに 4つ入れたのに3つしかない… ああ 写真と動画のファイルが Live Photoに再結合されてますね
URLも簡単です Safariを開いて URLをドラッグ&ドロップします
Safariでは Safari共有シートも使えます シミュレータが共有シートにあるので 選択します ダイアログでシミュレータを1つ― あるいは すべて選択できます
共有シートで位置の共有もできます マップAppで位置を選び― シミュレータからターゲットを選択 これで位置を共有できます
他にも役立つ情報をご紹介します
ハードウェアメニューにある “Rotate Device Automatically” これをオンにすると― プロジェクトの設定を継いで シミュレータを自動的に回転します
プリセットで シミュレートした位置情報があります 1つは高速道路のドライブです
緯度経度を入力し 位置情報のカスタム化もできます
電話がかかってきた時の状態は― “Toggle In-call Status”を使います またはcommand + Yでショートカットを
外部ディスプレイも使えます この例では いくつかのディスプレイを用いて― Safariの動画を再生しています
ダークモードも使えます デベロッパメニューにあります 設定からデベロッパに進み “Dark Appearance”を選びます
壁紙も変えられます 写真Appに写真をドラッグし― 写真をクリックします 共有シートから壁紙として選びます そうすればシミュレータでも 写真が壁紙として使われます 新しい背景の完成です
音声入力も使えます 設定アプリケーションにあります キーボードに― “Enable Dictation”があります これをオンにします キーボード入力できる アプリケーションを起動し command + Kでキーボードを表示 マイクがあるので音声入力します
入力言語も切り替えられます キーボードから― 好きな入力言語を選択します 複数の言語が使えます
またキーボードを表示して― iOSデバイス同様 globeをクリック
キーボードと言えば― 新しいQuickPathもサポートされてます キーボードを開けば あとは― 入力するだけです
ヘルプメニューの情報もあります
入力すれば 検索機能が必要なものを示します
私からは以上です 新しい知識は得られたでしょうか? 次はラスが コマンドラインの説明をします ありがとうございました (拍手) ありがとう トレイシー ではコマンドラインから シミュレータを見ていきましょう
今日 一番 お話ししたいのは― xcrun simctl シムコントロールです 2番目に話したいのは― xcrun simctl helpです
simctlはヘルプが充実しています コマンドなしで実行すると 使えるコマンドを教えてくれます ヘルプの後にコマンドを実行すると― コマンドの詳細を教えてくれます
そこで今日は 役立つコマンドを紹介します その後 他の話を短くして実演します
最初のコマンドはリストコマンドです これはデバイスタイプやランタイムや デバイスを示します 短縮版です 本来はもっと長いはず まずデバイスタイプがあります 短縮名とIDですね 次にランタイムの短縮名とID そして自分のデバイス IDと現在の状況があります デバイスタイプやランタイムを 受け入れるコマンドの大半は― 短縮名で問題なく受け入れます タイピングの手間が少し省けますが 自動化や定型化を推奨します 短縮しないほうが 正確に進められます リストコマンドは いくつか違うカテゴリを受け入れます 1つはデバイスです だからここでは ランタイムやデバイスタイプは要らない デバイスだけ それを指定し― 検索文字列を与えます この場合はiPhone Xだけ見てます
JSONフラグもあります 自動化のため 機械で読めるJSONファイルを出力します
次はcreateコマンドです 今年はスタンドアロンの Watch Appのサポートがあります だからそのシミュレータが欲しい これをテストWatchと呼びます デバイスは 今回はSeries 4の44mmにします そしてwatchOS 6.0 出力はデバイスのIDになります
環境変数の把握と スクリプティングのためです この例では― “NEW DEVICE”を値にセット createしたデバイスのIDが エコーされます simctlコマンドの大半は UNIXの形式にならっています 成功なら0で終わり― 失敗なら0以外で終わります エラーは標準エラー出力され― デバイスIDやJSONなど実際の出力は 標準出力されます
次に話したいのはspawnコマンドです spawnコマンドは シミュレートする環境の中で― プロセスをpause xspawnします 何の意味があるのか? シミュレータで役立つユーティリティを 提供します
この場合は デフォルトユーティリティです ターゲットのデバイスを選びます 今回はエイリアスのbootedを使います 起動しているシミュレータは1つなので 指定は不要です “defaults write”と書きます そしてアプリケーションの バンドルID ResetDatabaseキーには“YES” アプリケーションのデフォルトを 変更するのに便利です
log streamも実行できます predicateを渡して― ログ出力をストリームする これがシミュレータでもできます ここではpredicateは― senderImagePath CONTAINS “nsurlsessiond”です URLセッションのデバッグがしたい
これでログストリーム出力が見られます simctlは私が使うターミナルを検知 色をサポートするものです その情報から ログストリームに色が付いていますね dataTaskWithRequestがあり allowsCellularAccessが1に 期待どおりなので満足です
次に紹介しておきたいコマンドは diagnoseです
とても便利なコマンドです ディスクにあるログだけでなく 一時的なログや― ダンプされたシステム状態も 集めてくれます 自動化されたシステムに有効です テストエラーか問題があれば― すぐsimctlで diagnoseを試してみてください バグをファイルするのにも有効です 自動化されたシナリオで― -lフラグで プライバシー警告をスキップします ただ実行前に読むことを推奨します Appleのポリシーも確認を 収集する情報の中に アカウント名などがあるかも
diagnoseで 生成したファイルが分かります デスクで使えば― Finderウィンドウが現れ ファイルを示します シミュレータの問題に関して フィードバックを送る際は― お願いがあります simctl diagnoseを添付してください かなり解決しやすくなります ワークフローで使うことも推奨します 例えばQAをしてて― エンジニアにアプリケーションの バグについて報告する時 diagnoseを添付しましょう アプリケーションのログ出力が すべて含まれます 次はlaunchコマンドを紹介します アプリケーションを起動する コマンドです これはspawnとどう違うのか? launchは“このバンドルIDの Appを起動して”と丁寧に頼みます アイコンをタップするのと同じです iOS watchOS tvOSで― プロセスが画面に 情報を表示できる唯一の方法です とても重要です インストール済みアプリケーションを 起動するには― launchコマンドが必要です
それではまた bootedのエイリアスを指定します
“com.apple.example”の アプリケーションを起動し― 引数をpassします ユーザデフォルトは― コマンドラインから引数として 設定したデフォルトより優先されます 頭にダッシュ そしてkey nameに値を指定します これで私のアプリケーションの 起動では― ディスクに何が保存されていようと “-MyDefaultKey”がYESに設定されます 他にも面白いことができます “―console-pty”を渡して― launchが私のアプリケーションの 標準入力や出力やエラーを― 作業中のターミナルに接続します だからアプリケーションを起動すると ターミナルで標準出力が見られます さらにデバッグ機能も連結できます この例では デバッグ状態をダンプします ターミナルでエンターを押すと― アプリケーションから デバッグ状態が示されます デバッグにかなり役立ちます 他にもcontrol + Cを押すと― 割り込み信号が送られます simctlはそれを探知し 信号をアプリケーションへと伝えます 割り込みだけでなく ユーザ信号にも適用されます ユーザ1 ユーザ2など デバッグ情報を含むようにする 方法の1つです
あとは時間がないので― いくつか簡単に コマンドの概要だけ紹介します “boot”はデバイスを起動します “shutdown”は デバイスをシャットダウンします ただ特別なエイリアスがあります “all”は実行中の全シミュレータが 停止します “delete”はデバイスを削除します ここでは“unavailable”が 便利なエイリアスです 全シミュレータを調べて― 利用できないランタイムを使うものを 見つけます 旧版のXcodeや― 削除したシミュレータランタイムなど すべて整理し ディスクスペースをリカバーします
次に“pair” “unpair”や “pair activate”もあります WatchとiPhoneのペアリングを 設定できます “addmedia”は トレイシーが見せたのと似てます 写真などのドラッグ&ドロップの コマンドです
“get app container”も便利です 例えばアプリケーションに 問題があった時 壊れたファイルを書くとか ロードすべきものがない時に このコマンドは ディスク上のデータコンテナ― あるいは 共有コンテナへのパスをくれます これによりFinderや ターミナルから内容を確認し― 問題を調べられます “install”も バンドルのドラッグ&ドロップ同様 アプリケーションを インストールできます ioコマンドも紹介しておきましょう サブコマンドがいくつかあり 最も重要なのは“screenshot”でしょう シミュレータで スクリーンショットを自動化します
そして最後に“clone”コマンドです
このコマンドは 自動化やテストや実験をする際― とても便利なものです まずアプリケーションの インストールなど― シミュレータを好きに構成します その後 停止し 好きなだけコピーを作成します コピーを動かして― 実験を行い 終われば捨てていい 時間とディスクスペースの節約に なります “clone”は APFSのクローン機能を活用してます ギガバイト分のアセットで 並行して複数のテストをしたい時― ディスクスペースを節約できます それでは実演をして見せましょう
さて
それではまず… 私が使用する― 比較のベースとなるシミュレータを 立ち上げます
では立ち上げます シミュレータアプリケーションを 開けているので 自動で接続します
次に私のアプリケーションを インストールします バンドルは用意してあります 先述のように インストールして起動します
このように インストールされ ホーム画面に現れました
次にシミュレータを シャットダウンします それからクローンを作ります
シャットダウンした後―
clone-1を作成します
もう一度 実行し― clone-2を作成します
そして 作ったクローン2つを起動します
2つとも起動しましたね ブート処理がないので― 立ち上がるのが早くなっています ベースのシミュレータで済ませてる 時間の節約になります
ここでデモや実験のため― いろいろと構成することができます そしてアプリケーションを 両シミュレータで起動します
このコードをご存じの方もいるでしょう MetalのDeferred Lightingデモです 以前は実行できませんでした macOS Catalina上の Xcode 11では新しいものです Metalについて説明するために― ケイトリンを呼びましょう ケイトリン (拍手) どうもありがとう ラス GPU Softwareチームの ケイトリン・ヒックスです 今日はシミュレータの Metalサポートについてお話しします ではMetalを 最大限に活用する方法の紹介を
macOS CatalinaのXcode 11では― シミュレータはMetalをサポートします それがアプリケーションに どう影響するか? 2つあります すべてのアプリケーションが シミュレータでGPU加速化されます そしてMetal APIが シミュレータで使えます
それではシミュレータが― どれくらい速いか見てみましょう いくつかアプリケーションを試します システムを通じて― アニメーションはより滑らかで ユーザエクスペリエンスも良好です
Appleフレームワークが Metalのレンダラに移行し― GPUを活用しているからです
あなたのアプリケーションが Metalを使っていない場合 UIや2Dや3Dグラフィックの Appleフレームワークでも― GPU加速化による パフォーマンス向上が得られます
アプリケーションに 変更を加えなくても― GPU加速化されます 条件はありません いくつか例を見せましょう
左側はソフトウェアレンダラで 実行中のデバイス そして右側は GPU加速化されたシミュレータです この単純な動作でも― 向上が分かります UIKitを使った TableViewのスクロールです
オリジナル版から― シミュレータのiOSデバイスの 解像度は17倍になっています そのため レンダラの負担は増えています SpriteKitのテンプレートだと― レンダラではパフォーマンスが 毎秒15フレームに落ちています 同じものを Xcode 11でレンダーしてみると 毎秒60フレームで より多くのノードがレンダーされます
より複雑な3D 例えば SceneKitを使ったFoxのデモでは― Appのソースに変更を加えず パフォーマンスが劇的に向上しています
複数のシミュレータデバイスを 並行してリアルタイムで― 動かすこともできます このBadgerのデモは ジオメトリとアニメーションが― 単独のソフトウェアレンダラには 重すぎました それが並行して動かせます
Metalを直接 使う人は― Metal開発が可能になり ワークロードが加速化されます シミュレータで アプリケーションを実行し― 違いを見てみましょう 以前はブラックスクリーンに でも今回は実行できます どのデバイスでも アプリケーションを動かせます
では より詳しく説明しましょう
我々は今年 Metalの Feature Query APIを改良し― GPU Family APIを発表しました GPU Familyは クロスプラットフォームのコード作成を GPU機能を 数層に抽象化することで簡略化します 3つのファミリーとは以下です 第1に“Common” クロスプラットフォームで 使えるGPU機能が含まれます 次に“macOS” macOS GPUハードウェア特有の機能が 含まれます 3つ目が“Apple” iOSやtvOS GPUハードウェア特有の 機能が含まれます シミュレータでアプリケーションを 実行する際― MTLGPUFamilyApple2の機能が 使えます MTLGPUFamilyCommon1に 含まれる機能もです このサポートは どのシミュレータデバイスにも共通です
ではiOSアプリケーションを シミュレータで実行してみましょう 以前なら― OpenGL ESのソフトウェアレンダラで レンダーされました GPU加速化はありませんでした でも今回 macOS CatalinaのXcode 11では― Metal APIが シミュレータで使えるようになります そしてどのAppleフレームワークも Metalを使います しかもすべて― GPU加速化されます つまりUIや2Dや3Dグラフィックの iOS Appのコマンドがすべて― iOS MetalからmacOS Metalに 翻訳されるということです この翻訳により― Mac GPUを活用できます ただ いくつか注意点があります その1つは パフォーマンスが実際と違う可能性です グラフィックは あなたのMac GPUのパフォーマンスです シミュレータは 実際のiOS GPUとは違います Mac Pro上で シミュレータでiPhone 6Sを動かせば 実際のデバイスとは違った パフォーマンスが示されるわけです 必ず出荷前に デバイス上で直接 最適化するのを― 忘れないようにしてください
もう1つ注意すべきは― macOSとiOSでは 異なるストレージモードがある点です iOSでは“Private” “Shared” “Memoryless”の3つですが macOSでは “Private”と“Managed”の2つです macOSでは サポートされていない2つでも― シミュレータではサポートされています 特殊なSharedのケースもありますが まずShared Storageを説明しましょう
“Shared”Storageモードで iOSテクスチャを作成すると― テクスチャは CPUとGPUの両方で変更できます もしアプリケーションが テクスチャをCPUで初期化して― レンダーかエンコーダーにバインドし GPUで読ませたい時 直接 GPUでテクスチャを変更し― コマンドバッファが完了した後 CPUで読ませられます メモリの同期は必要ありません iOSでは統一メモリだからです
シミュレータの場合 MultisampledとDepth Stencilと Linearのテクスチャは― Private Storageで 作成されなければなりません でもiOSデバイスでは Shared Storageかもしれません もしCPUアクセスが必要なら― シミュレータ限定のパスが要るかも 大半の人は テクスチャタイプを初期化し― 直接 GPUコマンドで使うでしょう だからアプリケーションに影響しない 元からPrivateテクスチャです でもCPUアクセスが必要な場合に― 必要な変更を見てみましょう Privateメモリで テクスチャを作成すれば― CPUアクセスはできません GPUでしか 変更も読み取りもできません アプリケーションがCPUで テクスチャを読み書きするなら― 中間のSharedリソースが必要です まずSharedバッファかテクスチャを 作成します それをコピーするため “BlitCommandEncoder”を作成します そうすればSharedバッファから Privateテクスチャにコピーするか― その逆ができます ソースコードを見てみましょう この例の場合― Depth Stencilのテクスチャが 作成され CPUで初期化します
そこでまず シミュレータでのみ Storageモードを“private”に シミュレート環境では “shared”のStorageモードを使いたい
次にテクスチャを textureDescriptorで作成します
そしてシミュレート環境では― privateテクスチャを初期化するため sharedバッファを作成します それをprivateテクスチャで見たい データと一緒にCPUで初期化します 最後にそのsharedリソースから privateテクスチャに転送します 実際のiOSデバイスで実行する場合 先ほどと同じことをして― CPUでテクスチャを初期化し 不必要な転送を回避します
ここからは 実際のデバイスでもシミュレータでも テクスチャの使い方は同じです GPUのコマンドは同じでいい というわけで いくつか変更が必要かもしれませんが 変更に関する詳しい文書があります 例を見られるように― サンプルコードも用意しています
新しい知識は得られたでしょうか? 最初にiOS watchOS tvOSのユーザ空間が― カーネルで実行されること そしてAppをテストするのに シミュレータが極めて重要であること xcrun simctlの機能と― テストをコマンドラインで行う方法 そして最後に Metalにより GPU加速化が実現し― Metal開発が可能になること 質問があれば セッションのサイトを訪れてください それでは よい1週間を (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。