うぃまの旅日誌

公開

長期メンテ後実施した内容 (iOS) その2




( 前回の続きです )


[ 設定→Safari→詳細→「Experimental Features」(タブレットの場合、「機能フラグ」でした。)の順に選び、各項目を設定する。]
これは実験的に端末の中に組み込まれている本体設定なんですが、ブラウザと紐付いているため、キャラストのデータを重くしていた設定ともいえます。
できるだけ文字や画像、通信に関係していて処理が軽くなりそうなものを選びました。
(※本体設定なので、変更すると他のアプリにも影響が出てしまうかもしれません。ご注意ください。端末によって多少項目が違います。)


〈 ONにしたもの 〉
(圧縮機能)
・「Compression Stream API」  [通信データ圧縮]
・「Web Codecs〜」  [動画圧縮・復元]
・「WebRTC〜codec」  [映像圧縮]

(整理機能)
・「CSS Nesting」  [入れ子]
・「CSS Cascade Layers」  [入れ子・優先づけ]
・「CSS subgrid support」  [入れ子]
・「Defer async scripts〜」  [遅延読み込み?]
・「Lazy 〜loading」  [遅延読み込み]
・「Link preload responsive images」  [先行読み込み]
・「Link Prefetch 」  [事前接続]

(補助機能)
・「Deprication Reporting」  [エラー検出]
・「〜Shadow DOM」  [カプセル化]
・「SharedWorker」  [サーバー負荷軽減]
・「Web Locks  API」  [ロックの要求・保持]

(手続き機能)
・「Async clipboard API」  [切り取り・コピー・貼り付け]
・「File System Access API」  [ファイルの読み取り・書き込み]
・「Synthetic Editing Commands」  [合成モニタリング?]

(レンダリング機能)
・「CSS containment」  [レンダリング効率化]
・「Paint timing」  [タイミング計測]
・「Prefer Page Rendering Updates near 60fps」  [画像を1秒間に60枚ぐらい表示]

(削除機能)
・「Clear-Site-Data HTTP Header」  [Cookieなど消去]

OFFにすると却って処理が重くなるのかなと感じたものもONにしました。(調べた上で効果が分からない項目も多かったため、あえて伏せておきます。)


〈 OFFにしたもの 〉
(レンダリング機能)
・「GPU Process〜」  [高速レンダリング]
※タブレットの方は「GPU process: DOM Rendering」を切るとwebページが真っ白になってしまったのでONにしました。

(分析機能)
・「User Activation」  [入力データの取得]

(読み込み機能)
・「Screen Wake  Lock API」  [スリープ解除]

その他、「Block top-level redirects〜」のようなプライバシーの保護に関係するもの以外は一通りOFFにしました。



設定を変更するとキャラストのストレージが増減していたので、ゲーム内でキャッシュデータ削除を行いました。(始める時は随時ダウンロードを選んでます。) 本体設定ということで、変更終了後は念のため端末を再起動させました。
ONにした機能を私のイメージになりますが、まとめるとこのようになりました。

①ブラウザの設定で小さくした文字や画像のデータを(圧縮機能)でさらに小さくする。
   ↓
②(整理機能)を使い、データを分割して読み込みやすくする。
   ↓
③(補助機能)で処理の重さを減らしながら、キャラストに転送する。→すぐに使わないものを(手続き機能)によける。
   ↓
④(レンダリング機能)を使って高速でゲーム画面に描写する。
   ↓
⑤最後に、(削除機能)で使用したデータをすぐに除去する。



【特に効果があった項目】
・「GPU Process〜」  [高速レンダリング]
調べてみたところ、CPUの上位互換のような存在でした。複雑な処理は苦手なものの、高速で描写することができます。その反面、消費電力も大きいです。試しにOFFにすると端末の発熱の仕方がかなり減りました。

・「User Activation」  [入力データの取得]
前回、通信に関わるデータはキャラストのデータと競合してしまうといった仮説を立てました。これもユーザーさんの操作した情報を集める機能なのでOFFにしてみたところ、今まで取れなかった端末のレンズ周りの発熱が減りました。同じ理由で「NSURLSession WebSocket」、「Server Timing」、「WebRTC〜Transform API」」などもOFFにしています。

・「Clear-Site-Data HTTP Header」  [Cookieなど消去]
ブラウザ上のCookie(ここではキャラストのデータ)やストレージ、キャッシュデータを消して処理を軽くすることができます。この機能をONにしたおかげで、長時間端末を使用しても発熱が目立たなくなりました。

・「Screen Wake  Lock API」  [スリープ解除]
これはデータの読み込みを続けるために端末がスリープするのを防ぐ機能みたいです。ただ、「閉じている全てのアプリを動作状態にする」といった効果もあったので、CPUの負荷が大きいと思いOFFにしました。

・「Prefer Page Rendering Updates near 60fps」  [画像を1秒間に60枚ぐらい表示]
調べても正確には分からなかったのですが、フレームレートを60fpsまで引き上げてくれるものだと思います。他の設定を切ってからONに戻した瞬間、端末の発熱が一気に飛んでいきました。処理落ちの頻度も減ったように感じました。このゲームの3Dグラフィックを動かすには、高いフレームレートが要求されてたのかなと思います。




【仮説】
実は、画面が大きくなるほど解像度(画質を決定する要素)が下がり、描写に必要なデータ量が少なくなります。その結果、1秒間に表示できる画像の枚数が増え、フレームレートが上がるそうです。(※テレビに近づいてみると粗いドットみたいなものが見えるイメージです。)
今回の騒動でPC版の被害が少なかったのもこれが理由ではないかと私は考えました。同じ画像を読み込むにしても、スマホやタブレットでは画面が小さくなる分データ量が増えてしまい、処理に時間がかかっていたのだと思います。
バグが発生する過程をまとめると、このような流れだと私は思いました。


「フレームレートが低い端末を使う」
  ↓
「データの処理に時間がかかる」
  ↓
「例の[ ゲーム内画像ファイルに発生した問題 ]を読み込んだ際に、さらに遅延が生じる」
  ↓
「処理が追いつかなくなりデータがパンクする」
  ↓
「フリーズする、もしくは通信が切断される」




( その3に続きます )




うぃま

コメント