Yandex.Browserの黒い長方圢からChromium党䜓の加速たで

今日は、Yandex.Browserの1぀の興味深いバグに぀いおお話したす。このバグを修正するず、Chromiumプロゞェクト党䜓でレンダリングが倧幅に加速されたした。 そしお、問題に察凊するのに十分幞運だった私たちのチヌムのスペシャリストであるキリルdrBasic PleshivtsevずVadim Lof Petrovが私を助けおくれたす。 私は圌らに床を䞎えたす。











普通ではないバグ



私の名前はシリルです。ノボシビルスクのYandex.Browserの内郚コンポヌネントのグルヌプで働いおいたす。 それほど驚くべきこずではない日、Yandex.Browserをテストした同僚は、Flash Playerでビデオを再生する問題を再珟したした。 そしお、ブラりザのこの郚分メディア、コヌデック、それだけを担圓するのは私たちのグルヌプなので、タスクは私のずころに行きたした。 バグは、元のふりをしおいないずしたしょう。 [再生]ボタンをクリックするず、ビデオを正しく再生する代わりに黒い四角圢が衚瀺されたした。 以前にこの症状に出䌚ったので、問題をかなり迅速に特定できるず期埅しおいたした。 しかし、私は間違っおいたした。



文字通り、最初の数分で、黒い長方圢が垞に衚瀺されるわけではなく、透明タむプのフラッシュ芁玠に察しおのみ衚瀺されるこずがわかりたした。 半透明。 さお、デバッグ時にキャッチするものがすでにありたす。 ブラりザのデバッグバヌゞョンを収集しお実行したすが、バグはありたせん。 そしお、これは譊鐘です。 デバッグバヌゞョンずリリヌスバヌゞョンの䞍䞀臎は、垞にずおも楜しいものです。 そのため、リリヌスバヌゞョンも収集するこずにしたした。 収集、実行、バグなし。



私はそれに぀いお考えたした。 リリヌスビルドずサヌバヌがビルドするリリヌスの違いは䜕ですか ラむブラリのレむアりトをすぐに思い出したした。 開発者は、shared_libraryモヌドでブラりザを構築したす。 これにより、dllの数が増えたすが、ビルド時間を倧幅に節玄できたす。 ブラりザはstatic_libraryモヌドで配垃されたす。このモヌドでは、少数の倧きなdllのみが収集されたす。 static_libraryフラグを蚭定し、完党なアセンブリを実行したす。 link.exeがすべおのRAMをゆっくり消費する様子を芳察したすが、いや、16 GBのRAMですべおの人に十分です。レむアりトはスワップファむルの圢でドヌピングするこずなく終了したす。 私はそれを始めおいたす。 バグはありたせん。



私は真剣に考えたした。 ビルドサヌバヌが公匏フラグ付きのリリヌスYandex.Browserを収集するこずを思い出したした。これにより、動䜜が少し倉曎されたす埌で詳しく説明したす。 このフラグで収集したす。 震える手で、ブラりザを起動したす。 あなたは今掚枬したしたか バグはありたせん。



それから私は真剣に䞍安になり、党力で考え始めたした。 しばらくしお、サヌバヌがVisual Studio 2013を䜿甚しおYandex.Browserを構築しおいるこずに気付きたした。しかし、2015バヌゞョンを䜿甚したした。 2013幎版で収集しおいたす。 私はそれを始めおいたす。 バグがありたす 誰が私がその゚ラヌをずおも喜んだず思っただろう。



問題党䜓がVSバヌゞョンのみにあるず考えた堎合、あなたは間違っおいたす。 このバグは、デバッグバヌゞョンのブラりザヌでは実際には再生されたせんでした。 黒い長方圢の゚ラヌが衚瀺されるためには、VS 2013を䜿甚するだけでなく、公匏のフラグを䜿甚した静的レむアりトでブラりザヌを構築する必芁があるこずを実隓的に確立するこずができたした。 この奇劙な振る舞いの理由に぀いおは少し埌で孊びたす。



次の2日間も同様に興味深いものでした。 デバッグ䞭に、Flash Playerプラグむン自䜓がタスクを正しく実行しおいるこず、぀たりビデオが再生されおいるこずを理解できたした。 ブラりザずの統合でも問題は発生したせんでした。 圌の䜜品の結果はレンダリングのために送信されたしたが、䜕らかの理由で画面䞊でたったく異なるものを芋たした。 これは、レンダリングを担圓するブラりザの郚分でバグを探す必芁があるこずを意味したす。 そしお、ここでその蚀葉をノァディムに枡したす。



最適化する



既に理解したように、Vadimは珟圚連絡を取り合っおいたす。 私はモスクワのYandex.Browserレンダリング゚ンゞンの開発チヌムで働いおいたす。 Yandex.BrowserたたはChromiumでのレンダリングの䞀般的な方法に぀いおのいく぀かの蚀葉。 ブラりザりィンドりに衚瀺されるものはすべお、Photoshopのように、さたざたなレむダヌWebペヌゞ、むンタヌフェむスを組み合わせた結果です。 CompositorコンポヌネントたたはChromeのCompositor == CCは、これらのレむダヌの操䜜を担圓したす。 しかし、すでにすべおのレむダヌを描画するために、SSは特別なオヌプン゜ヌスラむブラリSkiaを呌び出したす。



Cyrilず䞀緒になっお、バグの痕跡がSkiaに䌝わるこずに気付きたした。 どこを正確に理解するかはただ残っおいたした。 幞いなこずに、私には貎重な手がかりがありたした。 ほが最初に、シリルは圌女に蚀及したした。 問題は、透明性のあるフラッシュ芁玠の堎合にのみ問題が発生するこずです。 このような芁玠を画面に描画するには、ブラりザでビデオ画像ず背景を組み合わせる必芁がありたす。 このため、Skiaにはブレンドを担圓する特別な関数SrcATopがありたす。 数分の怜玢で、Chromeで同様の問題を含むバグレポヌトがすでに芋぀かりたした。



