WPFレンダリングシステムに深く浞る

「なぜWPFはすべおの生き物よりも生き生きしおいるのですか」および「7幎間のWPF䜕が倉わったのか」ずいう゚ントリに぀いお議論するこずで、この蚘事を翻蚳するように促されたした。



最初はこの蚘事を公開したくありたせんでした。 それは倱瀌なように思えた-死者に぀いおうたく話すか、䜕も蚀わないでください。 しかし、私が本圓に感謝しおいる意芋を持぀人々ずのいく぀かの䌚話は、私の心を倉えたした。 Microsoftプラットフォヌムに倚倧な劎力を費やした開発者は、その䜜業の内郚機胜に泚意する必芁がありたす。そうするこずで、行き詰たりに陥った堎合、䜕が起こったのかを理解し、プラットフォヌム開発者の垌望をより正確に定匏化できたす。 私はWPFずSilverlightを優れたテクノロゞヌだず考えおいたすが、...過去数か月にわたっお私のTwitterをフォロヌしおいる堎合、いく぀かの発蚀はWPFずSilverlightのパフォヌマンスに察する根拠のない攻撃のように思えるかもしれたせん。 なぜこれを曞いたのですか 結局のずころ、私は長幎にわたっお䜕千時間も自分の時間を費やし、プラットフォヌムの促進、図曞通の開発、コミュニティのメンバヌの支揎などをしたした。 個人的に個人的に興味がありたす。 プラットフォヌムを改善しおほしい。







パフォヌマンス、生産性、生産性



䞭毒性のある消費者志向のナヌザヌむンタヌフェむスを蚭蚈する堎合、パフォヌマンスが最も重芁です。 それがなければ、他のすべおは意味がありたせん。 むンタヌフェヌスが遅れたため、むンタヌフェヌスを䜕回単玔化する必芁がありたしたか 既存のテクノロゞヌでは実装できないため、「新しい革新的なナヌザヌむンタヌフェむスモデル」を䜕回思い぀いたのですか。 2.4 GHzの呚波数のクアッドコアプロセッサが適切に動䜜する必芁があるず顧客に䜕回蚀っおいたすか クラむアントは、WPFずSliverlightでiPadアプリケヌションず同じ滑らかなむンタヌフェむスを取埗できない理由を繰り返し尋ねおきたした。4倍匷力なPCを䜿甚しおいる堎合でもです。 これらのテクノロゞヌはビゞネスアプリケヌションに適しおいる堎合がありたすが、次䞖代のナヌザヌアプリケヌションには明らかに適しおいたせん。



ただし、WPFはハヌドりェアアクセラレヌションを䜿甚したす。 なぜあなたはそれを効果がないず思いたすか



WPFは実際にハヌドりェアアクセラレヌションを䜿甚しおおり、内郚実装のいく぀かの偎面は非垞にうたく行われおいたす。 残念ながら、GPUの䜿甚率は実際よりもはるかに䜎くなっおいたす。 WPFレンダリングシステムは非垞に匷力な力を䜿甚したす。 この声明を以䞋に説明したいず思いたす。



WPFレンダリングナニットパスの分析



パフォヌマンス分析のために、WPF内で実際に䜕が起こっおいるのかを理解する必芁がありたす。 このために、DirectX SDKに同梱されおいるDirect3DプロファむラヌであるPIXを䜿甚したした。 PIXはD3Dアプリケヌションを起動し、すべおのDirect3D呌び出しにいく぀かのむンタヌセプタヌを挿入しお、それらを分析および監芖したす。



巊から右に2぀の楕円を衚瀺する単玔なWPFアプリケヌションを䜜成したした。 䞡方の楕円は同じ色55F4F4F5で、黒い茪郭をしおいたす。







そしお、WPFはこれをどのようにレンダリングしたすか



たず、WPFは再描画しようずしおいるダヌティ゚リアをクリヌンアップしたすff000000。 GPUパむプラむンの最終的なマヌゞステヌゞに送信されるピクセル数を枛らすには、ダヌティ゚リアが必芁です。 これにより、再テッセレヌションが必芁なゞオメトリの量が枛るず仮定するこずもできたす。これに぀いおは埌で詳しく説明したす。 汚れた郚分をきれいにするず、フレヌムは次のようになりたす







その埌、WPFは䞍可解なこずを行いたす。 たず、頂点バッファヌをいっぱいにしおから、汚れた領域に長方圢のようなものを描画したす。 フレヌムは次のようになりたす゚キサむティングですよね







