2010年9月28日火曜日

Dxtory開発者のメモ

blogみたいなもの
Dxtory開発者のメモ的なスレッドかな?
参考になりそうな情報がちらほら。

libpngのビルド方法

libpngを作成してみる。
ここ読めばできる。
強いて言うならビルドの順序はzlib→libpngということくらい。

2010年9月27日月曜日

スクリーンショットを撮る方法まとめ



分散処理と垂直同期について。
連載2 画像転送システム その2
へーい(・・)ノ タクシー
#########################
【C++】 DirectX初心者質問スレ Part26 【C】
http://pc12.2ch.net/test/read.cgi/tech/1256403984/

514 :デフォルトの名無しさん [sage] :2009/12/01(火) 18:09:59
Direct3D9でフルスクリーンモードで描画している際、
自分自身のスクリーンのキャプチャを高速に行うにはどのように実装すればいいでしょうか?

sf = device->GetBackBuffer(0, 0);
HDC srcdc = sf.GetDC();
::BitBlt(dstdc, 0, 0, gameView.Width, gameView.Height, srcdc, 0, 0, SRCCOPY);
//後略

といった形でメインメモリに転送してるのですが、
BitBltの部分でFullHDの場合で0.3秒くらいかかってしまいます。

515 :514 [sage] :2009/12/01(火) 18:20:23
情報が抜けてました。
フルスクリーンモードの描画をキャプチャするのは、キャプチャ画像をファイルとして書き出すためではなく、
描画をGDIに切り替える際の描画キャッシュとして使いたいためです。
フルスクリーンで描画中に一時的に
device->SetDialogBoxMode(TRUE);
を実行してメニューを表示したりダイアログを表示したりしています。

516 :デフォルトの名無しさん [sage] :2009/12/01(火) 18:49:58
サーフェイスをロックしてそのメモリをコピーすればいいよ。
一番いいのはダイアログを使わない事だけど。

517 :デフォルトの名無しさん [sage] :2009/12/01(火) 22:03:18
サーフェスのLockはめちゃくちゃ遅いよ。
シングルコアだとそこまで遅くはないんだが、マルチコアだと致命的な遅さ。
GetDC等も内部的にLockするので駄目。

GetRenderTargetDataが速い。

518 :デフォルトの名無しさん [sage] :2009/12/01(火) 22:35:41
有料な同人ソフト以上のモノを作るなら、GDIでがんばるより
DXUTを使うかDXUTみたいなのを自作するほうが質も速度も断然いいのでは。

519 :デフォルトの名無しさん [sage] :2009/12/01(火) 22:41:15
>>516
ちょっと事情があって、Lock使うのは避けたい……。

>>517
なるほど。確かにビデオカード→システムメモリはボトルネックになりかねないし
画面の描画自体と競合もしてしまうので、
それを避けるためにGetRenderTargetData()でさっさとシステムメモリに転送かけたほうがよさそうです。
この線で試してみることにします。

520 :デフォルトの名無しさん [sage] :2009/12/01(火) 22:57:28
初歩的な質問ですみません
DrawPrimitiveとDrawSubsetを見かけるんですが、これってどんな違いが?

521 :デフォルトの名無しさん [sage] :2009/12/01(火) 22:58:41
>>520
DrawSubmitは内部でDrawPrimitiveIndexだっけ?を使用している

522 :デフォルトの名無しさん [sage] :2009/12/01(火) 23:14:35
>>517
描画前のバックバッファをシステムメモリのサーフェイスにコピーしてロックしたほうが速いだろ?
GetRenderTargetDataなんて鈍足の代表だろ。

523 :デフォルトの名無しさん [sage] :2009/12/01(火) 23:20:39
>>522
バックバッファをシステムメモリに転送するのがGetRenderTargetDataなんだが。
GetFrontBufferDataと間違えてない?

524 :デフォルトの名無しさん [sage] :2009/12/02(水) 00:43:04
GetRenderTargetDataってAA使うと使えなくね?

528 :デフォルトの名無しさん [sage] :2009/12/02(水) 11:28:36
>>517
FullHDでも0.1秒以内にメニューが表示できる状態になることを確認しました。
どうもありがとうございます。

しかし、表示方式を切り替えた瞬間にちらつくのは、なおらんのかなー。
デュアルディスプレイのもう一方のほうもちらついてるからなぁ。
#########################
【C++】 DirectX初心者質問スレ Part6 【C++】
http://pc8.2ch.net/test/read.cgi/tech/1127198808/


