web-dev-qa-db-ja.com

Netflixがフルスクリーンモードでより良い(より効率的に)パフォーマンスするのはなぜですか?

先日、Netflixで映画をChrome Retina MacBook Proで見ていると、通常の1つのタブでビデオを見ているだけで、ファンがすばやくスピンアップすることに気づきました。ウィンドウ。(つまり、フルスクリーンではありません。)

フルスクリーンモードに切り替えると、1分ほどでファンが停止します。

そこで、バッテリーモニターアプリを使用して、両方のモードで視聴しながらmAhを測定し、ウィンドウモードで約85 mAh、フルスクリーンモードで約50mAhを測定しました。

私はまだ他のブラウザでテストしていません。

アクティビティモニターは、タブでNetflixを開くだけでディスクリートカードが起動することを報告しているので、統合グラフィックスとディスクリートグラフィックスの問題ではないと思います。

より広い表示領域と(理論的には)より高品質のビデオストリームが少ないシステムリソースを使用する理由を判断できないようです。

6
Craig Otis

それはほぼ間違いなくデスクトップウィンドウコンポジターと関係があります。

プラグインで、Webブラウザーのウィンドウ内でビデオを再生している場合、さらに悪いことに、Webブラウザーはそのページを次のようにレンダリングする必要があります。

  1. ウィンドウの装飾(アドレスバー、ブックマーク、ボタンなど)を描画します
  2. Webページの最初の部分を描画します。
  3. ビデオがあるはずの場所に「黒い四角」を描きますが、ウェブページの関連部分をその両側(左と右)に描きます。
  4. プラグインに、ウィンドウを配置したいと言った場所に描画するようにうまく依頼します。
  5. ウィンドウの下、ページの下部までWebページの残りの部分を描画します。
  6. このシーケンスに加えて、アニメーション効果(ウィンドウを最小化および最大化するときなど)を担当するコンポジットウィンドウマネージャーは、画面上のすべてのウィンドウのコンテンツを追跡する必要があります。この一環として、プラグインを含め、そのウィンドウ内に描画されているすべてのものを追跡する必要があります。プラグインはChromeはout-of-processプラグイン(つまり、chromeメインプロセスではなく、別のプロセスの一部です)。コンポジットウィンドウマネージャーがこれを追跡しなかった場合は、ウィンドウ内のすべてを次のように扱います。 「3Dテクスチャ」の場合、マイナスボタンをクリックしたときにウィンドウの最小化をタスクバーにアニメーション化することはできません。

Flash(またはSilverlight)にビデオをフルスクリーンで再生するように指示すると、FlashはChromeに何かをレンダリングするように指示しなくなります。実際、コンポジットウィンドウマネージャー全体を一時的に無効にすることができます。グラフィックのモニターへのレンダリングを担当する可能性のある他のすべてのプログラムは、一時的にレンダリングを停止するように指示されます(または、描画コマンドの送信は許可されますが、画面には実際には影響しません)。

フルスクリーンではない場合のグラフィックスパイプライン:

ブラウザとFlash/Silverlight->コンポジットウィンドウマネージャ->グラフィックハードウェア

フルスクリーン時のグラフィックスパイプライン:

Flash/Silverlight->グラフィックハードウェア

この簡略化されたパイプラインは、実行中のバッファーの「コピー」が少なくなるため、オーバーヘッドを削減し、ビデオ処理全体は次のようになります。

  1. ネットワークからビデオコンテンツをダウンロードします。
  2. DRMシステムを使用してビデオを復号化します。
  3. 固定機能ビデオデコードパイプラインと呼ばれるGPUの特別な部分を使用して、ビデオデータのハードウェアデコードを非圧縮形式に実行します。
  4. ハードウェアビデオデコードパイプラインは、デコードされたビデオをグラフィックフレームバッファーに直接コピーして再生できるようになりました。CPU/ RAMに送り返す必要はありません。

コンポジットウィンドウマネージャーが常に「OK、今のビデオはどのように見えますか?」と言っているので、ビデオがウィンドウ処理されると、ファンが回転し、より多くの電力が消費されます。そして、合成ウィンドウマネージャーがグラフィックカードに書き戻すことを決定する前に、readをCPUに戻す(そしておそらくRAMにバッファリングする)必要があります。他のすべての合成データ(ブラウザー、タスクバーなど)

コンポジットウィンドウマネージャーは、ビデオコンテンツをCPUに転送するように要求し続ける必要があります。これは、通常の状況では、システム上で直接を書き込むことができる唯一のプロセスビデオフレームバッファへisコンポジットウィンドウマネージャ。ブラウザ、ビデオプレーヤー、およびシステム上の他のすべてのコンポーネントは、ハードウェアとユーザースペースの間にあるゲートキーパーやスポークスパーソンなどのコンポジットウィンドウマネージャーを経由する必要があります。

これは、一部は「効果」を有効にするためであり、一部はセキュリティと安定性の理由からです。これは、プログラムがデスクトップを直接破損することができないためです(悪意を持ってまたは不適切なコーディングによって)。コンポジットウィンドウマネージャーはそれを許可しません。しかし、その後、コンポジットウィンドウマネージャーが無効になると(FlashやSilverlightなどの特権プログラムの要求により)、突然、その余分な「オーバーヘッド」の層がなくなります。

Mac OS Xで使用されるコンポジットウィンドウマネージャーは Quartz Compositor と呼ばれ、長い間OSXの一部でした。Quartz Extremeは、Quartzコンポジターの最新の化身であり、GPU自体で上記のすべてを実行します(ただし、これらの操作は、GPU自体で「無料」ではありません) GPUにオフロードされます。GPUはこれらの合成手順を実行するために電力を消費します。)

プログラム(FlashやSilverlightなど)がフルスクリーン制御を取得してQuartz Compositorを一時的に無効にする方法の開発者の視点については、 this Apple development doc

短編小説:Quartz Compositor +非常に頻繁な画面更新(ビデオで1秒間に30〜60回)==高いCPU使用率。 Quartz Compositorコンポーネントをパイプラインから削除すると、CPU使用率が劇的に低下します。特に、FlashとSilverlightにはハードウェアアクセラレーションによるビデオレンダリングとビデオデコードがあるためです。

6
allquixotic