ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
不利なネットワークと温度条件に向けて設計する
ワールドクラスのAppは、最も過酷な環境でも優れたユーザー体験を提供するものです。このセッションでは、Xcodeを使用して不利なネットワークと温度条件をシミュレーションする方法について説明します。Appの性能を試し、実際にパフォーマンスを確認してみましょう。厳しい条件に対応するために導入できるベストプラクティスについてご確認ください。
リソース
- Xcode Help: Override environment system settings in the debugger
- Xcode Help: Test under adverse device conditions
- プレゼンテーションスライド(PDF)
関連ビデオ
WWDC23
WWDC19
-
ダウンロード
(音楽)
(拍手) こんばんは (拍手) “Designing for Adverse Network and Temperature Conditions”へようこそ アプリケーション開発の初心者も ベテランも― 世界に通用する設計を 目指してください アプリケーションが使われる環境は さまざまです ユーザの多くは 4Gネットワークもありません 気温の高い地域もあります 設計後にテストする時― ユーザが使う環境で どう動くか試していますか? 最高の体験を提供していますか? いいアプリケーションは 過酷な環境でも使えます ただ設計が大変です 今日はXcodeの新しいツールと ヒントを教えます 僕はアレックス・カーラ 僕はイリヤ・ベイグマン iOSのシステムを― 問題なく機能させることが仕事です iOSは環境に反応します アプリケーションも同様にし 設計したとおりに機能させましょう 今日ご紹介するのは― まずユーザが使う環境に合わせて 設計する時の留意点です 次に デベロッパ用の ツールを使った― さまざまなネットワークへの 対処法を教えます 最後に 温熱条件に合わせて アプリケーションを最適化する手法です
iOSを使う状況を思い浮かべてください 家や会社だけではないですよね どこでも使います ビーチや公園 地下鉄や車の中かもしれません 気温が高いか ネットワーク接続が悪そうです ユーザは― こういう場で アプリケーションを使います それを頭に入れて テストすることが重要です
開発やテストを行う時 オフィスかラボでしますよね インターネット接続や気温が 完璧な状態です 仕事をするには最高ですが― 実際にアプリケーションが 使われる環境ではありません このズレが “特殊な事例”と片づけていた― ユーザの不満の原因かも そしてデバイスはマルチタスクです ユーザは助手席に座り― ナビを使いながらCarPlayも使います また iPhoneを充電しつつ テザリングもします アプリケーションでの 複雑な処理中に― ARKitでオブジェクトの認識もします
こうした状況で― デバイスには負荷がかかり熱くなります 隔離環境で アプリケーションのテストをする時― 一般的な実生活でのパフォーマンスの ことを考えていますか? ユーザが困るのは― 完璧な環境でのみ動く アプリケーションです 使えませんよね?
特定の環境で動作が重くなるという レビューが散見されます たまに期待を裏切るわけです 電車内や暑い場所 または車での旅行中などです 残念な経験を覚えていて― 二度と使おうと思わないかもしれません ユーザは直射日光の下でも― トンネルでも同じように使おうとします ネットワークの状況もさまざまです 最適な環境で開発すると 実際の環境を忘れがちです ユーザの状況を考慮して アプリケーションの動作を― 安定させましょう ユーザが3Gで接続していたり― デバイスが熱くなることも あるかもしれません 向き合いたくないでしょうが 稀なケースではありません こうしたことは実際に起こります 対処するためには 適切なデベロッパ向けツールと― プロセスが必要です まずはネットワークを整えます
アプリケーションで ネットワークを使う場合― お使いのネットワークに合わせて 設計したかもしれません 呼び出しが長ければタイムアウトとか ただ3Gネットワークの ユーザの場合― 時間がかかっても ダウンロードしたいかもしれません でもタイムアウトになっては ユーザの意に反し― ダウンロードを完了できません こうした選択が ユーザ体験を決めるのです
ユーザは延々と回り続けたり 完全に止まったりする― 進捗インジケータを 見たくありません 起動時にネットワークを呼び出すと 起こる事態ですが― LTEやWi-Fi接続でテストをすると 問題になりません 一方 ユーザは 使用を諦める可能性があります 他に使える選択肢があれば なおさらです ネットワーク接続がなくても 起動可能にしましょう
タイムアウトが早い アプリケーションだと― ネットワークが遅い時 データの読み込みができません 同じ状況で 他のアプリケーションが動く場合― フリーズかバグだと思わざるを得ません ネットワークの呼び出しを― テストしていなければ 気づけない問題です XcodeのScheme Editorで― 環境変数を設定してあるか見てください 起動時の余計な処理を防ぐため― ユニットテストでこの変数を 使用しているかもしれません 処理の最速化のため バックグラウンドでの要求は― テストでは スキップしても構いません でも どこかでチェックしましょう
didFinishLaunchingメソッドが 返ってから― テストを開始できます 環境変数を使うなら― スキップするコードが 本当に必要ないか確認します ネットワークの呼び出しを スキップするなら― 別途 現実的なネットワーク環境で 確認します そのために 理想のテストモデルを知るべきです
“Testing in Xcode”の セッションで― テストスイートの組み立てを ピラミッド形で考える方法を学びました テストモデルでは 完璧さ 質 速度のバランスが重要で― ユニットテストも多数必要です この時は処理を最速化しても良く― 各機能を独立させたいので クリーンルーム環境でも大丈夫です 機能のリグレッションも探せます 個々のクラスを対象にした 結合テストが― ユニットテストを補います 結合テストでは サブシステムが働くか ユーザ目線で確認します 実生活により近い条件下での テストなので― バリアンスは上がるでしょう 障害の原因を探り優先順位をつけます “結果が信用できない”で 片づけないことです
そしてテストスイートの最後は UIテストです ユーザに近い使い方でテストできます これでアプリケーションの 動作を検証でき― ネットワークなどとの 反応も確認できます 皆さんも このテストを しているでしょう しかし このテストでは バリアンスも高くなります その結果ユニットテストに 集中したくなって― “動作に問題なし”と 誤った安心感を抱きます このテストモデルで コードベースの働きが― はっきり見て取れるはずです テストカバレッジが適切 ということですが― テストしていなかった箇所にも 注意を払ってください クリーンルーム環境で ユニットテストをして― リグレッションを見つけます でも それでは 実際の使い勝手は向上しません
いい結果を得られる クリーンルーム環境のテストは楽です バリアンスが低く安定しており― 不安定なテストも減ります でも目指すのは 実生活で機能することで― それに適した デベロッパ向けツールが必要です 現実に即すると バリアンスが付き物なので― 稀なケースに対処する時と同様に 目を配りましょう ピラミッド形のモデルを ワークフローに当てはめて― 自分に適した 品質チェックの箇所を決めます マージ前のユニットテストで リグレッションを見つけるなどです 結合テストやUIテストは 初期のチェックには向きません 実際の環境でバリアンスが出るからです 初期以外で必ず実施しましょう 適切なタイミングでテストして 特徴がつかめれば― 改善すべき部分を見つけられます 対処できる環境が整ったので― 先ほどスキップした ネットワークに戻りましょう
今でも対策はあります インフラを整える特注のルータは うまくいけば最適な環境ができます ただ 新人デベロッパには 難しいですよね テストモデルを使い 優先順位に注意を払っても― 依然 優れたツールは必要です macOS用にしたいなら― Network Link Conditionerを使います 3GやEDGEなど― 遅いネットワークでの動作を 確認できます
開発用のデバイスで iOSのデベロッパ設定から― 使用可能です そして悪条件と 一般的なネットワークを切り替え― 条件に適した アプリケーションを設計します これなら 複数のネットワーク環境で テストができますね 特定の条件に合わせて プリセットも作れ― 帯域幅やパケットロス そして遅延も設定できます 特定の条件下での動作が 確認できるのです Xcode 11でも さまざまな環境を再現でき― Devices and Simulatorsから 簡単に 確実に始められます 実用的な設計が可能です
ウインドウの下部にある Device Conditionsから― デバイスをより一般的な状態にできます ネットワークは種類だけでなく― 接続の強さを変えることもできます
つまり さまざまな環境で アプリケーションを試せます 2G EDGE 3G LTE Wi-Fiなどです “いい”EDGEとか“普通の”3Gなどが 選べます 実際に使われる接続で アプリケーションの状態を見ましょう そして役立ててください 試したい環境を選んだら Startをクリックします システム全体に影響するので― アプリケーションも含め すべての反応が変わります
アクティブにすると グレーのインジケータが現れます
システム全体に影響するとはいえ― UIインジケータは変わりません また 設定した状態が 上限となるだけで― ネットワークのパフォーマンスが 現実を超えて高まったりはしません
グレーのアイコンをタップすると― プロンプトに状況が表示され 停止もできます Xcodeから切断されると 自動的に停止します
Network Link Conditionerを 改良に役立てる方法を― イリヤがご紹介します (拍手) ネットワークが悪いと パフォーマンスも落ちます でも必要以上に 悪化していないでしょうか? 悪条件でも改善できる余地は ないでしょうか?
例を見せましょう まず 理想的な状態で 基準となる動作を見ます デモ用のエンドポイントへの接続に かかる時間を見ましょう 平均的に接続には150ミリ秒かかります ログインやストリーミングと 同程度の処理です 良好です ラボでUIテストをすると 問題なく順調に動きます
Network Link Conditionerを 使ってみましょう
“普通”の3Gを例にとります どうなるでしょう
さっきと同じようにしても― 平均で750ミリ秒以上かかっています LTEやWi-Fiと比べ3Gは遅いので 驚く結果ではありません でもユーザの多くは この環境で アプリケーションを使うのです どう改良できるでしょうか?
Run Probeボタンの上に スイッチが2つあります Optimistic DNSとTLS 1.3です オンにしてみます
こうしてテストすると 33%も接続が速くなりました
Network Link Conditionerを使って テストしただけで― 3Gだとパフォーマンスが落ちることが 分かりました Wi-FiやLTEと比べてです この新しい機能を使えば― ユーザの環境に合った状態に 改良できます
Network Link Conditionerを使うと 理想より悪い結果も― 見ることがあります これを改善する方法があります まずタイムアウトの設定です 時間がかかっても タイムアウトにはしません 3Gを使うユーザは 時間がかかるのを苦にしませんが― 勝手なタイムアウトは嫌います 次にHTTP/2を使ってください 到達可能かはチェックせず あらゆるネットワークを試し― アプリケーションが 問題なく使えるようにしましょう 去年のWWDCのセッションも 参考にしてください 今年の“Advances in Networking”も
現実的なネットワークで アプリケーションはどう動くでしょうか Network Link Conditionerで 動作を確認したら― 改善の必要があるか 考えてください 最低でも3Gで試して 改良すべき点を探します ネットワークの種類と接続の強さも 変えてみてください 結合テストやUIテストに組み込めば 動作に不安がなくなります
次は温度の変化についてお話しします 天気がいいと外でデバイスを使います カフェでワイヤレス充電しつつ テザリングします こんな時 デバイスが熱くなるのは普通です iOSデバイスは温熱条件によって― 動作やパフォーマンスが変化します
温度はデバイスにかかる負荷でも 変わりますし― 日光などの環境にも左右されます 他の要因も これは普通のことです 影響を調整するため iOSのサブシステムが反応するのです アプリケーションも― 温度変化に 対応させる必要があります
長時間 暑い車内に放置されるなど 行き過ぎた状況では― 温度警告が出されます アプリケーションは使えません ユーザが緊急通話をする時のために 機能を確保するのが目的です 電池に影響するエネルギー消費を システムが抑えています アプリケーションも エネルギー消費を考慮すべきです 温熱条件に応じて 動作を変えることができます
バックグラウンドの動きを オフにして― エネルギー消費を抑えることができます thermalStateDidChangeNotificationに 登録して― 温熱条件を確認してください デバイスが熱くなった時のことを 考えましょう システムは熱の上昇に反応します アプリケーションも反応すべきなのです 高温でも いい体験を保つためです
ありがちな温熱条件を見ましょう Nominalならデバイスも普通の温度です 調整は必要ありません
Fairでは 省エネ対策を始めるといいでしょう これ以上 温度を上げないためです この段階になったら― iOSは任意のバックグラウンド機能を 停止します
Seriousになると システムが影響を受けます さらなる省エネが必要です CPUやグラフィックスなどの 使用を抑えます 視覚効果の質を落としましょう
システムはARKitやFaceTimeの フレームレートを下げて― 負荷を減らします iCloudからデータを復元中なら― デバイスが冷えるまで 停止状態になります Criticalの段階では 周辺機器の使用を停止します アプリケーションの 電池消耗が他より激しければ― 削除される可能性も アプリケーションも 温度変化に対応すべきです 電池消費を抑えつつ いい体験を提供するのです
温熱条件に対する推奨例は ドキュメントを見てください
イリヤが例を挙げて 方法をお見せします
3Dインタラクションと UIコントロールを行う― ARKitのサンプルアプリケーションを 例に説明します 散歩中の画像で バックグラウンド処理も行われています Nominalな状態です 赤い四角が地面を見つけ出して― イスとランプを置き 読書の準備ができました
カメラもスムーズに動いており― 設計どおりの動作が行われています
長時間 外にいた後の 同じアプリケーションです 暖かい日でデバイスも熱くなっています まず気づくのは フレームレートの低下です そして まっすぐ地面を 映しているのに― 地面を認識しません ユーザはイライラするでしょう どう対処しますか? ProcessInfo.theremalStateDidChange Notificationに登録します 変動の通知が届いたら― 温熱条件を見て適切に対応します 状況によって 機能を有効化 または無効化し― 機能性と重要なメトリックを維持します
これは登録方法と 温熱条件の読み込みの例です
こちらは 対処法です NominalとFairなら全機能が有効です フェイストラッキングや モーションブラーもオンです
Seriousになると モーションブラーのみオンで
Criticalでは全部オフです
温熱条件に対応させた後の様子を 先ほどと同じ環境で見てみます
赤い四角は地面を見つけました イスとランプも置けて読書ができます
温熱条件に合わせた設計は 大事なので― 想定どおりにいくか知りたいですよね あらかじめ さまざまな温熱条件で テストしておくと うまくいきます 防御策を試してみるのです では どうやって試すのでしょう?
ありがとう 熱探知カメラがあれば 楽なのですが… ネットワークの時と同じで 動作の検証は困難です 既存のアプローチは バリアンスが高いものでした お勧めできないメソッドも存在します 偽のCPUを起動し デバイスを熱くして― アプリケーションの状態を見るのです そこで役立つツールを作りました デバイスの温熱条件を 確実に変えながら― 実際は熱くなることなく 安全に使えます Xcode 11の中の機能です Devices and Simulatorsウインドウから 設定します 実際の温度は変えず 異なる温熱条件に変更できます 素早く簡単に デバイスをFairの状態にでき― 省エネ対策のテストが行えます Seriousなら リソースの使用の制限を― Criticalなら 周辺機器の使用の停止を確認します この機能なら設定した温熱条件下での 動作を見られますが― 使う前に 知っておいてほしいことがあります イリヤ ありがとう
もう少し踏み込んだ話をしましょう このグラフで示されているのは― デバイスの本当の温熱条件と 設定した温熱条件 そして 実際のデバイスの熱さです 室温で 条件を設定しておらず しばらく使っていなかった場合― 温熱条件はNominalです
Seriousに設定すると― デバイスの温熱条件が上がりました まずFairになりSeriousに達します 数秒間のことです thermalStateDidChangeNotificationに 登録していれば― FairとSeriousで通知が来ます 大切なことが2つあります まず デバイスが実際に熱くなることは ありません 次に温熱条件を整える機能はなく 下限を示します 説明しましょう 画面のような状況とします 負荷をかけたか 日光を受けたような状態です
デバイスは触ると熱くなっています すると 温熱条件も SeriousからCriticalに達します
これは過酷なテストをしても システムを安全に保つ予防策です デバイスの温度が下がると―
温熱条件はSeriousに戻ります 設定を解除すると―
Fairまで下がりNominalになります こうした状況ごとに通知を受け取れます
Xcode 11では Debug Navigatorで確認できます
Energy Impact欄の下部に ゲージが2本あります 下のゲージは実際のデバイスの 温熱条件です 設定された条件に反応して 変化しているのが分かります 上昇と下降に10秒ずつかかりました
上のゲージは設定された温熱条件です
Xcodeでのデバッグや最適化と ツールについて― ジェイがお話しします (拍手)
Core OS Energy Technologies Teamのジェイです 過酷な温熱条件での動作と その対処法をお話しします デモには SceneKitの サンプルアプリケーションである― Fox 2を使います 温熱条件の設定はオフのまま アプリケーションを使います 実際に見てみましょう
このような見た目です 左下を見てください これはfpsで常に30以上になっています
詳細に見てみましょう 口径食があり 映画のようですね
ディテールごとに見てみます 右側の緑の宝石を見ると― 上に光源があり影ができています 動いている物からも光が出ているし 影も見えますね 溶岩からは― 煙まで出ていて 背景とも うまくなじんでいます 火の粉も飛んでいます
いいユーザ体験です 好まれる例ですよね 性能テストであれば すべて合格です
温熱条件を変えたら どうでしょう
温熱条件を Seriousにしたらどうなるか― 見てみます
切り替えますよ
画面の左下を見てください fpsは17 パフォーマンスは 半分に落ちました 画面上部で動く物も 動く台座のような物も― 動き方が 前ほど滑らかではありません
元に戻るでしょうか? 温度変化に対応するよう修正しました 温熱条件が変わると― それに反応して 使用する機能を減らします
上のほうに 小さなデバッグUIがあるので― これでStaticからDynamicに 切り替えます
下を見るとfpsは 30近くまで回復しました
画面はディテールが減って― 煙は出ていません 火の粉も少し減りましたが― アプリケーションの反応は文句なしです 成功です
必要なコードを見ていきましょう
NominalやFairなら対応は不要で― すべての機能が有効です HDRや被写界深度 ソフトシャドウなどが使えます
Seriousになったら変更です HDRを停止し ブロブシャドウに変えました ポストプロセッシングも下げます
Criticalでさらに変更し― できる限り多くの機能を停止します 被写界深度 シャドウ ポストプロセッシングをオフに こうすれば アプリケーションは常に反応します
温度対策に使うツールを見てみましょう
Instrumentsのスタックです 温熱条件はSeriousで 最適化ありと なしの場合です
fpsを見ます 同じフレームの表示時間を 示しています デコードします あるフレームの表示中 GPUは次をレンダリングし― CPUがその次のインストラクションを 準備します
そんな時―
最適化なしでは 表示が間に合いません 同じフレームが映り続けます こうしてラグが生じるのです 最適化すると フレームは等間隔になります XcodeのEnergyのゲージも 使いましょう エネルギー消費の平均値に注目します 消費量が多いと電池の減りが早くなり 温度も上がります 最適化なしだと エネルギーを多く消費します 最適化すれば消費量が減るので デバイスの温度の上昇に 加担しないのです
では今日のおさらいを (拍手)
ありがとう
Xcodeでのデバッグや 他の機能を学んで― 現実的な背景を踏まえた 開発をしたいですか? このセッションをご覧ください
実際にアプリケーションが 使われる環境は― 3Gや高温かも という話をしました そういう中でも最高の体験を 提供すべきですよね 一般的に開発やテストをする時 クリーンルーム環境にしがちです 不確実さやバリアンスを避けるためです Xcode 11の新しい機能で― 過酷なネットワークや温熱条件での テストが簡単にできます デバイスを温めるための ムダなテストは不要です つまり自分が設計したコードや 生み出したパフォーマンスが― そのまま実際のユーザに届くのです ピラミッド形のモデルで テストスイートを作りましょう 現実的な環境をテストに使い 結果を見極めてください
本当に不必要なコードのみ スキップします やるべきことも あります Network Link Conditionerを使い 動作を確認してください テストして ひどい動作を見つけましょう 最低でも 3Gで接続の強さを変えて テストしてください Seriousな温熱条件でもテストします Network Link Conditionerを 役立ててください デベロッパサポートやXcodeラボにも 来てくださいね 本セッションのリンクもあります WWDCを楽しんでください (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。