その埌、CPU䞊の楕円をテッセレヌションしたす。 既にご存知かもしれたせんが、テッセレヌションは、100x100の楕円のゞオメトリを䞀連の䞉角圢に倉換するこずです。 これは次の理由で行われたす1䞉角圢はGPUの自然なレンダリングナニットです2楕円テッセレヌションは数癟の䞉角圢のみをもたらすこずができ、CPUによるアンチ゚むリアシングで10,000ピクセルをラスタラむズするよりもはるかに高速ですSilverlightが行いたす。 以䞋のスクリヌンショットは、テッセレヌションがどのように芋えるかを瀺しおいたす。 3Dグラフィックに粟通しおいる読者は、これらが䞉角圢のストラむプであるこずに気付くかもしれたせん。 テッセレヌションでは、楕円が䞍完党に芋えるこずに泚意しおください。 次のステップずしお、WPFはテッセレヌションを取埗しお頂点GPUバッファヌにロヌドし、XAMLで構成された「ブラシ」を䜿甚するように構成されたピクセルシェヌダヌを䜿甚しお別の描画呌び出しを行いたす。







楕円の䞍完党性に泚意したこずを芚えおいたすか 本圓にそうです。 WPFは、Direct3Dプログラマヌが「ラむンリスト」ずしお知っおいるものを生成したす。 GPUは、䞉角圢だけでなく線も認識したす。 WPFはこれらの線で頂点バッファを埋め、䜕を掚枬したすか 正確に、別の描画呌び出しを行いたすか 行のセットは次のようになりたす。







これで、WPFは楕円の描画を完了したした。 いや サヌキットを忘れおしたいたした パスは行のコレクションでもありたす。 たた、頂点バッファにも送信され、別の描画呌び出しが行われたす。 アりトラむンは次のようになりたす







この時点で、楕円が1぀描画されおいるため、フレヌムは次のようになりたす。







シヌン内の楕円ごずに手順党䜓を繰り返す必芁がありたす。 私たちの堎合、2回です。



わかりたせん。 これがパフォヌマンスに悪いのはなぜですか



最初に気付くのは、1぀の楕円をレンダリングするために、3぀の描画呌び出しず頂点バッファヌぞの2぀の呌び出しが必芁だったこずです。 このアプロヌチの非効率性を説明するには、GPUの動䜜に぀いお少し話さなければなりたせん。 たず第䞀に、最新のGPUは非垞に高速で、CPUず非同期に動䜜したす。 ただし、䞀郚の操䜜では、ナヌザヌモヌドからカヌネルモヌドぞの移行にコストのかかる切り替えが発生したす。 頂点バッファを埋めるずきは、ブロックする必芁がありたす。 この時点でGPUがバッファを䜿甚しおいる堎合、これによりGPUがCPUず匷制的に同期され、パフォヌマンスが劇的に䜎䞋したす。 D3DUSAGE_WRITEONLYで頂点バッファヌが䜜成されたす| D3DUSAGE_DYNAMIC、しかしそれがブロックされるずきこれはしばしば起こる、D3DLOCK_DISCARDは䜿甚されない。 これにより、バッファヌがGPUによっお既に䜿甚されおいる堎合、GPUで速床の䜎䞋GPUずCPUの同期が発生する可胜性がありたす。 倚数の描画呌び出しの堎合、カヌネルモヌドぞの移行が倚く発生し、ドラむバヌに倧きな負荷がかかる可胜性が高くなりたす。 パフォヌマンスを改善するには、できるだけ倚くの䜜業をGPUに送信する必芁がありたす。そうしないず、CPUがビゞヌになり、GPUがアむドル状態になりたす。 この䟋では、1぀のフレヌムに぀いおのみ話しおいたこずを忘れないでください。 兞型的なWPFむンタヌフェヌスは、毎秒60フレヌムを出力しようずしたす レンダリングストリヌムがプロセッサを非垞に激しくロヌドしおいる理由を芋぀けようずしたこずがある堎合、ほずんどのロヌドはGPUドラむバからのものであるこずがわかりたす。



そしお、キャッシュされたコンポゞションはどうですか 生産性が向䞊したす



間違いなく、増加したす。 キャッシュビルドたたはBitmapCacheは、オブゞェクトをGPUテクスチャにキャッシュしたす。 これは、CPUのサむズを倉曎する必芁がなく、GPUを再ラスタラむズする必芁がないこずを意味したす。 1぀のレンダヌパスを実行する堎合、WPFはビデオメモリのテクスチャを䜿甚するだけで、パフォヌマンスが向䞊したす。 BitmapCacheの楕円は次のずおりです。







しかし、この堎合もWPFには暗い偎面がありたす。 BitmapCacheごずに、個別の描画呌び出しを行いたす。 私はうそを぀きたせん。時には、単䞀のオブゞェクトビゞュアルをレンダリングするために描画呌び出しを行う必芁がある堎合がありたす。 䜕でも起こりたす。 しかし、アニメヌション化されたBitmapCached楕円が300個ある<Canvas />があるシナリオを想像しおみたしょう。 高床なシステムでは、300のテクスチャをレンダリングする必芁があり、それらはすべおz順であるこずが理解されたす。 その埌、圌女は最倧サむズのパッケヌゞを収集したす。芚えおいる限り、DX9は䞀床に最倧16の入力芁玠サンプラヌ入力を䜿甚できたす。 この堎合、300の代わりに16の描画呌び出しが行われ、CPUの負荷が倧幅に削枛されたす。 1秒あたり60フレヌムの芳点から、負荷を1秒あたり18,000の描画呌び出しから1125に枛らしたす。Direct3D 10では、入力芁玠の数がはるかに倚くなりたす。



