http://d.hatena.ne.jp/NyaRuRu/20070127/p2
このブログで紹介されている方法でメモリを見てみたのですが、
Windows7ではメモリマッピングが見つかりません。
WPFでは直接ここに書き込んでいるそうですが、そのアドレスを調べる関数はありますか?
また、ない場合どのようにして取得するのでしょうか?
> 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」辺りにコレについての記述がある。
gakさん、ありがとうございます。
ではWPFはどこに描画しているのでしょうか?
> では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はあんま触った事ないんだわ…
> (GDIの為に)システムメモリ上にイメージを…
(GDIのソフトウェアレンダリングの為に)システムメモリ上にイメージを…
に修正。
> (重そうな処理に関する)GDIアクセラレーションを復活
重いかどうかよりも「使用頻度高いGDIアクセラレーション」だろうな。多分。
何かぐだぐだだ。
gakさん、ありがとうございます。
では、自ウィンドウのVRAMアドレスはどこですか?または、調べる関数はありますか?
> では、自ウィンドウのVRAMアドレスはどこですか?
それは DWM(Desktop Window Manager) の管轄内で、自ウィンドウの管轄外じゃないか
な。基本関与できないんじゃね?
> または、調べる関数はありますか?
http://msdn.microsoft.com/en-us/library/aa969527.aspx
DWM の api で提供されてなきゃ難しいんじゃないかと。俺は↑をきちんと見てないんで、
求める機能が提供されていないか調べてみたら良いかと。
DWMAPIに隠しAPIがあるようです。
NONAMEなのですが、パスはどうやって取得しますか?
> 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に手を出すレベルとなると、俺の知識ではこの程度のレスが限界…
ありがとうございます。
DwmpDxGetWindowSharedSurface() の事ですが、
取得したハンドルの使い方を教えてください。
そのハンドルを何関数に渡せば良いのでしょうか?
> DwmpDxGetWindowSharedSurface() の事ですが、
> 取得したハンドルの使い方を教えてください。
関数名や先に俺が挙げたサイト等の情報からすると↓が得られてると妄想可。
http://msdn.microsoft.com/en-us/library/bb219800.aspx#Sharing_Resources
# 非公開関数でドキュメントが公開されて無いんだから妄想するしかねー
で、こっから先に行きたければ DirectX3D の知識が必要。適当な解説サイトを見つける
等して地道に理解していくしかないかと。
今更かもしんないけど、dicsonさんがやりたい最終目的を改めて明示した方が良いと思う。
メモリのアドレスを知る事や非公開APIの使い方を知る事が最終目的では無いよね。多分。
最終目的を明示する事によってもっと手軽にその目的を達する別解が提示される事がある
かもしれない。
WPFみたいな描画をSDKで行いたいと考えています。
WPFはDirectXでDWM用のデータ(0xAARRGGBB)を吐くそうです。
GDIを用いない描画システムを考えています。
一つ言える事は非公開関数に関しては内部の事情で勝手に
仕様が変えられても文句は言え無いので趣味の範疇で使うなら
良いかもしれないけれど、外部に公開するような物に使うのなら
やめた方がいいのではと言う話です。
単純に技術的な興味とか研究的な意味合いなら止めません。
既に書かれているように非公開関数を使うのだったら
トライアンドエラーでやるしかないんじゃないかなぁ。
ある程度は検討がついたとしてもそれが正しいと言う裏付けが
取れませんからねぇ。動いているから多分正しいんだろうとか
そんな話ですよね。