589 :デフォルトの名無しさん [] :2005/10/19(水) 23:17:28
スクリーンショットを取るコードを書いていますが、
D3DXSaveSurfaceToFile以外でスクリーンショットを簡単にとる方法ってないですかね。
取り込んだデータを別のウインドウに書き出したり手を加えたりすることも考えて、
メモリ上にデータを置けるといいのですが。
D3DXSaveSurfaceToFileInMemory以外だと助かります。

595 :デフォルトの名無しさん [sage] :2005/10/20(木) 09:06:18
555だけど、まさかあれが荒れる原因になるとは…すまんな

>>589
バックバッファ作成時にD3DPRESENTFLAG_LOCKABLE_BACKBUFFERを指定しておけば、
オフスクリーンメモリ参照し放題だよ。

パフォーマンスの低下が気になるなら、スクリーンショットを取るときだけ仕立て直すか
レンダリングターゲットを変えて強引にいじれるメモリ上へ持ってきてもいいかもね。

597 :デフォルトの名無しさん [] :2005/10/20(木) 15:34:10
>>589
そういう場合はIDirect3DDevice9::GetRenderTargetDataを使う。
#########################
Win32API質問箱 Build36
http://pc8.2ch.net/test/read.cgi/tech/1128951330/

251 :デフォルトの名無しさん [sage] :2005/10/20(木) 14:09:12
マウスカーソルの周辺部分を、拡大して表示するプログラムを作ってみたいと思うのですが、
どういう方法が一番高速なのでしょうか?

あと、マウスカーソル部分一点のRGB値を表示するようなプログラムだったら、
単純にGetPixel()でも問題ないのでしょうか?

252 :251 [sage] :2005/10/20(木) 14:12:39
方法とは、マウスカーソル周辺部分を取得する方法です。

253 :デフォルトの名無しさん [sage] :2005/10/20(木) 14:16:22
>一番高速

あえて回答もらうの否定してるんだろうか

254 :デフォルトの名無しさん [sage] :2005/10/20(木) 14:16:29
>>252
GetDC(NULL) した DC (←画面を参照できる) から、StretchBlt するとイイヨ。

255 :デフォルトの名無しさん [sage] :2005/10/20(木) 15:45:52
座標がわかるんだから、それを元にしてやればいいんじゃないのか。
そんなん高速だなんだってレベルなのか?

…釣りか。

Win32API、DirectXでウィンドウの背景を透過させる方法

Direct3D ウィンドウ背景の透明化
> 一般のウィンドウは背景を透明にすると、背後にあるウィンドウを見たり操作した
> りできます。これと同様に、Direct3D ウィンドウの背景を透明化することは可能で
> しょうか?
> また、どのようにすればよいのでしょうか?

その、「一般のウィンドウの背景を透明にする」方法とはなにですか?
背景を透明にするというのが、非矩形のウィンドウリージョンやLayered Windowを用いた矩形ではないウィンドウを描画することだと勝手に想像して以下書きます。

Direct3DDevice*::Present()がGDIの描画関数と完全に協調して動作するわけではないという理由から、若干の注意は必要ですが、普通はDirect3Dを用いる場合でも両手法はうまく動作します。

以下はその注意点。

・ウィンドウリージョンを指定する場合
Present()は、いわゆるフレームウィンドウに設定されているリージョンでしか
クリッピングを行いません。
つまり、Present先がWS_POPUPスタイルであるウィンドウの、WS_CHILDスタイル
である子孫ウインドウのひとつである場合は、WS_CHILDスタイルで作られた
ウィンドウに設定されているリージョンではクリップされず、WS_POPUPスタイル
である祖先ウィンドウのリージョンでだけクリップされます。
まぁ、WS_CHILDなウィンドウを非矩形にしたいがためにウィンドウリージョンを
指定することはほとんど無いと思うので普通は問題にならないでしょう。

・Layered Windowを用いる場合
SetLayeredWindowAttributes()によってGDIの描画結果をLayered Window用
バッファに迂回させる手法は使えません。Present()はこの迂回対象とならない
です。
Direct3Dでの描画結果をLayered Windowに表示する場合は、
UpdateLayeredWindow()によって行う必要があります。
既存のアプリケーションをLayered Window化するというような目的でもない
かぎり、性能やソースの書きやすさを考えてUpdateLayeredWindow()を
使うと思うので、こちらも普通はもんだいにならないでしょう。
ここで言及されているレイヤードウィンドウについては●Win32API(C言語)編 第60章 ウィンドウの操作①の[○半透明ウィンドウ]項目に載っている。
CreateWindowExの第一引数にWS_EX_LAYEREDを指定して
SetLayeredWindowAttributes(hWnd, 50, 50, LWA_ALPHA);
とでもしてやれば半透明のウィンドウを作ること自体はできるのだが、これだとウィンドウの特定の部分だけを透過させることなどができない。
部分的な透過をするには半通過ウィンドウの作り方講座が参考になる。