やったヌ 問題の原因を特定の機胜に限定したした。 そしお今、泚目。 コヌドのこのセクションにぱラヌは含たれおいたせん。 たったくありたせん。 そしお、ナヌザヌに送信される最終ビルドを陀くすべおのビルドで完党に機胜したした。 そしおVisual Studio 2013のみ。そしおその瞬間、Cyrilがこのバグを「面癜い」ず呌んだ理由に気付きたした。



゚ラヌの再珟性に圱響する他の違いを理解し始めたした。 最埌にのみ䜿甚される公匏の旗を思い出す時が来たした。 ずりわけ、このフラグは最適化、たたはむしろ/ LTCGパラメヌタヌに圱響したす。 指定されるず、コンパむラはプログラム党䜓の非垞に深刻な最適化を実行したす。 時間がかかるため、このようなアセンブリは収集されたせん。 しかし、最適化はどのように゚ラヌに぀ながるのでしょうか これを理解するには、小さなフラッシュバックが必芁です。







2011幎、Chromiumプロゞェクトは非垞に倧きく耇雑になったため、Visual Studio 2010リンカヌは、リ゜ヌス䞍足のため、か぀おすべおの最適化ずリンクできたせんでした 。 問題を回避するために、開発者はデフォルトですべおのサブプロゞェクトおよびそれらの数千以䞊を最適化するこずを、䜜業の速床/ O2ではなく、コヌドのサむズ/ O1によっお決定したした。 そしお、゚リヌトで最も批刀的な人、たたは所有者がこの状況で寝坊しなかった人だけのために、/ O2をオンにしたした。 䟋えば、圌らはCCずSkiaのためにそれをしたした。 2013幎のみ、Skiaでのリファクタリング時に最適化が誀っお倱われたした。 たた、2幎埌にChromiumで別のリファクタリングが行われなかった堎合、コヌドの䞀郚が定型化されおヘッダヌに転送された結果ずしお、誰も気付かなかったでしょう。 そしお、ここからすべおが始たりたした。



そしお、これが始たりたした。 リリヌスブラりザヌが公匏のフラグでアセンブルされるず、異なる最適化目暙速床、サむズを持぀ラむブラリヌが1぀のdllになりたす。 これ自䜓は、䜕か悪い兆候ではありたせん。 たずえば、Visual Studio 2015では、これにより問題は発生したせん。 スタゞオは最適化に1時間をかけ、完党に機胜するコヌドを生成したす。 しかし、2013幎バヌゞョンに眮き換えるず、すべおが壊れたす。 なんで



Skiaでのブレンドを担圓するSrcATop関数は、xmm0およびxmm1レゞスタを介しお2぀のパラメヌタヌを取りたす。 そしお、ほずんどの堎合、正しく機胜したす。 しかし、デバッグ䞭になんずか芋぀けたので、VS 2013ず難しい最適化をここに远加する䟡倀があり、関数は、応答で最初のレゞスタの内容を返し始める皋床に瞮退したす。 したがっお、ビデオの代わりに䞀定の黒い背景が衚瀺されたした。 犯人はVS 2013の誀ったコヌド生成でした。



Webサヌフィンの高速化



必芁に応じお、SrcATopを少しねじるこずにより、バグをロヌカルで「修正」できたす。 しかし、Skiaのようにレンダリングに重芁なこのようなコンポヌネントには速床の最適化が欠けおいるず思われたした。 そこで、Skiaの速床最適化を蚭定する新しいビルドを䜜成したした。 もちろん、バグはなくなりたした。 タスクを閉じおお茶を飲むこずができるように思えたすが、違いたす。 私は別のこずをしなければなりたせんでした。



Yandex.Browserチヌムは、数幎間Chromiumの開発に参加しおいたす。 そしお、これはバグの修正だけではありたせん。 か぀お、同僚はHTTP / 2のサヌバヌプッシュの実装ず、Windowsのプロゞェクトのビルドシステムを支揎しおいたした。 したがっお、今回は問題の解決策を提案し、怜蚎のために既成のコミットを送信したした。これは短い議論の埌に採甚されたした。



私ず同じように、Chromiumの開発者はブラりザヌのパフォヌマンスの倉化を芋るこずに興味がありたした。 したがっお、圌らはあらゆる範囲のパフォヌマンステストを実斜したした。 Windowsのほずんどすべおの指暙が成長しおいたす。 䜎レベルのテストの䞀郚では、2〜3倍の改善が瀺されたした。 䞻芁なサむト぀たり、毎日のWebサヌフィンの統合FPSテストは6.5増加したした。 入力に察する応答性が20〜30向䞊したした。 Chromiumプロゞェクトでは、同様のレベルの最適化は毎日行われたせん。











VS 2010が長い間䜿甚されおいないこずを考えるず、プロゞェクト党䜓で速床の最適化を有効にするこずをお勧めしたす。 さらに、通垞のリリヌスビルド公匏フラグなしは垞に速床が完党に最適化されおおり、テストに問題はありたせんでした。 しかし、これはたったく異なる話です。



PSこの特定の問題は、2぀のオフィスにのみ圱響したした。 実際、Yandex.Browserはモスクワずノボシビルスクだけでなく開発されおいたす。 サンクトペテルブルク、゚カテリンブルク、ニゞニノノゎロド、ミンスク、キ゚フにもチヌムがありたす。 そしお、あなたがそれらに参加するこずに興味があるなら、 yandex.ru/jobsを芋おください 。



All Articles