さお、私はこの堎所を読みたした。 WPFがピクセルシェヌダヌを䜿甚する方法を教えおください



WPFには、拡匵可胜なピクセルシェヌダヌAPIずいく぀かの組み蟌み効果がありたす。 これにより、開発者はナヌザヌむンタヌフェむスに真にナニヌクな効果を远加できたす。 シェヌダヌを既存のテクスチャにフィットさせようずするず、Direct 3Dは通垞、䞭間のレンダヌタヌゲットを䜿甚したす...結局のずころ、曞き蟌み元のテクスチャをサンプルずしお䜿甚するこずはできたせん WPFもこれを行いたすが、残念ながら、フレヌムごずに完党に新しいテクスチャを䜜成し、最埌に砎棄したす。 GPUリ゜​​ヌスの䜜成ず砎棄は、各フレヌムを凊理するずきにできる最も遅いこずの1぀です。 通垞、同じ量のシステムメモリを割り圓おおも、これは行いたせん。 これらの䞭間面を再利甚するこずにより、生産性の倧幅な向䞊を達成できたす。 ハヌドりェアアクセラレヌションシェヌダヌがCPUに顕著な負荷をかける理由を疑問に思ったこずがあれば、答えはわかりたした。



しかし、それがGPUでベクタヌグラフィックスをレンダリングする必芁があるのでしょうか



マむクロ゜フトはこれらの問題を修正するために倚くの努力をしたしたが、残念ながらこれはWPFではなくDirect 2Dで行われたした。 Direct2Dによっおレンダリングされた9぀の楕円のこのグルヌプを芋おください。







パスを持぀単䞀の楕円をレンダリングするために必芁なWPF呌び出しの数を芚えおいたすか 頂点バッファヌロックはどうですか Direct2Dは、これを1回の呌び出しで行いたす。 テセレヌションは次のようになりたす







Direct 2Dは、可胜な限り䞀床に描画を詊み、GPU䜿甚率を最倧化し、CPU負荷を最小化したす。 このペヌゞの最埌にある InsightsDirect2D Renderingを読んでください。MarkLawrenceがDirect 2Dの内郚詳现の倚くを説明しおいたす。 Direct 2Dのすべおの速床にもかかわらず、2番目のバヌゞョンではさらに倚くの領域が改善されるこずに気付くかもしれたせん。 Direct 2Dのバヌゞョン2は、DX11テッセレヌションハヌドりェアアクセラレヌションを䜿甚する可胜性がありたす。



Direct 2D APIを芋るず、コヌドの倧郚分がWPFから取埗されたず想定できたす。 Michael Wallentがこの技術に基づいたGDI代替品の開発に぀いお語っおいるこの叀いAvalonビデオをチェックしおください。 非垞によく䌌た幟䜕孊的なAPIず甚語を持っおいたす。 内郚は䌌おいたすが、非垞に最適化されおおり、モダンです。



Silverlightはどうですか



Silverlightを実行できたすが、それは冗長です。 Silverlightのレンダリングパフォヌマンスも䜎いですが、理由は異なりたす。 CPUを描画するために䜿甚したす芚えおいる限りでは、それらは郚分的にアセンブラヌで蚘述されおいたすが、CPUはGPUの少なくずも10〜30倍遅いです。 これにより、ナヌザヌむンタヌフェむスのレンダリングの凊理胜力が倧幅に䜎䞋し、アプリケヌションのロゞックの凊理胜力がさらに䜎䞋したす。 ハヌドりェアアクセラレヌションの開発は非垞に䞍十分で、WPFのキャッシュ構造をほが正確に繰り返し、同様の動䜜をし、BitmapCacheBitmapCachedビゞュアルを䜿甚しお各オブゞェクトの描画呌び出しを行いたす。



では、今䜕をしたすか



この質問は、WPFおよびSilverlightで問題が発生したクラむアントからよく聞かれたす。 残念ながら、明確な答えはありたせん。 特定のニヌズに合わせお独自のフレヌムワヌクを䜜成できる人。 ニッチにはWPFずSLに代わるものがないため、残りは条件に合わせる必芁がありたす。 クラむアントが単にビゞネスアプリケヌションを開発するだけであれば、スピヌドに関する問題はそれほど倚くなく、プログラマの生産性を享受するだけです。 本圓に興味深いむンタヌフェヌス぀たり、コンシュヌマヌアプリやキオスクアプリを構築したい人には、本圓の問題がありたす。



翻蚳の開始埌すでに、蚈画されたパフォヌマンスの最適化ずWPF 4.6でのDX10-11の䜿甚に関するニュヌスが掲茉されたした。 ニュヌスの蚘事に蚘茉されおいる問題が解決されるかどうかは完党には明らかではありたせん。





゜ヌス蚘事 WPFレンダリングシステムの重芁な詳现



All Articles