トップ回答者
C# WebBrowserコントロールのGPUレンダリングについて

質問
-
お世話になります。
早速ですが、WebBrowserコントロールを張り付けたC#のフォームアプリケーションにて、
あるコンテンツの表示速度がIternet Exproler(IE ver11)で表示した場合と比べると
明らかに遅くスムーズさに欠けます。
ネットで検索し"GPUレンダリング"が関係ありそうというところまでたどり着き
レジストリーの設定を変えると表示速度が上がるとの情報に従いトライしてみましたが変化がない状況です。
変更したレジストリーは
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_GPU_RENDERING
に値の"1"を設定しました。
比較に使ったコンテンツは以下のページです。
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/fishietank/
本件について情報を持ってる方がいましたらご教示いただけると助かります。
以上よろしくお願いいたします。
回答
-
動作環境の見直しを行ったところ
IEのインターネットオプション→詳細設定タブ→「アクセラレータによるグラフィックス」の「GPUレンダリングでなく、ソフトウエアレンダリングを使用する」にチェックが入っており
ソフトウエアレンダリングで動作していたようでした。「GPUレンダリングでなく、ソフトウエアレンダリングを使用する」を切り替えて表示させた結果は
・ソフトフトウエアレンダリング
IE:50 FPS / アプリ 25 FPS
・GPUフトウエアレンダリング
IE:60 FPS / アプリ 55 FPS
となりオリジナルアプリでも高速にかつスムーズに動く事を確認できました。
ご回答などくださった皆様、誠にありがとうございました。- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月14日 0:32
-
回答ではありませんが、私の環境(Windows 10 x64)でレジストリの登録を試してみたところ、IE と同じとまでは行かなかったものの、劇的に描画が早くなりました。
登録したのは下記のレジストリです。
1.HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
IEの互換バージョンを指定する。
2.HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_GPU_RENDERING
GPUレンダリングを有効にする。
上記の設定で 20~30 FPS だったものが 55 FPS と変化しました。IEでは 60 FPS でした。
もし、上記レジストリで FPS がまったく変化しない場合は、スペルミスがないか確かめてみてください。参考サイト: https://msdn.microsoft.com/en-us/library/ee330731(v=vs.85).aspx#gpu_rendering
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月31日 0:06
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月14日 5:50
すべての返信
-
回答ではありませんが、私の環境(Windows 10 x64)でレジストリの登録を試してみたところ、IE と同じとまでは行かなかったものの、劇的に描画が早くなりました。
登録したのは下記のレジストリです。
1.HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
IEの互換バージョンを指定する。
2.HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_GPU_RENDERING
GPUレンダリングを有効にする。
上記の設定で 20~30 FPS だったものが 55 FPS と変化しました。IEでは 60 FPS でした。
もし、上記レジストリで FPS がまったく変化しない場合は、スペルミスがないか確かめてみてください。参考サイト: https://msdn.microsoft.com/en-us/library/ee330731(v=vs.85).aspx#gpu_rendering
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月31日 0:06
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月14日 5:50
-
お世話になります。
早速、ご回答いただきましてありがとうございます。
まず、ご教示いただきました内容でレジストリを設定した結果としては「変化がありませんでした。」
◆当方の環境は
・Windows 10 x64 CPU:i7 となっています。
・IE ver 11
・オリジナルアプリはVS2010 C#で作成しています。
◆上記環境で確認した結果は以下となりました。
・IE: 50FPS / 画面サイズ 1920X985
・オリジナルアプリ:30FPS / 画面サイズ 1920X1017
となり、ご回答者様のレジストリ設定前と同じ結果となっています。
◆再度、スペルミスの確認をしましたが間違いはないようなのですが・・・
■速度アップの方法としてGPUレンダリング関係を調整すれば表示速度が上がるとの結果をいただきましたので、
使っている環境(セキュリティー,DirectXのバージョン等々)を確認してみます。
-
> ネットで検索し"GPUレンダリング"が関係ありそうというところまでたどり着き
自分も、以下のスペックの PC で、Visual Studio 2010 Professional のデフォルト設定(x86、.NET 4 Client Profile で Debug ビルド)で作った WebBrowser アプリで試してみました。
OS: Windows 10 Professional 64-bit
ディスプレイ: 15.6" ワイド (1920 x 1080)
CPU: i7-6700HQ (4 コア, 2.6 GHz, 6MB キャッシュ)
メモリ: 16GB (DDR4 SO-DIMM PC4-17000, 8GB x 2)
SSD: 256GB (M.2 SATA3 接続)
HDD: 1TB (5400 rpm)
GPU: NVIDIA GTX960M (ビデオメモリ 2GB)
チップセット: モバイル インテル HM170 Express結果、自分の環境では、IE11 も WebBrowser も、少なくとも見かけは GPU レンダリングの有効・無効による変化はないという結果になりました。その画像を貼っておきます。WebBrowser で検証した時の画像を貼っておきます。FEATURE_GPU_RENDERING は設定なし
(設定して試してもみましたが効果なし)、FEATURE_BROWSER_EMULATION のみ 0x00002af8 に設定しています。2017/6/1 11:27 訂正:GPU レンダリングを設定しても効果なしは間違いでした。すみません。訂正しておきます。
(1) WebBrowser アプリで、20 fish, 1536 x 769 で 50 FPS 前後
(2) WebBrowser アプリで、1000 fish, 1536 x 769 で 35 FPS 前後
(最初は数 FPS で時間が経つにつれ徐々に上がってきます。理由不明)ちなみに、IE11 では 1000 fish でも 60 FPS で、GPU レンダリングの有効・無効で変化はありませんでした。
質問者さんの環境と結果が異なるのは何故だか分かりませんが、ハードウェアの違いが影響しているのではなかろうかと想像しています。
- 編集済み SurferOnWww 2017年6月1日 3:09 訂正
- 回答の候補に設定 電腦神手吳子陵 2017年9月21日 9:13
-
魚の数はいくつで試してますか? 初期状態の 20 のままですか?
あと、参考のため、Visual Studio のビルドとフレームワークの設定、PC のスペックを書いていただけませんか?
ちなみに私が試した VS の設定、PC のスペックは上の私のレスの通りです。
佐祐理さんが言われる DPI とは「ディスプレイのカスタマイズ」ダイアログの「テキスト、アプリ、その他の項目のサイズを変更する」の設定のことだと理解していますが、デフォルトの推奨値 125% です。
> こちらと同じ状況との事でレジストリの設定ミス以外の原因についても調査してみます。
FEATURE_GPU_RENDERING の設定の有無で変化はなかったという点は同じかもしれませんが、当方の環境では「明らかに遅くスムーズさに欠けます」というほどの劣化はなかったです。(魚の数が 20 なら 50 FPS 前後でした)2017/6/1 11:30 訂正:GPU レンダリングを設定しても効果なしは間違いでした。すみません。訂正しておきます。
- 編集済み SurferOnWww 2017年6月1日 2:30 訂正
-
私は、DPI は 100% で試しておりました。もしかしてと思いましたので、DPI を 150%、200% に変更しそれぞれ再起動後検証してみましたが現象に変化は出ませんでした。(GPU 無効: 約 20~30 FPS、GPU 有効:約 55 FPS)
魚の数は、1000 で検証を行っておりました。その他、詳細な環境を下記に記載します。
Windows 10 Enterprise 2016 LTSB 64 ビット (10.0, ビルド 14393)
Visual Studio 2010 Premium (Version 10.0.40219.1 SP1Rel) 及び、Visual Studio Enterprise 2015 (Version 14.0.25431.01 Update 3)
アプリの対象フレームワーク: .NET Framework 4 Client Profile 及び、.NET Framework 4.5.2
アプリの対象プラットフォーム: x86 及び x64
GPU: NVIDIA GeForce GT 650M
CPU: Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz 2.40 GHz※ Visual Studio のデバッグ実行ではなく、Release ビルドを行って、出来上がった EXE をエクスプローラから直接実行して検証しています。
- 編集済み kenjinoteMVP 2017年6月2日 1:01
- 回答の候補に設定 電腦神手吳子陵 2017年9月21日 9:13
-
-
> 確証画像まで提示していながら間違っていたということは単純なミスではないということですよね?
私がアップした確証画像は「FEATURE_GPU_RENDERING は設定なし、FEATURE_BROWSER_EMULATION のみ 0x00002af8 に設定」という条件で、そこは間違いないです。
その後、FEATURE_GPU_RENDERING キーを追加し(初期にはそのキーがなかったです)、その下に当該 .exe の REG_DWORD を 1 に設定して試したつもりだったのですが、多分そこで間違えた・・・つまり単純ミスだったのだと思います。
その後キーごと削除して最初の状態の戻してしまったので、どのように間違えたかは不明です。
-
> 対象アプリは WebBrouser.App.exe です。
貼ってあった画像では WebBrowserApp.exe となってますが?(スペルが違う。ピリオドが 1 つない)
あと、先の私のレスで、
> 魚の数はいくつで試してますか? 初期状態の 20 のままですか?
> あと、参考のため、Visual Studio のビルドとフレームワークの設定、PC のスペックを書いていただけませんか?
とお願いしていますが、それには答えていただけないのですか?
- 編集済み SurferOnWww 2017年6月1日 8:40 訂正
-
実行ファイル名について悩むくらいなら
static void Main() { var name = Path.GetFileName(Application.ExecutablePath); Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", name, 11000); Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_GPU_RENDERING", name, 1);
のようにプログラム開始時に自身のファイル名を取得してレジストリに設定した方が確実です。
# WebBrowserコントロールが初期化される前であればいつ書き込んでも同じですので。
また、デバッガー上及びホストプロセス上で実行していてパフォーマンスが低下している可能性はありませんか? Explorerから実行ファイルを直接起動してみてはどうでしょうか?
- 回答の候補に設定 電腦神手吳子陵 2017年9月21日 9:16
-
大変お世話になっております。
◆SurferOnWww 様
回答が遅くなり申し訳ありません。
> 魚の数はいくつで試してますか? 初期状態の 20 のままですか?
1. 20 fish ⇒ 50FPS
2. 1000 fish ⇒ 30FPS (起動直後:10FPS → 30秒経過後 → 30FP )
補足として IE 1000 fish ⇒ 50FPS (起動直後:30FPS → 3秒経過後 → 50FP )
> あと、参考のため、Visual Studio のビルドとフレームワークの設定、PC のスペックを書いていただけませんか?
1.Visual Studio のビルド⇒ 構成:Release / プラットフォーム:アクティブ(x86)
2.フレームワークの設定 ⇒ .NET Framework 4 Client Profile
3.PC のスペック⇒Panasonic CF-LX5ZD9QR / OS:Windows 10 Pro 64ビット / CPU:i7 /メインメモリー:8GB / ビデオメモリー:4GB / SSD:256GB(Serial ATA)
以上です。
>貼ってあった画像では WebBrowserApp.exe となってますが?(スペルが違う。ピリオドが 1 つない)
入力ミスによるものです。正確には WebBrowserApp.exe です。申し訳ありませんでした。
◆佐祐理 様
>実行ファイル名について悩むくらいなら
>....
>のようにプログラム開始時に自身のファイル名を取得してレジストリに設定した方が確実です。
おっしゃる通りだと思います。
実は当初より同様のロジックを WebBrowserApp.exe には組み込んでおります。
⇒regedit.exeで書き込んだ内容を確認していますのでロジック自体は正常に動作していると思われます。
>また、デバッガー上及びホストプロセス上で実行していてパフォーマンスが低下している可能性はありませんか?
>Explorerから実行ファイルを直接起動してみてはどうでしょうか?
kenjinote様と同様に
※ Visual Studio のデバッグ実行ではなく、Releaseビルドを行って、出来上がったEXEをエクスプローラから直接実行して検証しています。
としております。また、起動するときはレジストリの書き換えを行うため「管理者として実行」で起動しております。
◆恐縮ですが、一旦整理させていただきますと
・kenjinote様, SurferOnWww様, 佐祐理様 :レジストリーの変更のみで速度が 30FPS ⇒ 55FPS に激変!
・小生 : レジストリーの変更後、速度が 30FPS ⇒ 30FPS 変化なし
・現状の結論としては
WebBrowserコントロールを張り付けたアプリケーションではレジストリーを変更することで
GPUレンダリングが有効になり、表示速度が劇的に上がる。
但し、まれに”特定の条件”の下ではレジストリの変更だけでは効果がない事がある。
と認識しております。
◆引き続き、小生の”特定の条件”を探し出しながら、手持ちの他のPCでも確認したいと思います。
また新たにプロジェクトを作り確認してみたいと思います。
-
起動するときはレジストリの書き換えを行うため「管理者として実行」で起動しております。
HKEY_CURRENT_USERへの書き込みであれば「管理者として実行」の必要はありません。一般的なアプリケーションの作りとしても「管理者として実行」を要求するべきではなく、管理者権限が必要となる箇所へのレジストリ書き込みについてはインストール時に済ませるべきです。
# とはいえ手元の環境では管理者として実行でもパフォーマンス低下は見られませんでした。
それはそうとVisual Studioのバージョンを提示してください。なかなか書いてもらえない…。VS2017で廃止されたvshost.exeに言及されていることからVS2015以前だとは推測できますが…。Client Profileを選択されるあたりVS2010ですか?
- 回答の候補に設定 電腦神手吳子陵 2017年9月21日 9:16
-
レジストリの設定には間違いなく、アプリの起動の問題(デバッグ実行とか)もないようですね。とるすと、ハードウェアの差が原因ではないかという気がします。
質問者さんの PC は Core i7-6500U の内臓グラフィックスのみ、kennjinote さんは GT650M、自分は GTX960M という外付けグラフィックスというところに見えている違いがあるようです。
あと、質問者さんの PC の IE11 で試した場合の、
補足として IE 1000 fish ⇒ 50FPS (起動直後:30FPS → 3秒経過後 → 50FP )
というのも気になります。自分の PC の場合、デフォルトの 20 fish から 1000 fish に切り替えると 1 秒かからず 50 FPS 以上に上がり、55 ~ 60 FPS で動くようになります。
というわけで、GPU のパワー不足・・・というのも考えにくい気がしますが、切り分けのためにも、是非、
> 手持ちの他のPCでも確認したいと思います。
を試してみて(できればそれなりの性能を待つ外付けグラフィックスカードがある PC で)、結果を連絡いただけると幸いです。
- 回答の候補に設定 電腦神手吳子陵 2017年9月21日 9:16
-
動作環境の見直しを行ったところ
IEのインターネットオプション→詳細設定タブ→「アクセラレータによるグラフィックス」の「GPUレンダリングでなく、ソフトウエアレンダリングを使用する」にチェックが入っており
ソフトウエアレンダリングで動作していたようでした。「GPUレンダリングでなく、ソフトウエアレンダリングを使用する」を切り替えて表示させた結果は
・ソフトフトウエアレンダリング
IE:50 FPS / アプリ 25 FPS
・GPUフトウエアレンダリング
IE:60 FPS / アプリ 55 FPS
となりオリジナルアプリでも高速にかつスムーズに動く事を確認できました。
ご回答などくださった皆様、誠にありがとうございました。- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月14日 0:32