クライアント クリーンアップ:2021年の取り組み振り返り&これから
LoLクライアントの動作改善と信頼性向上を目指す取り組みの定期進捗報告です。
こちらの記事は同シリーズの第7回となります(第1回、第2回、第3回、第4回、第5回、第6回も併せてご参照ください)。
要約:2021年の第一四半期はChromium Embedded Framework(CEF)のアップグレード準備を進めてきました。作業はまだ完了していませんが、新バージョンへの移行は第二四半期末までに実施する予定です。プレイヤーの皆さんのゲーム体験を様々な面で改善するものになりますのでもうしばらくお待ちください。
Chromium Embedded Framework(CEF)のアップデート
前回から繰り返しになりますが、クライアントのChromium
Embedded
Framework(略称CEF、LoLクライアントアーキテクチャの中核を担うWebブラウザ)のアップデート作業は本プロジェクトの重要課題のひとつに位置付けられています。しかし、前回の記事ではその重要性を十分にお伝えできなかったので、今回はより直接的な表現を用いてみようと思います。CEFのアップデートは、クライアント改善に向けて単体で取れる施策としては最大のもので、これには直接的な改善につながる以外にも他の施策を可能にする下地を作り出す効能もあります。
前回CEFをアップデートしたのは2019年11月(バージョン74)で、執筆時点での最新バージョンはCEF
90となっています。CEFをアップデートする(現在はCEF
90導入を目指しています)メリットには以下のようなものがあります。
-
クライアントのクラッシュ頻度低減
- 古いCEFバージョンは一部のハードウェアと相性が悪いことが判明しています。クラッシュが起きる理由の大半はCEFのバージョンが古いことに起因しているというデータも揃ってきているため、アップグレードを実施することでクラッシュ頻度をかなり低減できると確信しています。
-
互換性の改善
- CEFチームは新バージョンを様々なハードウェアの組み合わせで徹底にテストしています。これはつまり、LoLクライアントに組み込むCEFはその時点で既にテスト済みである、ということです。
-
WebSocketパフォーマンスの高速化
-
LoLクライアントは、おおまかに言えばプレイヤーの皆さんが実際に操作する「フロントエンド」部分と、ずっと小さな規模の「基礎」部分という2層で構成されています。「基礎」部分の役目はバックグラウンドで処理を走らせたり、データをサーバーから取得したり、クライアントが適切なコンテンツを表示するために必要な情報を管理したりすることです。具体的には、以下のような処理を行っています。
- 「プレイヤーが設定メニューで"ゲーム中にクライアントを閉じる"オプションを有効化した上で試合を始めた時、試合終了までフロントエンドを終了しておく」
- 「プレイヤーが"コレクション"タブを開いた時、所有チャンピオンを特定する」
-
WebSocketとは基本的にフロントエンドと基礎をつなぐパイプのような役割を果たします。そしてパイプの幅が広く、ねじれが少ないほどデータの移動は速くなります。この例でいえば、新バージョンのCEFはこれまでよりも幅広くねじれの少ないパイプにあたります。特に古いハードウェアを使用しているユーザーにとっては、大量のデータが転送される処理(試合終了時、チャンピオン選択)のパフォーマンスが改善されます。CEFの新旧バージョン比較結果シミュレーションでは最大で以下のような差が生じることが判明しています。
- Windows版の処理速度:4.1倍
- Mac版の処理速度:7.8倍
-
LoLクライアントは、おおまかに言えばプレイヤーの皆さんが実際に操作する「フロントエンド」部分と、ずっと小さな規模の「基礎」部分という2層で構成されています。「基礎」部分の役目はバックグラウンドで処理を走らせたり、データをサーバーから取得したり、クライアントが適切なコンテンツを表示するために必要な情報を管理したりすることです。具体的には、以下のような処理を行っています。
-
アニメーション処理の改善
- アップデートの恩恵はデータに応じてプロシージャルに生成されるアニメーション(頻繁に表示される試合終了時画面のXP獲得アニメーションなど)で特に顕著になります。先述のアニメーションは厳密にいえばメモリーリークの一種であるため、セッション時間が長い場合のクライアント挙動も総合的に向上することになります。
- FPSの改善:処理の「もたつき感」解消、クリックの応答速度向上
-
開発チームが作業しやすくなる(クライアントの高速・安定化につながる)
- メモリーリークの予防手段増加
- 各種コンテンツがクライアント内で実際に描画されるまでの時間が確認できる新しい指標の設定
-
CPUの使い方改善
- LoLクライアントが現在使用しているCEFバージョン(74)はNetwork Serviceと呼ばれる機能が初めて導入されたバージョンでした。この機能はすべてのネットワークリクエストをCPUの単一スレッドで制御し、他のスレッドをコンテンツの読み込みなど別の処理に使用するというものです。しかし前回のアップデート当時はまだ出たばかりの機能で、採用するために必要な試験時間を設けることができなかったため、この機能の採用は見送られています。次回のアップデート時にはLoLクライアントでもこの機能の対応に着手していきます。
-
Javascript処理性能の向上
- 新バージョンのChromiumではjavascript制御を担うv8 engineに大幅な改善が入っています。ハードウェア互換性と同様、こちらもCEFをアップグレードするだけで改善が見込まれます。
今年の第一四半期、私たちは既存のWebコンポーネント(動画埋め込み、ポップアップ通知など)とCEFの新バージョンの互換性を確保する作業に注力し、アップグレード時に不具合が生じないよう準備を進めてきました。コンポーネントのアップグレードはシームレスに実施することを目指してきたので、過去数パッチのあいだに導入した変更が皆さんにご不便をかけていないことを願っています。この作業では大量のコードを変更しているため、テストをすり抜ける問題が出てくることも想定していますが、そちらも見つけ次第対応していきます。
各種コンポーネントのアップグレード準備は数週間以内に完了し、その後はCEF本体のアップデートに入ります。こちらは2021年7月末までに実施予定です。
ソーシャルパネル
前回の投稿では、CEFの他に「ソーシャルパネル」についても取り上げました。こちらはComponentsJS(古いアーキテクチャ)からEmberへ移行することを長期目標としていますが、現在はCEFのアップデート間近ということもあり作業を一旦止めています。すでに移行に必要な準備はいくつか完了しており、残りはCEFのアップデートが終わり次第再開する予定です。
CEFのアップグレード準備に取り掛かる前に終わらせたソーシャルパネル関連の修正は以下の通りです。
- ソーシャルパネルが未接続になる
- フレンドリストが読み込まれない、表示されるステータスが正しくない、フレンドが表示されない
- フレンドがノーマル戦をプレイしているとホバーカードにランク戦の情報が表示されなくなる
- 起動直後にフレンドパネルの表示が未接続、ポロの悲しい顔、フレンドリスト読込中の間で高速に切り替わる
メモリー使用量とJavascriptエラーの進捗
チームは1セッション中に使用されるメモリー使用量についても調査を続けてきました。こちらはパッチ10.25と比較して1試合あたり30
MBの削減を達成しており、今後もメモリー不足が原因で生じるクラッシュの頻度低減を目指していきます。
最後の話題はJavascriptエラーです。まず、前回の投稿でRiot管轄地域内のプレイヤーが遭遇したJavascriptエラー回数が正しくありませんでした。正確な数値はずっと多く、2億6500万回でした。強いて良い点を挙げれば、問題の重要度は更に高くなったこと、そしてプレイヤーが実際に遭遇したエラーが増えたわけではなく、私たちのデータが間違っていただけだったことでしょうか。なおエラー数は前回からパッチをリリースするたびに低減できており、現在は1億4000万回です。この数字はさらに下げられると確信しています。
次のステップは
直近の最優先事項はCEFのアップグレードですが、2021年後半に取り組む各種プロジェクトの準備も進行中です。
- ソーシャルパネルのアーキテクチャをEmberへ移行する
- 試合終了後画面の追加改善:昨年~今年初旬に主要な問題をいくつか解決できたとはいえ、クライアントに戻るまでの時間が長すぎる・試合終了後画面でフリーズするという声はまだ多く寄せられており、まだまだ解決すべき課題は残っています。こちらは着手次第、クライアントとゲーム内エンジン/サービス間で行われる処理を洗い出した上で改善点を探っていく予定です。試合終了後画面はクライアントチームの管轄外となる各種サービスと接続するため、修正時には必要に応じて他チームと連携して取り組んでいきます。
- チャンピオン選択画面の表示が遅い:こちらは特定地域で報告数が多い問題で、原因の一部はプレイヤーのネットワーク接続にあると考えられます(インターネットのインフラは地域ごとに異なるため)。ネットワーク接続の問題は私たちには解決できませんが、今後もコンペティティブ(競技)チームと連携し、すべてのプレイヤーが一定時間内にチャンピオン選択画面を見られるよう、クライアント側でできることを模索していきます。
- セッション時間が長い場合のクライアント安定性:メモリーリークの解決は昨年末から急激に優先度が高くなったトピックです。メモリーリークとは、何度も試合をプレイしたり、クライアントを長時間放置したりした時にメモリー使用量が急激に増大する問題です。今後は包括的な手法で改善に努め、「プレイし続けた・長時間放置したあともログイン直後と同じように感じられる」状態を実現するための解決策を様々な側面から模索していきます。その過程ではより難易度の高いメモリーリークの解決を目指していくことも選択肢に入りますが、その際には作業量を見積り、短期的に結果が出せる案と比較していく必要が出てくるでしょう。
以上、今回の進捗報告でした!毎度繰り返しになりますが、皆さんから寄せられる各種フィードバック(アンケートなど)は私たちが仕事を進めていく上で大きな助けとなっています。ぜひ今後も優先すべき問題や、特に良かった改善点などをお寄せいただければと思います。