素人からのDirectX入門メモ

C/C++の知識はいちお一応あるけど開発経験は皆無、Win32APIもまったく知らないという状態からDirectXに入門するまでのメモ。

開発環境
・Windows 7
・Visual Studio 2010

まずはhttp://s-jis.blogspot.com/2010/09/visual-studio-2010-directx.html
を読んでVisual Studio 2010でDirectXを使用したプログラムをビルドできるように設定する。

次にMicrosoft Windows SDK for Windows 7 and .NET Framework 4をインストール。

設定を終えたらDirectX SDK付属のサンプルをビルドできるか確認する。
例えばDirectX SDK (February 2010)を特に設定を変えずにインストールした場合、サンプルのパスは下記のようになる
C:\Program Files\Microsoft DirectX SDK (February 2010)\Samples\C++\Direct3D\Tutorials\Tut01_CreateDevice\CreateDevice_2008.sln
これをVisual Studio 2010で読み込んで、そのまま実行する。
青い背景のウィンドウが出てきたら成功。

自分でVisual Studio 2010に新規プロジェクトを作成する場合は、[Visual C++]の[Win32]の[Win32 プロジェクト]というテンプレートを選択する。
ここで[Win32 コンソール アプリケーション]を選択してしまうとビルドに失敗する。
テンプレートの選択後に出てくる[アプリケーション ウィザード]では[追加のオプション]の[空のプロジェクト]にチェックを入れてプロジェクト作成。
その後はd3d9.libなどを必要に応じて追加の依存ファイルに登録。

ここまででとりあえずの環境構築は終わり。
次は最低限の知識編。
●Win32API(C言語)編 第1章 Windowsプログラミング版Hello World
●Win32API(C言語)編 第2章 ウィンドウを表示する
この二つのページを熟読して、説明されていることを完璧に理解する。
この知識さえあればとりあえずDirectXに入門することはできる。

次にDirectX ドキュメントをダウンロードする。
2010/09/27における最新の日本語版はDirectX ドキュメント 日本語版 (August 2009) (ZIP、29.6 MB)
そしてダウンロードしたドキュメントを開き、[サンプルとチュートリアル]-[Direct3D 9]-[チュートリアル]-[Direct3D チュートリアル]-[チュートリアル 1]から始める。
対応するソースコードは
C:\Program Files\Microsoft DirectX SDK (February 2010)\Samples\C++\Direct3D\Tutorials\
以下にある。
(DirectX 10や11のチュートリアルは
C:\Program Files\Microsoft DirectX SDK (February 2010)\Samples\C++\Direct3D 10または11\Tutorials\)。
後はソースコードとドキュメントを読んでDirectXの理解を深め、ある程度理解できたら自分が本来やりたかったことについて調べ始めればいい。

DirectX SDKのバージョン間の差異について

DirectX9SDKが入ってるPCでDirectX8プログラミング
DirectX SDKのバージョンダウンのススメ

Win32APIの入門サイト

Win32API(C言語)編

Visual C++ 2010 の C++0x 対応状況チェック

Visual C++ 2010 の C++0x 対応状況チェック

Geekと話していてもつまらない。

Geekと話していてもつまらない。

JunkSeeker

縁-yukari- 第三弾■JunkSeeker
前作も良かったし買う。

茶道娘の落としかた えきすぱーとになりました7

ダウンロード販売がないから入手方法を整えないと。
韓国人が翻訳したらしい
すごいな。

集英社の違法アップロードについての声明に対する外国サイトでの反応

[Discussion] Shueisha asks for the end of scans - MangaHelpers

Visual Studio 2010で作ったアプリケーションを配布するとき

MSVCR100.DLLなどがないと言われるので、[構成プロパティ]-[C/C++]-[コード生成]の[ランタイム ライブラリ]でMTまたはMTdを選択する。

参考
MT /MTd /MD /MDd について
msvcr100.dll問題

MT /MTd /MD /MDd について

Visual C++ ... MD と MT option

Visual Studio 2010 + DirectXの環境構築メモ

VisualC++とDirectX SDKの設定 最新情報