WPFの描画 – プログラミング – Home

通知
すべてクリア

[解決済] WPFの描画

固定ページ 1 / 2

dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

http://d.hatena.ne.jp/NyaRuRu/20070127/p2

このブログで紹介されている方法でメモリを見てみたのですが、
Windows7ではメモリマッピングが見つかりません。

WPFでは直接ここに書き込んでいるそうですが、そのアドレスを調べる関数はありますか?
また、ない場合どのようにして取得するのでしょうか?


引用未解決
トピックタグ
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> Windows7ではメモリマッピングが見つかりません
Windows7には無い。Vistaが無駄にメモリ喰いまくってた因の一つがコイツなので流石に
改善された。
http://blogs.msdn.com/b/e7/archive/2009/04/25/engineering-windows-7-for-graphics-performance.aspx
の「Desktop Graphics - Reduced Memory Footprint」辺りにコレについての記述がある。


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

gakさん、ありがとうございます。
ではWPFはどこに描画しているのでしょうか?


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> ではWPFはどこに描画しているのでしょうか?
先に挙げたサイトに
> We achieved the reduction in system memory by accelerating the common GDI
> operations through the graphics hardware
とある。
「Vista では一度GDIアクセラレーションを全て捨て去ったので(GDIの為に)システムメ
モリ上にイメージを持たざるを得なかったけど、win7 では(重そうな処理に関する)GDI
アクセラレーションを復活( http://d.hatena.ne.jp/NyaRuRu/20090208/p1)させたので
わざわざシステムメモリ上にイメージを持たなくても何とかなった」
と俺は解釈したので、(GDIで無い)WPFはvista以前から直で VRAM に描いてたんじゃ
ね?多分。

# WPFはあんま触った事ないんだわ…


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> (GDIの為に)システムメモリ上にイメージを…
(GDIのソフトウェアレンダリングの為に)システムメモリ上にイメージを…

に修正。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> (重そうな処理に関する)GDIアクセラレーションを復活
重いかどうかよりも「使用頻度高いGDIアクセラレーション」だろうな。多分。
何かぐだぐだだ。


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

gakさん、ありがとうございます。
では、自ウィンドウのVRAMアドレスはどこですか?または、調べる関数はありますか?


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> では、自ウィンドウのVRAMアドレスはどこですか?
それは DWM(Desktop Window Manager) の管轄内で、自ウィンドウの管轄外じゃないか
な。基本関与できないんじゃね?

> または、調べる関数はありますか?
http://msdn.microsoft.com/en-us/library/aa969527.aspx
DWM の api で提供されてなきゃ難しいんじゃないかと。俺は↑をきちんと見てないんで、
求める機能が提供されていないか調べてみたら良いかと。


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

DWMAPIに隠しAPIがあるようです。
NONAMEなのですが、パスはどうやって取得しますか?


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> DWMAPIに隠しAPI
DwmpDxGetWindowSharedSurface() の事?

> NONAMEなのですが、パスはどうやって取得しますか?
NONAMEなので GetProcAddress() に関数名指定できない、って意味?
関数名が判らないなら順序数( http://www.geoffchappell.com/viewer.htm?doc=studies
/windows/win32/dwmapi/api/index.htm)を指定してやれば良いかと。

http://winjade.net/board/index.php?showtopic=6286&st=0&p=85115&#entry85115
これが参考になるんじゃね。実際に俺が試したわけではないんで断言はできないけど。

後、上記サイトでは「このコードじゃ真っ黒なテクスチャしか取れない!」ってなってる
けど、これは DirectX3D9Ex ではなく DirectX3D9 で処理を進めているため、という可能
性もありえる。Aero は DirectX3D9Ex 専用らしい( http://d.hatena.ne.jp/NyaRuRu
/20061017/p3)ので、リソースを共有するなら DirectX3D9Ex でやらなきゃダメだし。
実際にテストしたわけじゃないんでこの視方が合ってるかどうかは知らんけどね。

# 隠しAPIに手を出すレベルとなると、俺の知識ではこの程度のレスが限界…


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

ありがとうございます。
DwmpDxGetWindowSharedSurface() の事ですが、
取得したハンドルの使い方を教えてください。

そのハンドルを何関数に渡せば良いのでしょうか?


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> DwmpDxGetWindowSharedSurface() の事ですが、
> 取得したハンドルの使い方を教えてください。
関数名や先に俺が挙げたサイト等の情報からすると↓が得られてると妄想可。
http://msdn.microsoft.com/en-us/library/bb219800.aspx#Sharing_Resources
# 非公開関数でドキュメントが公開されて無いんだから妄想するしかねー

で、こっから先に行きたければ DirectX3D の知識が必要。適当な解説サイトを見つける
等して地道に理解していくしかないかと。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

今更かもしんないけど、dicsonさんがやりたい最終目的を改めて明示した方が良いと思う。
メモリのアドレスを知る事や非公開APIの使い方を知る事が最終目的では無いよね。多分。

最終目的を明示する事によってもっと手軽にその目的を達する別解が提示される事がある
かもしれない。


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

WPFみたいな描画をSDKで行いたいと考えています。
WPFはDirectXでDWM用のデータ(0xAARRGGBB)を吐くそうです。
GDIを用いない描画システムを考えています。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

一つ言える事は非公開関数に関しては内部の事情で勝手に
仕様が変えられても文句は言え無いので趣味の範疇で使うなら
良いかもしれないけれど、外部に公開するような物に使うのなら
やめた方がいいのではと言う話です。
単純に技術的な興味とか研究的な意味合いなら止めません。

既に書かれているように非公開関数を使うのだったら
トライアンドエラーでやるしかないんじゃないかなぁ。
ある程度は検討がついたとしてもそれが正しいと言う裏付けが
取れませんからねぇ。動いているから多分正しいんだろうとか
そんな話ですよね。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました