質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

1873閲覧

アプリケーションでハードウェアアクセラレーション無効にしたい。

asekichi

総合スコア11

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/05/08 05:17

前提・実現したいこと

レジストリのハードウェアアクセラレーションを無効にすることで、問題を回避できるので、アプリケーション側で
RenderModeを変更して、レジストリ値を変更したことと同じことをしたい。

発生している問題・エラーメッセージ

特定環境下でToolTip表示し続けるとOutOfMemoryエラーが出る。

該当のソースコード

window_LoadedでRenderModeを変更。window_Activatedで変更されているかログにて確認できる。

vb.Net3.5

1 2 Private Sub wWindowEx_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 3 4 ohwndSource = CType(Interop.HwndSource.FromVisual(Me), HwndSource) 5 6 '描画時にレンダモードでHardWareモードを使わないように変更 7 ohwndSource.CompositionTarget.RenderMode = RenderMode.SoftwareOnly 8 9 '起動ログ出力 10 Try 11 OutPutLog(egLevel.INF, String.Format("{0}({1})起動", Me.ToString, Me.Title)) 12 OutPutLog(egLevel.INF, String.Format("RenderMode={0}", ohwndSource.CompositionTarget.RenderMode)) 13 14 Catch 15 End Try 16 17 End Sub 18 19 Private Sub wWindowEx_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated 20 'アクティブになったら出力 21 Try 22 cKSLogger.OutPutLog(egLevel.INF, String.Format("{0}({1})アクティブ", Me.ToString, Me.Title)) 23 24 If ohwndSource IsNot Nothing Then 25 '現在のRenderModeを出力 26 Dim hwndSource = CType(Interop.HwndSource.FromVisual(Me), HwndSource) 27 cKSLogger.OutPutLog(egLevel.INF, String.Format("RenderMode={0}", hwndSource.CompositionTarget.RenderMode)) 28 End If 29 Catch 30 End Try 31 End Sub 32

試したこと

VB.Net3.5sp1 wpfで開発をしています。
windows7やwindows10 32bitではどう問題は発生せず、Windows 10 Fall Creators 64Bit あたりから急に、OutOfMemoryで例外エラーで落ちるようになりました。
どうも、ToolTipを表示すると、ワーキングセットが増え続け、例外エラーで落ちるようです。簡単なサンプルを作り試しましたが、サンプルでは現象出せず。そこで、レジストリを変更しハードウェアアクセラレーションの無効化したところ、問題を回避できるようになった。
他のアプリに影響が出ないように、アプリケーション側で無効にしようとしたのですが、思い通りの動きをしません。

補足情報(FW/ツールのバージョンなど)

windows10 64Bit バージョン1709 OSビルド16299.334

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

根本的な原因はグラフィックドライバにある予感がします。

逃げ値としては、HwndTarget.RenderMode プロパティで行けるかもしれません。

投稿2018/05/08 06:41

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asekichi

2018/05/08 06:56

お返事ありがとうございます。 私も、グラフィックドライバに問題があるのではと、思ってはいますが、ドライバが直ってくるのを待ってもいられないので、ハードウェアアクセラレーションで逃げたいのです。 HwndTarget.RenderMode を変更し、値が変わっていることをログ上は確認できるのですが、どうもレジストリ値を変えたときを同じ動きになってくれないのです。 Zuishinさんがおっしゃるように、.Netのバージョンを上げるというのも将来的には考慮しなければいけない段階にきているのかもしれません
hihijiji

2018/05/08 06:59

変更はUIスレッドで行ってますか?
asekichi

2018/05/08 07:13

してません。
hihijiji

2018/05/08 07:27

HwndTargetはスレッドセーフじゃないので、中身もスレッド依存と考えるのが筋だとおもいます。
asekichi

2018/05/08 08:33

ありがとうございます。 ちょっと、その線で当たってみます
guest

0

簡単なサンプルでうまくいくならそのサンプルを呼び出すようにすればいいのでは?

###追記

RenderOptions.ProcessRenderMode プロパティRenderMode.SoftwareOnly にしてみてください。

投稿2018/05/08 05:28

編集2018/05/08 05:43
Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asekichi

2018/05/08 05:31

返事ありがとうございます。 簡単なサンプルという表現がいけなかったのかもしれません。問題を切り分けるために ToolTipを出すだけにしたということです。ですので、基本的には何も変わっていないのです。
asekichi

2018/05/08 06:09

返事ありがとうございます。 追記していただいた方法は、.Net3.5でもサポートされているのでしょうか? できなかったので、上のようなコードを書きました。なにか、方法があるのでしょうか?
Zuishin

2018/05/08 06:41

.NET のバージョンを上げることはできませんか?
asekichi

2018/05/08 06:51

悲しいかな。できないのです
Zuishin

2018/05/08 07:05

私の提案した方法はアプリケーション単位でアクセラレーションの設定を行うものですが、質問で挙げられたものはウィンドウ単位で行うものです。 アプリケーション単位でできないのなら、すべてのウィンドウ(特にツールチップウィンドウ)に対して行うと良いかもしれません。
asekichi

2018/05/08 07:20

そもそも、この設定はレジストリ値をいじる以外はウィンドウ単位でやるものという認識でした。たまたま、Winodowクラスを継承した共通Windowを使ったている関係で、すべてのWindowに組みこむのはそんなに苦でなかったので、あまり疑っていませんでしたが、アプリケーション単位で設定を変更できる方法があるということなのですね。ちょっと調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問